XPath в скрипте Greasemonkey не выбирает правильные узлы на странице XHTML

Я работаю над скриптом Greasemonkey для weibo.com. Я не могу выбрать элементы, используя XPath на странице XHTML.

Этот код не может захватить элементы, которые я хочу:

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']", но это не сработало.

1 ответ

Решение

Проблема в том, что скрипт выполняется до того, как все эти узлы добавлены на страницу. Они добавляются 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);
    
Другие вопросы по тегам