3

私はweibo.comのGreasemonkeyスクリプトに取り組んでいます。XHTMLページでXPathを使用して要素を選択できません。

このコードは、必要な要素を取得できません。

function resolver(prefix) {
    return prefix === 'x' ? 'http://www.w3.org/1999/xhtml' : null;
}
var allLinks, thisLink;
allLinks = document.evaluate(
  "//x:a[@href]", 
  document, 
  resolver, 
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 
  null 
);

<a>サイドバーの要素のみが選択され、残りはまだそこにあります。こちら、weibo.com、ターゲットページを参照してください。 

属性を持つすべての要素を選択する方法はありますaction-type="login"か?

使用"//x:a[@action-type='login']"しましたが、動作しませんでした。

4

1 に答える 1

5

問題は、これらすべてのノードがページに追加される前にスクリプトが実行されていることです。これらは、後でページのAJAXによって追加されます。

したがって、スクリプトに時間遅延を追加することができます。だが:

  1. 選択した要素を取得したいだけの場合は、XPathを使用する必要はほとんどありません。querySelectorAll() 代わりにまたはjQueryを使用してください。querySelectorAll時間遅延のない基本的な例を次に示します。

    var allLinks = document.querySelectorAll ("a[action-type='login']");
    if (allLinks.length) {
        // PROCESS NODES AS DESIRED, HERE.
    }
    


  2. これが完全なGreasemonkeyスクリプトで、jQueryとwaitForKeyElements()ユーティリティを使用して遅延コンテンツの問題を処理します。

    // ==UserScript==
    // @name        _Weibo, hilite login links
    // @include     http://s.weibo.com/weibo/*
    // @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/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.
    */
    
    function processLoginLinks (jNode) {
        //***** YOUR CODE HERE *****
        jNode.css ("background", "lime");
    }
    
    waitForKeyElements ("a[action-type='login']", processLoginLinks);
    
于 2012-10-25T08:15:08.887 に答える