Перебирать текстовые узлы внутри div

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

Каждый Div при нажатии, загружает через ajax соответствующий контент. Но тогда мне нужно сделать замену текста внутри любого из текстовых узлов внутри.

Мой текущий код после загрузки содержимого ajax пересекает все текстовые узлы всей страницы и поэтому слишком ресурсоемкий.

Я искал часы, пытаясь выяснить, как обойти петлю через div, и получить текстовые узлы …

и это должно работать в firefox, google chrome и ie6.

Любые мысли или предложения?

Как запрошено, вот код:

function ajaxLoader(url, id) { if (document.getElementById) { var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); } if (x) { x.onreadystatechange = function () { if (x.readyState == 4 && x.status == 200) { el = document.getElementById(id); el.innerHTML = x.responseText; } } x.open("GET", url, true); x.send(null); } // alert(id); CheckTranslate(id); // setTimeout('CheckTranslate(this);', 1000); } function CheckTranslate(id) { // function to get text of a node var content = function (node, txt) { if (txt) { if (node.textContent) { node.textContent = txt; } else if (node.nodeValue) { node.nodeValue = txt; } } else { return node.textContent ? node.textContent : node.nodeValue; } }; // recuse div by id content $("#"+id).each(function() { // assign object handler var obj = $(this).html(); // check how many text nodes there var mylen = obj.length; if (mylen > 0) { // loop thru each text node } }); // recurse ajax content (function (parent) { var childs = parent.childNodes; // if there are children to this if (childs && childs.length) { // loop through each text node for (var i = 0, node; node = childs[i]; i++) { // text node found, do the replacement if (node.nodeType == 3) { // grab value of current text node var value = content(node); // grab class name of current text node var myclass = $(this).attr("class"); // grab data property of this node var ist = $(this).data('translated'); // check if this is correct class and has no data property and value is not undefined if (typeof(value) != 'undefined' && myclass != 'box_title' && ist != 'yes' && (myclass == 'status_bar' || myclass == '' || myclass == 'box_title_small' || myclass == 'status_bar_select')) { // loop thru english array to find matches for (var x = 0; x < en_count; x++) { // get current english phrase var from = en_lang[x]; // get current other language phrase var to = other_lang[x]; if (value.match(from)) { content(node, value.replace(from, to)); if ($.browser.msie == 'false') { $(node).data('translated', 'yes'); } } // end check value match } } } else { arguments.callee(node); } } } })(document.body); } 

Есть 2 функции ajaxLoader, которые загружают содержимое ajax для div, а затем CheckTranslate, который выполняет перевод после загрузки нового контента.

Проблема заключается в том, что функция (родительский) раздел рассматривает все текстовые узлы, где для производительности я бы предпочел только просмотр текстовых узлов внутри div.

Но я просто не понимаю, как обращаться с этими …

Очень сложно это понять, и документация jquery не очень проста в изучении …

Я уверен, что есть лучший способ сделать это, но в простом javascript вы можете просто написать рекурсивную функцию:

 function ReplaceChildText(node, findText, replaceText) { if (node.nodeType == 3) { node.innerHTML = node.innerHTML.replace(findText, replaceText); } else { for (var child in node.childNodes) { ReplaceChildText(child, findText, replaceText); } } } 

Вы можете назвать это следующим образом:

 ReplaceChildText(document.getElementById('divID'),'findText','replacement'); 

Ищете что-то вроде этого?

 $(".your_ajax_div_class").each(function(i){}); 

Возможно, вы могли бы добавить или ajaxComplete() это или что-то подобное в свою ajaxComplete() чтобы активировать загрузку содержимого.

По текстовым узлам вы имеете в виду слова?

Вы можете использовать split для разделения слов на массив:

 var str = $("div").text().split(' '); 

Такой div:

 
red blue green orange

Выпустил бы:

 ["red", "blue", "green", "orange"]