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 страницы позже.
Таким образом, вы можете добавить задержку в ваш сценарий. Но:
Если вы просто хотите выбрать отдельные элементы, вам почти никогда не нужно использовать XPath. использование
querySelectorAll()
или jQuery вместо. Вот основной пример сquerySelectorAll
и без задержки:var allLinks = document.querySelectorAll ("a[action-type='login']"); if (allLinks.length) { // PROCESS NODES AS DESIRED, HERE. }
Вот полный сценарий 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);