2012-03-09 20 views
2

jQueryを使用してWebサービスにクエリを行い、jqueryテンプレートを使用してHTMLページに返信を挿入しようとしています。私のコードは現在次のようになっています:匿名のJavascript関数にデータを渡す

$(function() { 
    $('.media-releases h3 div').click(function() { 

    var button = $(this); 
    if ($(this).hasClass("expand")) { 
     $(this).addClass("spinner"); 
     var params = '{ "year": "' + 2012 + '", "month": "' + 02 + '" }'; 

     $.ajax({ 
      type: "POST", 
      url: "NewsReleases.asmx/GetNewsReleases", 
      data: params, 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (response) { 
       var result = jQuery.parseJSON(response.d); 
       $.get('NewsRelease.htm', function (data) { 
        // The problem is here, button is null. 
        // I assume I have to create a closure 
        // but I'm not sure how to do it. 
        var ul = button.parentNode.nextSibling; 
        $.tmpl(data, result).appendTo(ul); 
       }); 

       button.removeClass("spinner"); 
       button.parents('h3').next().slideDown(); 
       button.removeClass('expand').addClass('minimise'); 

      }, 
      error: function (error) { 
       /*Error handling code removed*/ 
      } 
     }); 

    } else { 
     button.parents('h3').next().slideUp(); 
     button.removeClass('minimise').addClass('expand'); 
    } 
}); 

});

上記の関数でボタン変数にアクセスできるようにするにはどうすればテンプレートを追加できますか?

+0

どこからアクセスできますか? – Joseph

答えて

4

上記のコードは、既に動作するはずsuccess関数は、buttonが定義されているコンテキストで作成されるためです。

動作しない場合は、おそらく他のものが壊れている可能性があります。その他のオプション:あなたのJSのデバッガで

  • コードを通して、あなたのエラーコンソールをチェック
  • ステップ

[EDIT]問題はbutton.parentNodeです。 buttonはjqueryノードであり、DOMノードではありません(var button = $(this);)。代わりにbutton.parent()を使用してください。

+0

あなたが正しいのは、ボタンparentNodeプロパティのundefinedを返すボタンではありません。 Chromeのbutton.parentNodeを調べると、うまく実装されているように見えますが、var node = button.parentNodeを実行すると、定義されていません。なぜこれが起こっているのか? – b3n

+0

はい。 DOMノードではなく、jqueryノードで作業しています( 'var button = $(this);')。 'button.parent()'を試してください。 –

+0

素晴らしい、これは動作します。ありがとう。 – b3n

0

が他のpredifined関数の呼び出しを行い、これはこれはあなたの成功を行いますパラメータ としてボタンを渡すことが、あなたができるようになり:

success: function (response) { 
       onSuccess(response,button); 
      }, 

そして、新しく作成された機能は次のようになります:

function onSuccess(response,button){ 
    var result = jQuery.parseJSON(response.d); 
        $.get('NewsRelease.htm', function (data) { 
         /*The problem is here, button is null. I assume I have to create a closure but I'm not sure how to do it.*/ 
         var ul = button.parentNode.nextSibling; 
         $.tmpl(data, result).appendTo(ul); 
        }); 

        button.removeClass("spinner"); 
        button.parents('h3').next().slideDown(); 
        button.removeClass('expand').addClass('minimise'); 
} 

Source