Jquery appendTo(';body';)在与Greasemonkey一起使用时会进行多个插入

Jquery appendTo(';body';)在与Greasemonkey一起使用时会进行多个插入,jquery,dom,greasemonkey,appendto,Jquery,Dom,Greasemonkey,Appendto,我制作了一个Greasemonkey脚本,它使用jQueryappendTo('body') 一切正常,但HTML也被附加到其他DOM元素中,比如我的igoogle页面上的Google广告和小工具 有什么办法可以解决这个问题吗?我不认为这个问题需要一些示例代码。相反,我上传了一张图片,显示了我的问题: 正如您所看到的,我附加的HTML显示在许多不同的地方 您看到HTML附加到多个项的原因很可能是因为您正在处理的标记中存在iframe 每个iFrame(我怀疑小工具、广告都是iFrame)都有

我制作了一个Greasemonkey脚本,它使用jQuery
appendTo('body')

一切正常,但HTML也被附加到其他DOM元素中,比如我的igoogle页面上的Google广告和小工具

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



正如您所看到的,我附加的HTML显示在许多不同的地方

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

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

您需要提供一个比
$('body')
更独特的选择器


除了通用的
body
选择器之外,您可能需要尝试使用
$('body:first')
某种其他唯一的选择器。您可能需要稍微处理一下这个问题,因为您依赖于不在您控制范围内的HTML—我假设您希望您的GM脚本在任何页面上运行—因此您仅限于该页面的结构。例如,不能保证
:first
标记是正确的

如果你问我,一个可靠的方法是迭代
$('body')
返回的所有
元素,并查看每个元素是否有一个作为Iframe的父元素

类似这样的事情-

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

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

  • 我正在使用来迭代与给定选择器匹配的所有元素—在本例中为body

  • 我使用here浏览所有父元素,并找到与给定选择器匹配的祖先-在本例中为
    iframe


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

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

您需要提供一个比
$('body')
更独特的选择器


除了通用的
body
选择器之外,您可能需要尝试使用
$('body:first')
某种其他唯一的选择器。您可能需要稍微处理一下这个问题,因为您依赖于不在您控制范围内的HTML—我假设您希望您的GM脚本在任何页面上运行—因此您仅限于该页面的结构。例如,不能保证
:first
标记是正确的

如果你问我,一个可靠的方法是迭代
$('body')
返回的所有
元素,并查看每个元素是否有一个作为Iframe的父元素

类似这样的事情-

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

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

  • 我正在使用来迭代与给定选择器匹配的所有元素—在本例中为body

  • 我使用here浏览所有父元素,并找到与给定选择器匹配的祖先-在本例中为
    iframe


是的,这是由于Greasemonkey将每个
iframe
视为自己的页面(从某种意义上说,它是),并按照
@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。

是,这是因为Greasemonkey将每个
iframe
视为自己的页面(从某种意义上说,它是),并按照
@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的方法。

我应该需要类似appendTo父体的东西或类似的东西:-/尝试类似于
appendTo($('body')[0])
我应该需要类似appendTo父体的东西或类似的东西:-/尝试类似于
appendTo($('body')[0]的东西)
是的,谢谢,我知道,但我怎么做?哪种选择器比$('body')更独特,并且存在于所有页面中?$('body:first')无法解决此问题。有我可以尝试的选择器列表吗?或者我必须选择不在iframe中的身体。再次感谢!我已经尝试了您的方法,但是$(elem).最近('iframe')。长度始终返回0,因此selectedElement无法使用正确的正文标记填充。您对原因的假设是正确的;您可以删除免责声明。独奏曲