我制作了一个使用jQuery appendTo('body')
的Greasemonkey脚本
一切都运行正常,但HTML也会附加到我的igoogle页面上的其他DOM元素,如Google广告和小工具。
有什么可以解决的吗?我不认为这个问题需要一些示例代码。相反,我上传的照片显示了我的问题:
如您所见,我的附加HTML显示在许多不同的地方。
答案 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
。
答案 1 :(得分:2)
是的,这是因为Greasemonkey将每个frame
和iframe
视为自己的页面(在某种程度上,它是),并作为@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。