2011-12-29 7 views
0

jquery $(this)がどのように機能するかについて私は誤解していると思います。私のコードでは、

$(document).delegate(".ISBN_number", "change", 
     function() 
     { 
      var isbnNum = $(this).val(); 
      console.log("isbnNum = " + isbnNum); 
      $.get("validate_isbn.php", {isbn: isbnNum}, 
       function(answer) 
       {     
        console.log("answer = " + answer); //this does display the correct content 
        if (answer == true) 
        { console.log("entered answer"); 
         $(this).after("<img src='pics/green_checkmark.png' class='checkmark'>"); 
        } 
        else 
        { 
         $(this).after("nope"); 
        } 
      });    
    }); 

内容が変更されたときに入力タグを選択しようとしています。コードで$(thisと呼ぶと)、この入力タグを参照すると仮定しましたが、そうではありません。私の問題は何ですか?それは.delegateを使用したためですか? (私は入力タグが後で動的に生成されるので、これを使う必要がありました。元のコードには存在しません)どうすればこの問題を解決できますか?

+0

あなたは '$(this)'を参照していますか?それらの3つのようなものがあり、そのうち2つはおそらくあなたが予想しているよりもはるかに異なった状況にあるでしょう。 –

+0

私は2番目(そして3番目、私はテストとしてのみ使用していました)の$(this) – user1015214

答えて

1

、その後、あなたはthisが別の何かに設定されているため、ローカル変数にそれを保存する必要があります。ただし、キャッシュ変数を使用していることを回避することができるはずですajax呼び出しの完了関数で使用します。あなたはこのようにそれを行うことができます:あなたはISBN番号をInputBox関数を使用している場合は

$(document).delegate(".ISBN_number", "change", 
     function() 
     { 
      var self = this; 
      var isbnNum = $(this).val(); 
      console.log("isbnNum = " + isbnNum); 
      $.get("validate_isbn.php", {isbn: isbnNum}, 
       function(answer) 
       {     
        console.log("answer = " + answer); //this does display the correct content 
        if (answer == true) 
        { console.log("entered answer"); 
         $(self).after("<img src='pics/green_checkmark.png' class='checkmark'>"); 
        } 
        else 
        { 
         $(self).after("nope"); 
        } 
      });    
    }); 
+0

これは実際には標準的な方法ではありません。 Jasperは、 '$(this)'を特にキャッシュし、 '$ 'を前に置いてjQueryオブジェクトを参照していることを知っていることが正しいです。 –

+0

@ JoshSmith - 'var self = this;'は多くの人が使っている非常に標準的なJavaScriptの習慣です。もちろん、 '$(this)'だけが必要な場合は、代わりにキャッシュしても問題ありません。 jQueryオブジェクトのvar名に$を使うことは、私が知っている個人的なスタイルですが、私はそれが読みやすさを減らすのを見て嫌いです。 – jfriend00

+0

完璧!説明ありがとう。 – user1015214

0

$(this)は、現在のスコープを指します。あなたの場合、最初の$(this).ISBN_numberを指し、もう1人の$(this)は異なる範囲を指します。

あなたはそうのような最初の$(this)をキャッシュする必要があります。

$(document).delegate(".ISBN_number", "change", 
    function() 
    { 
     $isbn = $(this); 
     var isbnNum = $isbn.val(); 
     console.log("isbnNum = " + isbnNum); 
     $.get("validate_isbn.php", {isbn: isbnNum}, 
      function(answer) 
      {     
       console.log("answer = " + answer); //this does display the correct content 
       if (answer == true) 
       { console.log("entered answer"); 
        $isbn.after("<img src='pics/green_checkmark.png' class='checkmark'>"); 
       } 
       else 
       { 
        $isbn.after("nope"); 
       } 
     });    
}); 
+0

を参照していますが、なぜ私のコードは機能しませんか? .afterのためですか?私はこの同じコードを別の場所で使用しています(input要素の後ろに情報を追加しています)。 – user1015214

+0

ジョシュが言ったことに加えて、私は 'this'キーワードを完全に理解するためにあなたの[ここ](http://net.tutsplus.com/tutorials/javascript-ajax/fully-understanding-the-this-keyword/)を指摘しています – defau1t

4

thisvar isbnNum = $(this).val();)がそれにchangeイベントの火を持っていた.ISBN_number要素を指します。 $(this)は、jQueryオブジェクトにラップされた同じDOM要素を参照するため、jQuery関数を呼び出すことができます。

あなたはAJAX呼び出しまたは匿名関数を使用して、関数呼び出しの他のタイプを作るとき、元thisをキャッシュすることをお勧めです:

$(document).delegate(".ISBN_number", "change", 
     function() 
     { 
      var $this = $(this), 
       isbnNum = $this.val(); 
      console.log("isbnNum = " + isbnNum); 
      $.get("validate_isbn.php", {isbn: isbnNum}, 
       function(answer) 
       {     
        console.log("answer = " + answer); //this does display the correct content 
        if (answer == true) 
        { console.log("entered answer"); 
         $this.after("<img src='pics/green_checkmark.png' class='checkmark'>"); 
        } 
        else 
        { 
         $this.after("nope"); 
        } 
      });    
    }); 

あなたはいつもに言及している知っているその方法同じthis

+0

うわー、キャッシュに追加するのとほぼ同時に編集されます。良いこと。 –

+0

また、コンマで区切られたヴァルスでの良い練習のために+1。 –

0

thisは、コールバック関数内でコードが変更されることがあります。あなたは.delegate()呼び出しからthisにアクセスしたい場合は

$(document).delegate(".ISBN_number", "change", function() { 
    var $this = $(this); 
    var isbnNum = $this.val(); 
    console.log("isbnNum = " + isbnNum); 
    $.get("validate_isbn.php", { 
     isbn: isbnNum 
    }, function (answer) { 
     console.log("answer = " + answer); //this does display the correct content 
     if (answer == true) { 
      console.log("entered answer"); 
      $this.after("<img src='pics/green_checkmark.png' class='checkmark'>"); 
     } else { 
      $this.after("nope"); 
     } 
    }); 
}); 
+0

またはjqueryイベントオブジェクトを使用します。 http://api.jquery.com/category/events/event-object/ –

+0

@ 32bitkidどのようにそれが良いでしょうか?イベントオブジェクトを使用すると、より長いコードとより多くの処理が実現します。 – Blazemonger

+0

さらに加工してみますか?長いコード?何?変数をバインドするかどうかにかかわらず、イベントオブジェクトはクロージャーに渡されます。 –

0

は、#(この).val()は値がテキストボックスに変更/入力されたあなたを与えます。

関連する問題