当与Greasemonkey一起使用时,Jquery appendTo(' body')会进行多次插入

时间:2012-05-12 13:58:19

标签: jquery dom greasemonkey appendto

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

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

my igoogle page


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

2 个答案:

答案 0 :(得分:2)

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

每个iFrame(我怀疑小工具,广告是iFrame)都有自己的整个HTML结构,其中包含<html></html><body></body>标记。当您.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() function来迭代与给定选择器匹配的所有元素 - 在本例中为body

  • 我在这里使用.closest() function来浏览所有父元素,并找到与给定选择器匹配的祖先 - 在本例中为iframe

    < / LI>

答案 1 :(得分:2)

是的,这是因为Greasemonkey将每个frameiframe视为自己的页面(在某种程度上,它是),并作为@include运行, @exclude和/或@match指令表示 (请注意,没有src属性的iframe被视为来自与基页相同的网址。)

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

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


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