使用 jQuery(或纯 JS)添加新的 DOM 元素

Posted

技术标签:

【中文标题】使用 jQuery(或纯 JS)添加新的 DOM 元素【英文标题】:Hook onto the adding of new DOM elements with jQuery (or plain JS) 【发布时间】:2010-10-27 23:56:22 【问题描述】:

明确一点:我不是在问如何将现有的钩子放到新的 DOM 元素上。我知道 live() 函数和旧的 livequery 插件。我在问别的问题。

我想知道的是如何挂钩新 DOM 元素的创建。我问的原因是我正在创建一个无法控制第一方脚本的第三方用户 JS 脚本。这些第一方脚本(经过混淆处理)通过添加新的 DOM 元素定期更新页面。我想在添加这些元素后执行代码。

使用 $( '...' ).bind( 'ajaxSuccess', function() .....) 适用于一些添加,但不是全部。

【问题讨论】:

【参考方案1】:

如果它们总是通过 document.createElement 方法添加,您可以简单地替换它并在那里进行跟踪。

document.replacedCreateElement = document.createElement;
document.createElement = function(tagName) 
    this.replacedCreateElement(tagName);
    //do your tracking  

【讨论】:

有趣!我不知道我们可以像这样对核心函数进行别名/覆盖。 这正是 livequery 所做的。 当我尝试这个时,浏览器的 CPU 使用率猛增。我想这是太多的 DOM 蜘蛛。【参考方案2】:

我不知道你为什么问你是否知道livequery。 Livequery 将允许您连接到任意新的 DOM 元素。除此之外,我唯一知道要做的就是挂钩 DOM 方法(例如 appendChild 等...)

集成到 jQuery 中的 live() 函数实际上并不是完整的 livequery 实现。 (Resig 认为在不增加代码大小的情况下集成太多功能)

在live()中,缺少的是以下类型函数:

$('*').livequery(function() 
 // do something
);

使用它,它应该会捕获任何添加。

【讨论】:

你能扩展一下吗?是否有超越新的 1.3 live() 功能的 livequery 功能? live() 还不允许任意选择器。这是主要的限制。还有一些生命周期问题;它们都在 jquery 1.3 发行说明中。 是的,正是我的意思,我更新了使用 live 作为函数的示例。 对自己翻白眼这是漫长的一天。【参考方案3】:

好吧,我选择了这对,它似乎会在 20 秒或更短的时间内触发所需的 DOM 更新:

$( '#someid' ).bind( 'ajaxSuccess', function()  ...  );
$( '#someid' ).ajaxSuccess( function( e, r, s )  ...  );

我宁愿不必依赖 livequery 来减慢页面加载速度,并且替换的CreateElement 解决方案会破坏 CPU。

【讨论】:

以上是关于使用 jQuery(或纯 JS)添加新的 DOM 元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 或纯 javascript 更改/替换 flash 对象?

如何使用 jQuery 或纯 JavaScript 获取 URL 参数?

JS或者jQuery怎么给动态添加的DOM元素绑定事件

jquery获取不到动态加载的dom元素是一种啥样的体验

jquery ajax - 更好地返回 json 或纯 html

使用 jQuery 或纯 Javascript 访问一组 HTML 输入文本框