我制作了一个使用 jQuery 的 Greasemonkey 脚本appendTo('body')
。
一切正常,但 HTML 还附加到其他 DOM 元素,例如我的 igoogle 页面上的 Google 广告和小工具。
有什么可以解决的吗?我认为这个问题不需要一些示例代码。相反,我上传了一张显示我的问题的图片:
如您所见,我附加的 HTML 出现在许多不同的地方。
我制作了一个使用 jQuery 的 Greasemonkey 脚本appendTo('body')
。
一切正常,但 HTML 还附加到其他 DOM 元素,例如我的 igoogle 页面上的 Google 广告和小工具。
有什么可以解决的吗?我认为这个问题不需要一些示例代码。相反,我上传了一张显示我的问题的图片:
如您所见,我附加的 HTML 出现在许多不同的地方。
您看到 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
。
是的,这是由于 Greasemonkey 将每个frame
和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 的方法。