2012-08-08 2 views
2

내가 앵커의 배열을 요소 (JQuery와)에서 여러 클릭 :방지, 내가 하나 하나에 이벤트를 바인딩하고

$j('.opts a').live("click", function(e){}) ; 
나는이 클릭 이벤트를 가질 때까지 클릭되는 것을 다른 앵커를 중지하고 싶은

끝마친.

$j('.opts a').live("click", function(e){ 
    $j('.opts a').unbind('click'); 
    //do something 
    $j('.opts a').bind('click'); 
}); 

이것은 내가 시도한 한 가지 예일 뿐이지 만 바인딩 해제 작업은 작동하지 않습니다.

+0

@JamesMcLaughlin :하지만 사용자는 단일 스레드가 아니므로 마우스와 동시에 이벤트를 실행할 수 있습니다. –

+0

@AaronDigulla 네 말이 맞아. 절대 신경 쓰지 마. –

답변

2

링크를 클릭 할 수 없게 할 수는 없습니다. 등록한 모든 JS 이벤트 만 바인딩 해제 할 수 있습니다. preventDefault()으로 전화를 걸려면 링크가 바로 href을 따라야합니다.

다음과 같이 시도해보십시오.

var isDoingSomething = false; 
$j('.opts a').on('click', function (e) { 
    e.preventDefault(); 
    if (!isDoingSomething) { 
     isDoingSomething = true; 
     // do something 
     isDoingSomething = false; 
    } 
}); 

희망이 있습니다.

+0

정확히'.on'을 포함하여 제안 할 것이지만 - 최고의 성능을 위해'.on'을 .opts의 직접적인 부모에 바인딩해야 할 수도 있습니다. (부모가 무엇이든간에) –

0

나쁜 ->

$j('.opts a').live("click", function(e){ 
    $j('.opts a').unbind('click'); 
    //do something 
    $j('.opts a').bind('click'); 
}); 

좋은 ->

$j(document).on("click", '.opts a', function(e){ 
    $j('.opts a').off('click'); 
    //do something 
    $j('.opts a').on('click', //a function such as 'myClickFunction' referencing what you want to occur.); 
}); 
+0

이 경우에는 off()가 작동하지 않습니다. – mononym

2

내가 jQuery를 여기에 올바른 도구입니다 생각하지 않습니다. 문제는 자바 스크립트가 처리하는 동안 이벤트가 대기열에 있다는 것입니다.

정말 필요한 것은 "돌아올 때 대기중인 모든 클릭 이벤트를 삼키는 것"입니다.

클릭 핸들러의 리 바인딩을 새 함수로 옮기고 타이머에서 호출하는 것이 좋습니다. 이를 통해 브라우저는 대기중인 이벤트를 처리 할 수 ​​있습니다.

아마도 바인딩을 해제하는 것도 잘못된 방법입니다. 당신은 항상 같은 처리기를 사용하는 경우 skip 속성을 객체로 돌려 :

skip: false, 
run: function(e) { 
    if (this.skip) return; 

    this.skip = true; 

    ... do something ... 

    var self = this; 
    setTimeout(function() { self.skip = false; }, 50); 
} 

[편집] 또 다른 방법 : 모든 링크가 부모처럼 (하나 개의 HTML 요소에있는 경우 div 또는 무언가), 아무 것도하지 않는 요소에 대한 클릭 핸들러를 설치할 수 있습니다. 또한 클릭 이벤트를 삼킨다. 함수에서 돌아온 후에도 이벤트가 처리되도록하려면 타임 아웃 처리기가 필요합니다.

+0

+1 모든 자바 스크립트 문제가 jQuery 문제는 아니라는 것을 상기시켜줍니다. –

관련 문제