1

XMLを収集するajax呼び出しがあり、そのデータに基づいて、click()jqueryリスナーをアタッチする多数のdivが作成されます。クリックすると、それらのdivが関数を呼び出し、その関数にパラメーターを渡すようにします。ただし、クリックが呼び出されるまでに、パラメータの値が変更されています。これは、問題を示すために作成したjsfiddleの例です。

    $(document).ready(function() {

    function x() {

      $.ajax({
        type: "POST",
        url: "/echo/xml/",
        dataType: "xml",
        data: {
            xml: "<the>xml</the>"
        },
        success: function(xml) { 
          console.log('success');                

          $('#test').show(); 

          var text = "CORRECT";      

          $('#test').click(function() {

            insertText(text);
            console.log(text);
          });

          text = "WRONG";

        }        
      });
    }

    x();

  });

  function insertText(t) {

      $('#test').html(t);
  }

テキストが間違っているのではなく、正しいものとして表示されるようにしたい。

これは少し複雑な例ですが、スコープと何が起こっているかという観点から、実際のコードを可能な限りシミュレートしようとしています。click()クリックに基づいて関数が呼び出されるまでに、の値textが変更されています。作成時にの値を呼び出しtextに「焼き付ける」方法はありますか?XMLを実行し、後で使用するためにすべてのデータを変数に保持したくないので、ループをclick()介してこれらのいくつかを作成します。for

4

3 に答える 3

1

最も簡単な方法は、おそらくハンドラーをアタッチする関数を作成することです。このように、関数内のパラメーターは変更されません。

      var text = "CORRECT";      

      bindClick("test", text);


      // ...

      function bindClick(id, text){

          $('#' + id).click(function() {
            insertText(text);
            console.log(text);
          });
      }

http://jsfiddle.net/snTEf/2/

于 2012-04-03T21:23:23.900 に答える
1

このように、クロージャ形式でローカル変数にバインドします。

(function(text){
     $('#test').click(function() {
            insertText(text);
            console.log(text);
      });
})(text);
于 2012-04-03T21:28:05.483 に答える
1

このclick関数は、text = "WRONG"割り当てが呼び出されるまで呼び出されないため、もちろん、関数は「不正な」値のを使用しますtext。あなたが言うように、text定義時にの値を関数に焼き付けたい場合は、次のようにすぐに呼び出される無名関数を使用できます。

(function(bakedText) {
  $('#test').click( function() {
    insertText(bakedText);
    console.log(bakedText);
  }
})(text);

ここでデモを参照してください:http://jsfiddle.net/H4DpV/

于 2012-04-03T21:29:02.097 に答える