2012-04-04 10 views
1

に取り組んでいないI次のHTMLコードを持っている:私は、のいずれかをクリックするとのpreventDefaultは、第二のクリック

jQuery('.selectview').click(function (ev) { 

    ev.preventDefault(); 

    var alink = jQuery(this).attr('href'); 

    var view = getLinkVars(alink)["view"]; 
    var page = jQuery("#currentpageno").val(); 

    alert(alink); 
    alert(view); 
    alert(page); 

    run_ajax(view,page); 


}); 

コードが細かい初めてを実行します:次のように

<div> 
    <span>Products per page:</span> 
    <a class="selectview" href="/womens-clothing/shorts?page=1&view=20">20</a> 
    <a class="selectview" href="/womens-clothing/shorts?page=1&view=200">200</a> 
<div> 

とjQueryがありますリンク。アラートが表示され、Ajaxコードはうまく動作しますが、2回目にクリックするとページ全体がリフレッシュされ、アラートは表示されません。それから私は再びそれをクリックすると、それをクリックすると、それは再び動作します。

私は間違っていますか?

+0

わかりませんが、getLinkVars関数のコードもあわせて投稿してください。また、コンソールのエラーを確認してください。何らかの理由でpreventDefaultが起動していません。おそらく、コード内のエラーが発生している可能性があります。 – adeneo

答えて

6

私の推測では、run_ajaxはリンクを新しいものと置き換えています。 .clickは、その時点でセレクタと一致した要素にのみバインドされます。新しく追加されたリンクには、クリックイベントがバインドされません。

イベントを「ライブ」にする必要があります。彼らはそのよう.onを使用してバインドします

jQuery(document).on('click', '.selectview', function (ev) { 
    ev.preventDefault(); 
    // code... 
}); 

これ意志「デリゲート」イベント。 DOMに追加されたときにも、すべての.selectviewリンクが実行されます。

+0

少しだけ一般的な '.on'構文ではなく、より一般的に使われる構文' .live( 'click'、function(ev){}) 'と同じように簡単です。静的バインディングではなく、クリックイベントへの動的バインディングを本質的に行う必要があります。 – Mattygabe

+3

@Mattygabe: '.live'は、jQuery 1.7の前によく使われていました。 jQuery 1.7以降では、 '.live'と' .bind'と '.delegate'は非推奨です。 jQueryは、すべてのイベントバインディングのニーズに '.on'を使用することを提案しています。一旦人々がコードをアップグレードすると、 '.on'はもっと「人気がある」はずです。 –

+0

偉大な知っている - ありがとう! – Mattygabe

0

run_ajaxはあなたのクリックハンドラをアタッチコードをラップすることができ、あなたが新しいコンテンツとのリンクを交換してきた後、その後run_ajaxの内側にラッパーを呼び出すことができ、リンクを交換している場合:

var setupClickHandlers = function(container) { 
    jQuery(container).find('.selectview').click(function (ev) { 

     ev.preventDefault(); 

     var alink = jQuery(this).attr('href'); 

     var view = getLinkVars(alink)["view"]; 
     var page = jQuery("#currentpageno").val(); 

     alert(alink); 
     alert(view); 
     alert(page); 

     run_ajax(view,page); 
    }); 
}; 
setupClickHandlers(container); 

in run_ajax:

var run_ajax = function(view, page) { 
    // do your stuff here 

    // set up click handlers on the new content 
    setupClickHandlers(container); 
} 
+0

あなたの答えをありがとう、私はMattygabeのソリューションを使用し、それは完全に働いた。ありがとう:) – Amara

+0

私はロケットの答えを意味するOoops :) – Amara

関連する問題