2016-05-27 6 views
1

*** EDIT - 私はクラスを追加しようとしているように見えます(クラスをテストするためにいくつかのCSSを変更しようとしましたが、 tはこれは私がやって書いた関数である私は、私はそれを操作できるように/その親要素内容に基づいてDOM内の要素にクラスを追加します

、テキストに基づいてDOMの要素を見つけ、それにクラスを追加したい)

を何でもしますこの前(私はfunctionを使用してstackoverflowからDOMを歩いて、一致を置き換えるために関数を呼び出す - 実際の文字列の値は現在重要ではない) - 私が変更しているHTMLはDOMです。

私はちょうど真下にこのような言葉でテキストを交換するとき
var MATCH = ['word']; 
var REPLACE = ['other']; 


    function replaceText(textNode) { 
    var badWord = textNode.nodeValue; 
    var replaceWord = ""; 
    badWord.className = "filter"; 

    //Go through and match/replace strings equal to MATCH 
    for (var i=0; i< MATCH.length; i++) { 
     replaceWord = document.getElementsByClassName("filter").innerHTML; 
     replaceWord = replaceWord.replace(new RegExp('\\b' + MATCH[i] + '\\b', 'g'), REPLACE[i]); 
    } 
    textNode.nodeValue = replaceWord; 
} 

は、それは動作します - しかし、私は私が親要素を変更することができるように/ CSSに、

//working version without adding class 
function hide(textNode) { 
    var badWord = textNode.nodeValue; 

    //Go through and match/replace strings equal to MATCH 
    for (var i=0; i< MATCH.length; i++) { 
     badWord = badWord.replace(new RegExp('\\b' + MATCH[i] + '\\b', 'g'), REPLACE[i]); 
    } 
    textNode.nodeValue = badWord; 
} 

機能にアクセスし、クラスから変更したいですstackoverflowのポストから -

walk(document.body); 

function walk(node) { 

    var child, next; 

    switch (node.nodeType) { 
     case ELEMENT: // Element 
     case DOCUMENT: // Document 
     case DOCUMENT_FRAGMENT: // Document fragment 
      child = node.firstChild; 
      while (child) { 
       next = child.nextSibling; 
       walk(child); 
       child = next; 
      } 
      break; 

     case TEXT: // Text node 
      replaceText(node); 
      break; 
    } 
} 
+0

あなたは、仕事 'textNode.className = 'フィルタ' をしようとはしませんのnodeValue、上addClassを使用します;'。複数のクラス 'filter'がある場合は、 'document.getElementsByClassName( 'filter')'を使用してそれらをすべて取得できます。完全な答えを得るには、修正しようとしているHTML、置き換えたい単語、DOM解析関数を使ってstackoverflowのポストにリンクしてください。 – M4tini

+0

@ M4tiniはリンクを追加しました - 私は現在のページを修正しています - これはクロムエクステンション用です – user146303

答えて

1

私はあなたのreplaceText()機能を変更してこのページにそれをテスト。テキストを置換し、置換されたテキストを持つノード上にフィルタークラスを追加します。このソリューションでは、IE9以前ではサポートされていないclassList.add('filter')が使用されていますが、このコードはChrome拡張機能のため問題ありません。

function replaceText(textNode) { 
    var nodeValue = textNode.nodeValue; 
    for (var i=0; i < MATCH.length; i++) { 
     if(-1 != nodeValue.indexOf(MATCH[i])) { 
      nodeValue = nodeValue.replace(new RegExp(MATCH[i], 'g'), REPLACE[i]); 
      textNode.parentNode.classList.add('filter'); 
     } 
    } 
    textNode.nodeValue = nodeValue; 
} 
+0

FYI - 'walk()'関数の大文字と小文字の値を変更する必要がありました。例えば 'DOCUMENT_FRAGMENT' 'Node.DOCUMENT_FRAGMENT_NODE'に設定します。 – M4tini

関連する問題