2016-11-29 7 views
0

私はかなりの時間このトピックを苦労しており、クリックすることはありません!タイマーと投稿の間にオブジェクトを渡す(匿名関数)

&.post(WordPress処理済みAJAX)リクエストにオブジェクトを渡す必要がありますが、通常の変数を使用して正しく処理する方法がわかりません。その代わりに、私は$(document)を呼び出してそれをDOM要素(非常に醜いと遅い)を繰り返し実行する必要があります。

$(document).find('#sections_title').val() requestを代わりに使用して、ポストデータにタイトル変数をすべて渡すことができるように、このコードを修正する方法はありますか?

これを正しく行う方法を説明してください。

(function ($) { 
    var title = $('#sections_title'); 
    var timeout = 2000; 

    var delay = (function() { 
     var timer = 0; 

     return function (callback, ms) { 
      clearTimeout(timer); 
      timer = setTimeout(callback, ms); 
     }; 
    })(); 

    title.keyup(function() { 

     // i would like to have variable here, that grabs the $(this).val() 
     // and use this variable to pass to the data 
     // var value = ....... 

     delay(function() { 
      $.post(
       ajaxurl, 
       { 
        'action': 'add_foobar', 
        'data': $(document).find('#sections_title').val() 
        // instead I would like: 
        // 'data': value 
       }, 
       function(response){ 
        alert('The server responded: ' + response); 
       } 
      ); 

     }, timeout); 
    })(); 
})(jQuery); 

答えて

1

これは、あなたのケースにとって最も簡単な方法です。 valをオブジェクトとしてコールバックにバインドします。それを使用する必要があるときに文字列にキャストします。

delay(function() { 
     $.post(
      ajaxurl, 
      { 
       'action': 'add_foobar', 
       'data': String(this) 
       // instead I would like: 
       // 'data': value 
      }, 
      function(response){ 
       alert('The server responded: ' + response); 
      } 
     ); 

    }.bind(Object($(this).val())), timeout); 

それともここに完全なコードです

(function ($) { 
    var title = $('#sections_title'); 
    var timeout = 2000; 

    var delay = (function() { 
     var timer = 0; 

     return function (callback, ms) { 
      clearTimeout(timer); 
      timer = setTimeout(callback, ms); 
     }; 
    })(); 

    title.keyup(function() { 

     // i would like to have variable here, that grabs the $(this).val() 
     // and use this variable to pass to the data 
     // var value = ....... 

     delay(function() { 
      $.post(
       ajaxurl, 
       { 
        'action': 'add_foobar', 
        'data': String(this) 
        // instead I would like: 
        // 'data': value 
       }, 
       function(response){ 
        alert('The server responded: ' + response); 
       } 
      ); 

     }.bind(Object($(this).val())), timeout); 
    })(); 
})(jQuery); 
+0

これは私が使用したものです。しかし、私は1つの質問があります、なぜあなたはオブジェクトにテキストを変換するのですか?バインドで 'this'を渡し、delay関数内からjqueryオブジェクト全体を抽出しました。 – HelpNeeder

+0

@HelpNeederこれもうまくいくはずですが、値が必要なので、要素またはjqueryオブジェクトの参照を作成したくありませんでした。このオブジェクトにStringプロトタイプのメンバーを持たせたくないので、値をObjectに変換しました。ボクシングのためだけに –

+0

ああ!まあ、私は必要とするだけの状態をしました。私は値を渡す他の方法にも感謝します。どうもありがとうございます! – HelpNeeder

1

window objectで明示的に設定できます。ブラウザでは、node.jsなどの特定の環境を除いて、グローバルオブジェクトはウィンドウオブジェクトと同じです。

(function($) { 
    window.title = $('#sections_title'); 
    var timeout = 2000; 

    var delay = (function() { 
     var timer = 0; 

     return function(callback, ms) { 
      clearTimeout(timer); 
      timer = setTimeout(callback, ms); 
     }; 
    })(); 

    title.keyup(function() {  
     delay(function() { 
      $.post(
       ajaxurl, { 
        'action': 'add_foobar', 
        'data': window.title 
       }, 
       function(response) { 
        alert('The server responded: ' + response); 
       } 
      ); 

     }, timeout); 
    })(); 
})(jQuery); 
+0

これは良い解決策ですが、それは他のJSコードとの競合を作成することができますように私はこれを使用することはありません。しかし、私はその考えが好きです。ありがとう! – HelpNeeder