0

我制作了一个使用 jQuery 的 Greasemonkey 脚本appendTo('body')
一切正常,但 HTML 还附加到其他 DOM 元素,例如我的 igoogle 页面上的 Google 广告和小工具。

有什么可以解决的吗?我认为这个问题不需要一些示例代码。相反,我上传了一张显示我的问题的图片:

我的 igoogle 页面


如您所见,我附加的 HTML 出现在许多不同的地方。

4

2 回答 2

2

您看到 HTML 附加到多个项目的原因很可能是因为您正在处理的标记中存在 iframe。

每个 iFrame(我怀疑小工具、广告都是 iFrame)都有自己的完整 HTML 结构,<html></html>并带有<body></body>标签。当 you 时.appendTo('body'),您的脚本会将内容附加到与'body'选择器匹配的任何元素。

您需要提供比$('body').


除了通用选择器之外,您可能想要做的是尝试使用$('body:first')某种其他独特的选择body器。您可能需要稍微尝试一下,因为您依赖的 HTML 不受您的控制——我假设您希望 GM 脚本在任何页面上运行——因此您受限于该页面的结构。例如,不能保证:first <body>标签是正确的。

如果你问我,一个可靠的方法是遍历所有返回的<body>元素,$('body')并为每个元素查看它是否有一个 Iframe 的父元素。

像这样的东西-

var selectedElement = '';
$('body').each(function(index,elem){
  if ($(elem).closest('iframe').length){
    selectedElement = $(elem);
  }
});

if (selectedElement){
  // appendTo(selectedElement);
}

  • 我正在使用该.each()函数迭代与给定选择器匹配的所有元素 - 在这种情况下 - body

  • 我在这里使用该.closest()函数来浏览所有父元素并找到与给定选择器匹配的祖先 - 在这种情况下 - iframe

于 2012-05-12T14:02:20.037 回答
2

是的,这是由于 Greasemonkey 将每个frameiframe视为自己的页面(在某种程度上,确实如此),并按照@include@exclude和/或@match指令指示的方式运行。
(请注意,没有src属性的 iframe 被认为来自与基本页面相同的 URL。)

要阻止脚本在 iframe 上触发,请将此代码放在脚本顶部附近:

if (window.top != window.self)  //-- Don't run on frames or iframes.
    return;


如果您确实想在某些 iframe 上运行,而不是在其他 iframe 上运行,请尽可能调整@include@exclude和/或@match指令,或链接到目标页面以帮助选择选择性阻止 iframe 的方法。

于 2012-05-12T23:09:31.673 回答