1

シナリオ: BBCのライブスポーツレポートでTwitterのコメント(クラス「class-TWEET」のリスト要素で示される)を非表示にするGreasemonkeyスクリプトを作成します。

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を初めて使用するので、ハウスキーピング機能が古風で最適ではないことを認識しています。よりクリーンで完全に機能する実装のための助けをいただければ幸いです。

4

1 に答える 1

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また、フレーク状の副作用を引き起こす可能性があるため、 使用しないでください。

于 2013-03-27T00:47:25.530 に答える