2014-09-01 2 views
1

Пожалуйста, рассмотрим следующий код:: содержит() не возвращает ожидаемые узлы

// @include  /(^https?:\/\/www\.|^https?:\/\/)google\.com(\.|\/).*/ 
// @include  /(^https?:\/\/www\.|^https?:\/\/)stackoverflow\.com\/.*/ 
// @include  /(^https?:\/\/www\.|^https?:\/\/)userscripts-mirror\.org\/.*/ 
// @include  http://wiki.greasespot.net/* 
// @version  1.0 
// @require  https://code.jquery.com/jquery-2.1.1.min.js 
// @grant  GM_addStyle 


$ ('body:contains("serscripts.org")').each (function() { 

var results = $(this); 
var text = results.text(); 
console.log(text); 
text = text.replace(/serscripts\.org/ig, "serscripts-mirror.org"); 
text = text.replace(/(:8080|%3A8080)/ig, ""); 
    //results.text (text); 

}); 

Я ожидал, что возвращение должно быть только элементы, содержащие эту строку, но результат на консоли весь текст тела.


Рассмотрим this page в строке:

// @updateURL  https://userscripts.org/scripts/so... 

Я хочу, чтобы изменить это.


Или this one:

// @require http://userscripts.org/scripts/source... 

Я хотел бы изменить тоже.


Все слова между тегами следует проверять на строку и возвращать только те, которые у нее есть.

Что такое правильный селектор для этого?


Примечание:
атрибуты ссылок и текста между <a></a> уже изменены с помощью аналогичного .each (function).

+0

Вы выбрали ** '' элементы **, содержащие 'serscripts.org' где-то внутри них. У тебя это есть. – Ryan

+0

Возможно, вы захотите добавить пробел до этой точки с запятой – SeinopSys

+0

взять 'body' из селектора – charlietfl

ответ

2

:contains возвращает именно то, что ожидается. От the spec:

Текст сопоставления может появиться непосредственно в выбранного элемента, в любом из потомков этого элемента или комбинации их.


В общем, для замены, завернуть или выделить термины текста на веб-странице, вы должны работать на индивидуальном TEXT_NODE уровне. Что-нибудь еще риски, громя: URL, идентификаторы, события обработчика и т.д.

Вы можете использовать Tree Walker для этого:

var txtWalker = document.createTreeWalker (
    document.body, 
    NodeFilter.SHOW_TEXT, 
    { acceptNode: function (node) { 
      //-- Skip whitespace-only nodes 
      if (node.nodeValue.trim()) 
       return NodeFilter.FILTER_ACCEPT; 

      return NodeFilter.FILTER_SKIP; 
     } 
    }, 
    false 
); 
var txtNode  = null; 

while (txtNode = txtWalker.nextNode()) { 
    var oldTxt = txtNode.nodeValue; 
    var newTxt = oldTxt.replace (/serscripts\.org/ig, "serscripts-mirror.org"); 
    newTxt  = newTxt.replace (/(:8080|%3A8080)/ig, ""); 

    txtNode.nodeValue = newTxt; 
} 

это будет безопасно заботиться обо всем на странице, кроме HTML атрибуты, как href , src и т.д.

Если вы хотите изменить те, использовать отдельный, целевой .each() код - как вы сказали, что вы делаете, - но не изменить текст между <a></a>, как уже было сделано по дереву ходок.

+1

Спасибо, Брок, это отлично работает. Я удалил обработчик «между тегами» – Comentarist