【问题标题】:Modify new elements when they are added添加新元素时修改它们
【发布时间】:2014-04-27 09:20:12
【问题描述】:

这是由我的用户脚本在页面加载时完成的:

$('a.people').each(function (index, value) {
     $('<i>'+$(value).text()+'</i>').insertBefore(value);
});

用户脚本所针对的网络应用程序,在用户执行各种操作时添加新的$('a.people') 元素。

如何为新添加的元素运行我的代码?将新元素添加到 DOM 时是否会触发事件?

我不想使用setInterval,因为代码在不需要时会循环并影响性能。

【问题讨论】:

  • 你打算如何添加元素?
  • 您需要找到要附加到的事件或运行 setInterval
  • @zuck 您可以使用setInterval() 或为此使用任何事件处理程序。
  • 您需要哪些浏览器才能使用它?

标签: javascript jquery userscripts


【解决方案1】:

如果您想在目标页面添加新元素时对其进行操作,您有两种选择:

(请注意,旧的 Mutation 事件已被弃用,并且与突变观察者不同。)

此外,您需要跟踪哪些节点已完成,并避免重复修改它们。有一个实用程序:waitForKeyElements。它使用轮询并处理所有开销。您不会注意到页面速度变慢。

完整的用户脚本,适用于 Greasemonkey 或 Tampermonkey,使用 waitForKeyElements 替换您的问题代码:

// ==UserScript==
// @name     _Italicize People entries
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

waitForKeyElements ("a.people", italicizePeople);

function italicizePeople (jNode) {
    $('<i>' + jNode.text() + '</i>').insertBefore (jNode);
}

【讨论】:

  • 非常感谢布洛克!这正是我试图实现的,但我无法让我的 MutationObserver 监听子元素。
【解决方案2】:

动态添加元素需要使用jquery on()

【讨论】:

  • 呃,我没有正确理解你的问题。您可以将代码包装在函数中的循环中,并在每次添加新元素时调用它
猜你喜欢
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多