用户脚本隐藏跨域iframe的子节点

时间:2014-07-08 13:41:31

标签: jquery tampermonkey

我想用(Tampermonkey)用户脚本隐藏一些内容的评论。作为一个例子,我试图应用一个脚本

// ==UserScript==
// @name       Hide CNN
// @match      http://www.cnn.com/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant       GM_addStyle
// @run-at document-end
// ==/UserScript==

$('div.post-body:contains("Abbas")').hide()

到页面http://www.cnn.com/2014/07/08/world/meast/mideast-tensions/index.html?hpt=hp_t1,其中包含以下帖子代码

<div class="post-body">
 <header>
 ...
 </header>
 <div class="post-body-inner">
 <div class="post-message-container" data-role="message-container">
 <div class="publisher-anchor-color" data-role="message-content">
 <div class="post-message " data-role="message" dir="auto">
 <p>Abbas is nothing but puppet dog of Western savages and Nazis who want to enslave entire world.</p>
 </div>
 ...
</div>

但剧本似乎没有做任何事情。我究竟做错了什么?是否可以使用用户脚本过滤网页的动态加载部分?

UPD:问题是评论是从另一个域加载到iframe中的。如何使用Tampermonkey隐藏此类iframe的子节点?我需要以某种方式使用GM_xmlhttpRequest吗?

1 个答案:

答案 0 :(得分:1)

Disqus - 动态评论通常会在&lt; iframe&gt;中加载。因此,不是将脚本设置为在主网站上运行,而是将其设置为在iframe src网址上运行。在这种情况下,http://disqus.com/embed/comments/...

此外,这些评论是由AJAX驱动的。因此,您必须使用AJAX savvy techniques

这样的脚本应该可以工作(选择器可能需要调整):

// ==UserScript==
// @name     Hide select CNN comments
// @match    http://disqus.com/embed/comments/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//--- Only run on comments for CNN pages
if (/&f=cnn&/i.test (location.search) ) {
    waitForKeyElements ('li.post:contains("Abbas")', hideComment);
}

function hideComment (jNode) {
    jNode.hide ();
}