0

除算とクラスのリストを指定して、それらの内部でテキストの置換を行う関数を作成しようとしています。

Firefox Dom がテキスト ノードを異なる方法で処理する方法を知ったので、javascript を使用して、nextSibling の兄弟である要素をループ処理する必要があることを読みました。

私のスクリプトの最後の障害は、クラス名を取得することです。どのコンテンツのテキストが置き換えられるかをフィルタリングできるように、クラス名が必要です。

すべての回答を確認し、職場の Ryan という同僚の助けを借りて、これを jquery でやり直しました。

        $(divid).find(".status_bar").each( function() {
        var value = $.trim($(this).text());
        // if value is not defined thru browser bugs do not replace
        if (typeof(value) != 'undefined') {
            // it is a text node. do magic.
            for (var x = en_count; x > 0; x--) {
                // get current english phrase
                var from = en_lang[x];
                // get current other language phrase
                var to = other_lang[x];
                if (value == from) {
                    console.log('Current Value ['+value+'] English ['+from+'] Translation ['+to+']');
                    value = to;
                    $(this).attr('value', to);
                }
            }
        }
    });

これは現在、テキストの置換を除くすべての領域で機能します。

私がもともとこれをjQueryで行っていた理由は、要素をループして、firefoxとテキストノードの問題を回避できるかどうか確信が持てなかったためです。

div 内のすべての要素のループを実行していますが、ループしている要素のクラス名を取得する必要があります。

次に、現在の要素のクラスが 1 かどうかを確認できます。何かを行う必要があります...

 // var children = parent.childNodes, child;
    var parentNode = divid;

    // start loop thru child nodes
    for(var node=parentNode.firstChild;node!=null;node=node.nextSibling){

    var myclass = (node.className ? node.className.baseVal : node.getAttribute('class'));

    }

しかし、クラス名を取得するためのこのコードは、null 値のみを取得します。

助言がありますか?

全体の要点を理解しようとしている人は、このJavaScript NextSibling Firefox Bug Fix I have code that does my language translation that works in Google Chrome and IE. しかし、Firefox で使用し、ajax が読み込まれた後に div コンテンツを翻訳しようとすると、空白の問題が原因で失敗します。

私は本当に jQuery や Pure Javascript の好みはありません。実用的なソリューションが欲しいだけです。

辛抱強くお待ちいただきありがとうございます。個人的には私の説明は非常に明確であると思っていましたが、そうでなかったら申し訳ありません。私はあいまいにしたり、助けを得るのを難しくしたりしませんでした。しかし、私がそれを不明確にしようとしているとほのめかして、私を侮辱しないでください.

ありがとう。

4

3 に答える 3

2

うーん...あなたはjQueryを持っていますが、それを使用しませんか?

$(divid).children(".yourSpecialClassName").each( function() {
  doSomethingWith(this);
});

CSSクラスの属性値を取得するには、次のようにします。

$(divid).children().each( function() {
  alert(this.className);
});

あなたが今投稿した関数に基づいて、あなたはこれが欲しいです:

$(divid).find(".status_bar").each( function() {
  $(this).text( function(i, text) {
    var x = $.inArray(en_lang, $.trim(text));
    if (x > -1) {
      console.log('Current Value ['+text+'] English ['+en_lang[x]+'] Translation ['+other_lang[x]+']');
      return other_lang[x];
    }
    return text;
  });
});

また、「domagic」をコメントとして使用しないでください。これは信じられないほど足りないです。


編集。これははるかに効率的にすることができます(余分なものをconsole.log()削除します):

$(divid).find(".status_bar").each( function() {
  // prepare dictionary en_lang => other_lang
  var dict = {};
  $.each(en_lang, function(x, word) { dict[word] = other_lang[x]; });

  $(this).text( function(i, text) {
    var t = $.trim(text);
    return (t in dict) ? dict[t] : text;
  });
});
于 2010-04-21T15:55:05.660 に答える
1

jqueryを使用している場合は、次のことができます。

$("#myDiv").find("*").each(
   function(){
      var myclass = $(this).attr("class");
   }
);
于 2010-04-21T15:57:47.820 に答える
1

あなたのサンプル コードは意味がありません。

$(this).attr('value', to);

「値」は、テキスト コンテンツではなく、タグの属性です。

代わりにこれを行うつもりでしたか?

$(this).text(to);

また、質問を再編集しましたが、jQuery 以外のメソッドを使用して子ノードをループしようとしています。あなたは、「私のスクリプトの最後の障害は、クラス名を取得することです。クラス名が必要なのは、どのコンテンツのテキストが置き換えられるかをフィルタリングできるようにするためです。」

jQuery を使用している場合、クラス名を取得するために何かをループする必要はまったくありません。最初に適切なセレクターを使用するだけです。

 $(divid).find(".status_bar.replaceme").each( function() {  
    // .replaceme is whatever class you're using for the stuff you want to change
    // .status_bar.replaceme matches all elements with BOTH status_bar and replaceme classes

    var value = $.trim($(this).text());
    // if value is not defined thru browser bugs do not replace
    if (typeof(value) != 'undefined') {
        // it is a text node. do magic.


        // NOTE: The following is inefficient but I won't fix it. 
        //       You're better off using an associative array

        for (var x = en_count; x > 0; x--) {
            // get current english phrase
            var from = en_lang[x];
            // get current other language phrase
            var to = other_lang[x];
            if (value == from) {
                console.log('Current Value ['+value+'] English ['+from+'] Translation ['+to+']');
                // value = to;    <-- useless, get rid of it.
                $(this).text(to);
                // or $(this).html(to);
            }
        }
    }
});
于 2010-04-21T17:21:57.357 に答える