1

Я пытаюсь заменить слова на google chrome, но столкнулся с проблемой. Я могу успешно заменить определенные слова, но он убивает связанные html-ссылки.Заменить текст, но сохранить ссылки в сценариях контента для расширения google chrome

Как сохранить ссылки в реальном времени и по-прежнему заменить текст?

Это код в моем сценарии контента расширения хрома:

wordDict = {"the":"piano","and":"Hello", "a":"huh?"}; 

for (word in wordDict) { 
    document.body.innerHTML = document.body.innerHTML.replace(
     new RegExp('\\b' + word + '\\b',"gi"), wordDict[word] 
    ); 
}; 
+1

Как об использовании innerText вместо innerHTML? –

+0

Просто прогуливаясь по дереву DOM. Вместо того, чтобы заменить заменяемое мозгом простое регулярное выражение, посмотрите на '.innerText'member каждого узла в дереве и замените текст в _there_. (а) он не коснется целевых ссылок, (б) он не заставит всех слушателей событий быть отброшенными. – enhzflep

+0

Если вы можете использовать jQuery .. '$ ('a'). Text (« Anything »);' вы также можете запустить 'jQuery.each()' iterator – miguelmpn

ответ

1

Хорошо! Через 2 недели я наконец решил проблему. То, что игнорировалось, было дочерними блоками внутри DOM. Код, который я использую ниже, эффективно обрабатывает дочерние элементы и поддерживает исходный внешний вид скрипта!

function replaceText(jsonArr) { 
$("body *").textFinder(function() { 
    for (var key in jsonArr) { 
     var matcher = new RegExp('\\b' + key + '\\b', "gi"); 
     this.data = this.data.replace(matcher, jsonArr[key]); 
    } 
}); 
} 

// jQuery plugin to find and replace text 
jQuery.fn.textFinder = function(fn) { 
this.contents().each(scan); 
// callback function to scan through the child nodes recursively 
function scan() { 
    var node = this.nodeName.toLowerCase(); 
    if(node === '#text') { 
     fn.call(this); 
    } else if(this.nodeType === 1 && this.childNodes && this.childNodes[0] && node !== 'script' && node !== 'textarea') { 
     $(this).contents().each(scan); 
    } 
} 
return this; 
}; 
1

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

for(var i = 0, l=document.links.length; i<l; i++) { 
    if(document.links[i].innerText == "Word"){ 
    document.links[i].innerText = "Other Word"; 
    } 
} 

С этим вы можете избежать регулярного выражения, но вам все равно придется зацикливать ваш объект слов.

В другой руке, поскольку вы сказали, что у вас загружено jQuery, это решение jQuery делает то, что вы намеревались, оно просматривает все теги для слов и заменяет их.

jQuery.each(wordDict , function(key, value) { 
    jQuery("a").each(function(){ 
    if(jQuery(this).text().match(key)) jQuery(this).text(value); 
    }); 
}); 

Первый JQuery каждые петли объект строки, а второй каждый петлю через всю бирку на странице, если есть совпадение, что изменяет текст элемента по значению на объекте.

+0

Не говорите свой ответ как будто вы просто вставляете фрагмент кода и не уверены, что он работает. Это не делает его хорошим, даже если он работает и не помогает другим. Объясните проблему и покажите ответ, который, по вашему мнению, работает (и объясните, почему) - если это не так, кто-то скажет вам в комментариях. – Xan

+0

Я тестировал оба, не означает, что он сработает для него. Как видите, я старался изо всех сил понять и помочь ему, может быть, эти слова были не самыми лучшими («Это работает для вас?»), Но я просто пытался получить отзывы о моем подходе. – miguelmpn

+0

Я не вижу проблемы в запросе, но это буквально единственный текст, который сопровождает ваш ответ. Если бы вы могли реструктурировать его как «(короткое объяснение) (код) Помогает ли это?» это был бы гораздо лучший ответ. – Xan

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

  • Нет связанных вопросов^_^