2016-04-01 2 views
3

なぜこのスクリプトはChromeをフリーズしますか?また、私がやろうとしていることを行う良い方法がありますか(単語のすべてのインスタンスを別の単語に置き換えます)?jQueryがChromeをハングします

<html> 
    <body>  
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
     <script> 
    $(document).ready(function(){ 
    var replaced = $("body").html().replace('Foo','Bar'); 
    $("body").html(replaced); 
    }); 
     </script> 
     <p>Foo</p> 
    </body> 
</html> 

答えて

7

置換を行うスクリプトは本文にあるためです。 .html(HTMLString)HTMLString<script>が含まれている場合、jQueryはスクリプトを実行します。だから、あなたが体を置き換えた後、あなたは体を再び置き換えるコードを呼び出しています。そしてそれが実行されると、それは再び自分自身を呼び出します。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js">が本文に含まれているため、交換するたびに別のjQueryをロードしています。

解決策の1つは、すべてのスクリプトを本文の代わりに<head>に入れることです。ページの実際の内容を含むコンテナDIVだけをターゲットにしている場合もあります。

<html> 
    <body>  
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> 
     <script> 
    $(document).ready(function(){ 
     var replaced = $("#content").html().replace(/Foo/g,'Bar'); 
     $("#content").html(replaced); 
    }); 
     </script> 
     <div id="content"> 
     <p>Foo</p> 
     </div> 
    </body> 
</html> 

あなたは.replace()の最初の引数として文字列を与える場合にも、それだけで最初のマッチを置き換えます。すべての一致を置換する場合は、修飾子がgの正規表現を使用する必要があります。

+0

ニースキャッチ!単に$( "body").html()。replace(/ Foo/g、 'Bar');を使用して、あなたの問題。 – IrkenInvader

+0

また、 '.html'のコールバックを利用することもできます。 – Tushar

+0

@Tushar私はそれを '' $ ''の代わりに使用したいと思います。 '' $( "#content" .each() 'ループ。要素が1つだけ選択されている場合、わかりやすいコードが明確になっていると思います。 – Barmar

関連する問題