2015-05-02 2 views
0

Я пытался найти слово и добавить к нему промежуток, чтобы придать ему стиль и функциональность, и я нашел способ сделать это это, но это не очень эффективно.Найдите слово на веб-странице и добавьте к нему пробел

У меня есть сценарий содержимого, который ищет слово searching, а затем я заменяю innerHTML дополнительным интервалом для ключевого слова.

Это мой JS файл:

function getText(){ 
return document.body.innerText 
} 
if(getText().indexOf("searching") > -1) { 
    document.body.innerHTML = document.body.innerHTML.replace(new RegExp("searching", "g"),"<span class='spanDetected' id='spanDetected'>"+ 
    'searching'+"</span>"); 
    console.log("true"); 
} 

И это то, что результат:

Так что, кажется, работает на каком-то уровне, но тогда возникает проблема, что он также изменяет URLS и текстовые ящики, например:

Что такое лучший способ стилизации и добавления функциональности к слову?

+2

У этого вопроса могут быть ответы на ваши вопросы: http://stackoverflow.com/questions/4489119/jquery-javascript-search-dom-for-text-and-insert-html –

+0

Не указывайте одинаковый идентификатор 'каждому добавляемому тегу. Это не правильный html. – Teepeemm

ответ

1

Использование регулярных выражений для синтаксического анализа [X] HTML - это terrible idea. Представьте себе следующий HTML:

<div id="searching">A searching inspection</div> 

Ваша программа заменит оба экземпляра фразы 'searching', которая не то, что вы хотите. Вам нужно проанализировать страницу и разумно заменить узлы. Возможно, игнорировать гиперссылки или использовать наложение DIV для гиперссылки узлов

У вас есть два варианта:

  1. траверс через все узлы рекурсивно.

  2. Используйте XPath, чтобы выбрать узлы, которые содержат определенный текст.

Нечто подобное может предоставить вам все узлы, содержащие фразу 'searching'.

//text()[contains(., 'searching')] 

Затем вы можете пройти через все узлы и заменить тот, который вы хотите. Поскольку вы разрабатываете расширение Chrome вы можете использовать $x, чтобы получить массив узлов, удовлетворяющих условиям XPath:

$x("//text()[contains(., 'searching')]") 

Читайте this answer, чтобы узнать, как вы можете цикл по элементам массива.

+0

Ну, моя конечная цель - найти более 10 000 слов в кратчайшие сроки, поэтому я не уверен, какой метод был бы наиболее эффективным. – Katie

+0

Регулярное выражение быстрее, но это НЕ работает * независимо от того, как трудно попробовать. X [HTML] - это не тот текст, к которому вы можете обратиться с регулярным выражением для этих видов разбора. – bman

+0

Спасибо за редактирование. Я никогда не использовал xpath, поэтому как бы реализовать его во внутреннем пространстве 'innerHTML', чтобы увидеть, содержит ли оно слово? – Katie

Смежные вопросы