-1

そこで、body の innerHTML (はい、body タグ内のすべてのもの) を取得し、すべてのアラビア数字 (123) をアラビア・インド数字 (١٢٣) に変換し、innerHTML を変更されたものに置き換えるスクリプトを作成しました。現在、パーサーは完全に機能し、ユーザーのページに表示される数字のみを変更し、タグ属性の数字を避け、「機密」タグ (script、style、noscript など) 内のものを変更せずに残します (私が解決しているいくつかのねじれ)、私が望んでいるように!(ちなみに、これはChrome拡張機能で実行されており、onLoadイベントがトリガーされるとスクリプトが実行されます)

しかし、何らかの理由で、本来の機能が停止するものがあります。たとえば、スタック オーバーフローに関するランダムな質問を考えてみましょう。上下投票ボタンが機能しなくなります。元の HTML と解析されていない HTML を比較してみました。

http://www.diffchecker.com/gJE1v50f

そこではすべて問題ないようです。唯一の違いは数字です。ユーザーに表示される一部のリンク (たとえば、書式設定のヘルプ パーツにあるリンク) が変更されていますが、それを修正する予定であり、とにかくスクリプトには影響しないため、無視しています。今のところ。

読んでくれてありがとう、答えてくれてありがとう:)

4

2 に答える 2

1

テキストノードを取得して直接変更することをお勧めします: http://jsfiddle.net/6pLeR/

// this will get all text nodes that are descendant of element. 
function getTextNodes(element) {
    var nodes = [],
        children = element.childNodes,
        i=0, child = children[0];

    for (; i < children.length; i++, child=children[i]) {
        if (child.nodeType === 3) nodes.push(child);
        else nodes = nodes.concat(getTextNodes(child));
    }

    return nodes;
}

var nodes = getTextNodes(document.body); // get all text nodes in the body.

for (var i = 0; i < nodes.length; i++) {
    var node = nodes[i];

    node.data = node.data.replace(/text/g, "banana"); // replace "text" with "banana"
}​

ノードのデータの変更によってクリック イベントが影響を受けないことをデモで確認できます。

于 2012-12-18T23:14:00.460 に答える
1

上記のコメントで述べたように、ページの本文の html を置き換えると、すべての新しい (元の要素と同じですが) 要素が生成され、それらに関連付けられているすべてのイベントが破棄されます。やりたいことは、本文のすべてのテキスト ノードをループすることです。これは、xpath を使用して行うのが最も簡単です。

xpath = new XPathEvaluator()
xpath.evaluate("//text()", document.body)

これは、現在のドキュメントの本文にあるすべてのテキスト ノードの配列を返します。その後、それらをループして、それぞれの内容を変更できます。

もう 1 つの問題は、変更中のテキスト ノードから数値を解析するスクリプトが壊れる可能性があることです。これに対して私が考えることができる唯一の解決策 (はい、非常にハックです) は、Number関数の動作を拡張することです。

(function (){
  var oldNumber = Number
  window.Number = function(obj){
    if(typeof obj == "string"){
      // replace numerals
      var numerals = ["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"]
      for(idx in numerals){
        obj = obj.replace(new RegExp(numerals[idx],"g"), idx)
      }
      // replace decimal point
      obj.replace(/٫/g,".")
    }
    return oldNumber(obj)
  }
})()

コードはほとんど同じですが、すべてが機能するように parseInt および parseFloat 関数を拡張する必要もあります。これにより、HTML から数値を解析するスクリプトが壊れるのを防ぐことができます。ただし、数字を Web ページに表示すると、通常のアラビア数字になることに注意してください。これを回避するには、Number のtoStringメソッドを拡張することもできますが、これは、比較的安全な数値解析関数を拡張するよりも危険な場合があります。

于 2012-12-18T22:21:24.930 に答える