Используя Jquery для анализа html веб-страницы, измените его, а затем снова вставьте в веб-страницу - PullRequest
3 голосов
/ 27 августа 2010

В настоящее время я пытаюсь добавить теги к определенным словам на веб-странице.Эта веб-страница может иметь много разных идентификаторов, классов и имен, поэтому важно, чтобы, если я пытаюсь поместить диапазон вокруг «foo», я делаю следующее:

<p class='foo'>blah blah blah foo blah blah blah </p>

меняется на

<p class='foo'>blah blah blah <span class='bar'> foo </span> blah blah blah </p>

, а не

<p class='<span class='bar'> foo </span>'>blah blah blah <span class='bar'> foo </span> blah blah blah </p>

Я занимаюсь разбором сайта, используя следующий код:

var obj = $(this.innerHTML);  //in my selector which selects the part of the website I want to apply the span to

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

Если я посмотрю на obj [1], свойство innerHTML будет выглядеть так:

<h4 id="3423df" class="pzCMD">blah blah foo blah </h4>

Понятия не имеюкак изменить этот элемент (если возможно) или добавить новые узлы к нему.Я могу извлечь "текст", посмотрев на textContent

obj[1].textContent = blah blah foo blah

, но я не уверен, как бы я изменил html-код этого элемента на

<h4 id="3423df" class="pzCMD">blah blah <span class='bar' foo <span> blah </h4>

Спасибо залюбая помощь, извините за долгое объяснение.

Ответы [ 4 ]

1 голос
/ 27 августа 2010

jQuery.add () позволяет добавлять элементы dom на лету, но возможен также переход на прямой Jscript:

 var obj = $(this.innerHTML); 
 obj[1].innerHTML = obj[1].innerHTML+'blah hi</span>';
 //<h4 id="3423df" class="pzCMD">blah blah <span class='bar' foo <span> blah blah hi  </span> </h4>
0 голосов
/ 30 августа 2010

Я пытался сделать это неправильно. Вот решение, которое я создал, и, кажется, отлично работает. Он использует две рекурсивные функции + обход DOM + регулярные выражения для создания правильных узлов текста и span.

function replaceText(element, pattern, syn_text) {

for (var childi = 0; childi < element.childNodes.length;childi++) {
    var child= element2.childNodes[childi];
    if (child.nodeType==1 && child.className!=syn_text){ //make sure we don't call function on newly created node
        replaceText(child, pattern, syn_text);  //call function on child
    }
    else if (child.nodeType==3){ //this is a text node, being processing with our regular expression
        var str = child.data;
        str = str.replace(pattern,function(s, p1,p2,p3) {
            var parentNode = child.parentNode;
            do_replace(s, p1,p2,p3,parentNode,pattern,syn_text);
            parentNode.removeChild(child);  //delete old child from parent node.  we've replaced it with new nodes at this point
         });
    }
}}




function do_replace(s, p1,p2,p3,parentNode,pattern,syn_text) {
   if(p1.length>0){   //this might not be necessary
     //create textnode
      var text_node = document.createTextNode(p1);
      parentNode.appendChild(text_node);
   }
   if(p2.length > 0){ //create a span + next_node for the highlighting code
      spanTag = document.createElement("span");
      spanTag.id = "SString" + id++;
      spanTag.className = syn_text;
      spanTag.innerHTML = p2;
      parentNode.appendChild(spanTag);
   }
   if(p3.length > 0){
       //test to see if p3 contains another instance of our string.

      if(pattern.test(p3)){  //if there is a instance of our text string in the third part of the string, call function again
          p3.replace(pattern,function(s, p1,p2,p3) {
            //debugger;
            do_replace(s, p1,p2,p3,parentNode,pattern);
            return;
          });
      }
      else{  //otherwise, it's just a plain textnode, so just reinsert it.
          var text_nodep3 = document.createTextNode(p3);
          parentNode.appendChild(text_nodep3);
          return;
      }
    }
    else{ //does this do anything?
        return;
     }
return}

Эта функция вызывается следующим образом:

syn_highlight = "highlight_me";  //class to signify highlighting 
pattern = new RegExp('([\\w\\W]*?)\\b('+ searchTerm + '[\\w]*)\\b([\\w\\W]*)',"ig");
replaceText($('#BodyContent')[0],pattern,syn_highlight);
0 голосов
/ 28 августа 2010

Теперь он поддерживает разные div! извините за задержку, и извините за не использование foreach !!! я просто не могу приспособиться к этому :)

var classesIWant = ["foo", "foo1", "foo2"];
var allDivsInTheWorld = jQuery("div");

for( var i = 0; i < allDivsInTheWorld.length; i++) {
    var element = allDivsInTheWorld[i];
    var good = false;    

    for (var j = 0; j < classesIWant.length; j++){
        if ( $(element).hasClass(classesIWant[j]) )
            good = true;
    }

    if ( !good )
        continue;

    var text = $(element).text();
    var index = text.indexOf("foo");

    if ( index != -1 ){
        var elem = '<span class="bar">' + "foo!!!" + '</span>';
        text = text.replace("foo", elem);
        $(element).text(text);
    }
}
0 голосов
/ 27 августа 2010

Возможно, я не понял, но я все равно дам вам объяснение.Скажите, подходит ли вам это: идея состоит в том, чтобы получить все div с классом foo и текстом foo, убрать этот текст и заменить его на span с другим классом.поэтому

<div class="foo">some ttext nmot changed except the foo part</div>

будет изменено на:

<div class="foo">some ttext nmot changed except the <span class="bar">foo</span> part</div>

вот код:

var allFoosInTheWorld = $("div.foo");

for (var i = 0; i < allFoosInTheWorld.length; i++ ){
    var text = $(allFoosInTheWorld[i]).text();
    var index = text.indexOf("foo");

    if ( index != -1 ){
        var elem = '<span class="bar">' + "foo!!!" + '</span>';
        text = text.replace("foo", elem);
        $(allFoosInTheWorld[i]).text(text);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...