Следующий код проверяет, имеет ли выбранный тег дочерние узлы. Если присутствует дочерний узел, он будет проходить до тех пор, пока не будет найден дочерний узел. Когда новых дочерних узлов не обнаружено, они контуров замыкаются, то есть достигает текстового узла, что приводит к завершению цикла. Функция выполняется рекурсивной для запуска до тех пор, пока не будет найден дочерний узел. Код работает в соответствии с приведенной выше информацией, но когда я пытаюсь сопоставить TEXT_NODE (console.log()
выводит весь текстовый узел), replace()
используется для идентификации номеров телефонов с использованием регулярных выражений и замены гиперссылкой. Число констатировано и заключен с гиперссылкой, но она будет отображаться в два раза, т.е. номер прилагается гиперссылкой и только number.Following это кодВыделите номер телефона и оберните тегом javascript
function DOMwalker(obj){
var regex = /\+\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/g;
var y = "<a href=\"javascript:void(0);\">$&</a>";
if(obj.hasChildNodes()){
var child = obj.firstChild;
while(child){
if(child.nodeType!==3)
{
DOMwalker(child);
}
if (child.nodeType=== 3) {
var text = child.nodeValue;
console.log(typeof text);
var regs = regex.exec(text);
match = text.replace(regex,y);
if(match){
var item = document.createElement('a');
item.setAttribute('href','javascript:void(0);');
var detect = document.createTextNode(match);
var x=item.appendChild(detect);
console.log(x);
child.parentNode.insertBefore(x,child);
}
}
child=child.nextSibling;
}
}
};
$(window).load(function(){
var tag = document.querySelector(".gcdMainDiv div.contentDiv");
DOMwalker(tag);
});
Ниже приведен скриншот выхода:
Здесь число печатается дважды вместо одного с гиперссылкой, которая была изображена (ожидается выделенный номер с гиперссылкой) и второй widout теги
Ниже приведен console.log
из x
Я уже прошел через this.
Предлагаемое решение below хорошо работает с FF. Проблема возникает при использовании в IE11. Он выбрасывает Unknown runtime error
и ссылается на .innerHTML
. Я использовал appenChild(), но ошибка не была решена.
Возможно, вы просто скопировали и наклеили код неправильно, но похоже, что у вас бесконечный цикл в вашем блоке. Если конец while заканчивается после 'child = child.nextSibling'? – hotforfeature
Можете ли вы предоставить несколько примеров телефонных номеров, которые вы ожидаете, но не сработали? – talemyn
@abmitchell: исправлено это ... забудьте закончить главный 'if' loop =] – logan