2012-04-04 3 views
1

작동하지 나는 다음과 같은 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를이 링크; 알리미가 표시되고 아약스 코드가 정상적으로 실행되지만 두 번째 클릭하면 전체 페이지가 새로 고쳐지고 경고가 표시되지 않습니다. 그런 다음 다시 클릭하면 작동하고, 다시 클릭하면 작동합니다.

내가 잘못 할 수 있습니까?

+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); 

을 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