页面刷新后Greasemonkey快照已过时?

时间:2013-03-26 22:52:12

标签: javascript jquery greasemonkey

场景:编写一个Greasemonkey脚本,用于在BBC直播体育报道中隐藏Twitter评论(由列表元素用“class-TWEET”类表示)。

我设法使用waitForKeyElements获得大致有效的内容(下面的警告):

// ==UserScript==
// @name        myName
// @namespace   none
// @description myDescription
// @include     http://www.bbc.co.uk/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @version     2.0
// @grant       none
// ==/UserScript==

function doHousekeeping(jNode) {

//Find all tweet items within the commentary, and hide them
var snapResults = document.evaluate(".//div[@id='live-event-text-commentary']/ol/li[contains(@class,'class-TWEET')]", document.body, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
      snapResults.snapshotItem(i).style.display="none"; 
  }
}

// Cleanup on initial load
doHousekeeping();

// Repeat cleanup whenever the main body changes
waitForKeyElements ("#live-event-text-commentary", doHousekeeping);

问题:当页面刷新时,doHousekeeping 执行执行(并隐藏大多数的违规项目);但是,最新的一些违规项目仍然位于页面顶部。

为什么没有隐藏所有这些?我的怀疑是,当身体发生变化时,文档/快照在某种程度上不会被刷新。另外我是jQuery的新手,所以我知道我的家务功能既老了又不是最佳的;任何有关更清洁,功能齐全的实施的帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题似乎是您想隐藏的内容与waitForKeyElements的选择器之间存在不匹配。

在这种情况下使用waitForKeyElements的正确方法如下:

// ==UserScript==
// @name        myName
// @namespace   none
// @description myDescription
// @include     http://www.bbc.co.uk/*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @version     2.0
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

//-- Find all tweet items within the commentary, and hide them.
waitForKeyElements (
    "#live-event-text-commentary ol li.class-TWEET",
    doHousekeeping
);

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


另外,请勿使用@grant none,因为这会导致片状副作用。