2011-09-29 7 views
3

클릭했을 때 jquery로 링크를 가로채는 방법이 있는지 궁금합니다. 문제는 페이지가 처음로드 될 때 내 페이지의 일부 링크가로드되지 않는다는 것입니다. jquery에는 현재와 미래의 모든 링크를 가로 채는 방법이 있다는 것을 모호하게 회상합니다. 여기 내가 가진 코드가있다. 그것은 시작에 있었다가 모든 링크에서 작동하지만, 나중에이 기능에 의해현재 및 미래의 모든 링크 차단하기

$('a').trackClick({ 
     areaClick: function(element) { return getAreaClicked(element); }, 
     href: function(element) { return getHrefFromElement(element); }, 
     text: function(element) { return getTextFromElement(element); }, 
     exceptions: function(element) { return isException(element); } 
    }); 

답변

5

을 JQuery와 라이브 여기 참조 : http://api.jquery.com/live/

$('a').live('click', function(e){ 

var element = $(this); 
var data = {areaClick: function(element) { return getAreaClicked(element); }, 
      href: function(element) { return getHrefFromElement(element); }, 
      text: function(element) { return getTextFromElement(element); }, 
      exceptions: function(element) { return isException(element); } 
} 
    trackClick(data); 

    }); 
+0

이 코드는 위의 내 코드로 동일한 일을 할 것입니다. 내가 붙여 넣을 때 거기에 없었던 코드의 다른 부분에 두 개의 자바 스크립트 오류가 발생합니다. 이것은 내가 작성한 코드가 아니므로 계속 진행되는 것을 실제로 알지 못하며 향후 링크 버그를 수정해야합니다! – Kaskade

+0

위의 코드를 수정하여 수정했습니다 - 이제는 작동해야합니다 – Ash

+7

미래의 독자는 올바른 대답으로 볼 때 .live()가'.delegate()'가 선호되는 낙심한 선택 이었음을 알아야합니다. 더 중요한 것은 위임 구문을 사용하여 두 가지 모두'.on()'으로 대체되었습니다. http://api.jquery.com/on/ –

3

사용 jQuery의 live 이벤트 핸들러 차단되지 않아요 페이지에로드 된 링크 : 당신이 필요로하는

$('a').live('click', function() { 
    ... 
}); 
7

[편집 : 월의로 (나는이 대답에 가끔 upvote에 얻을, 그래서 더 많은 전류로 업데이트하고 싶었다 2015) 연습] :

내 원래의 답변에 따라 수신기를 위임하는 것이 좋습니다. jQuery의 현재 "우수 사례"구문은 .on()입니다. 순서 만 다르며 의미 상 직관적입니다 :

$('#parent').on('click', 'a', function(event) { 
    event.preventDefault(); 
    // do the rest of your stuff 
} 

나머지 원래 대답은 여전히 ​​적용됩니다.


기본 클릭 동작을 원하지 않으면 이벤트 버블 링을 중지해야합니다. 라이브보다 대리인을 선호하므로 내 제안 사항은 다음과 같습니다.

$('#parent').delegate('a', 'click', function(event) { 
    event.preventDefault(); 
    // do the rest of your stuff 
}); 

"#parent"는 예제 일뿐입니다. 앵커 태그의 영구 조상이 될 적절한 선택기를 사용합니다. "body"만큼 올라갈 수도 있지만, 종종 설명의 래퍼 ID도 잘 작동합니다.

[편집 : 나는 최근에 upvote를 보았는데, 이는이 답변이 누군가가 본 것을 의미합니다. 그것은 .live() 지금은 사용되지 않습니다 주목해야한다, 그리고 .delegate()하지만이 지원, 공식적으로 제안 구문은 위임자로 사용 .on()입니다 : 그 상당히 고가이지만

$('#parent').on('click', 'a', function(event) { 
    event.preventDefault(); 
    // do the rest of your stuff 
}); 
+0

부모를 사용할 필요가 없기 때문에 문법적으로 더 정확 한 live()와 똑같이 할 수 있습니다. – Ash

+0

@Ash 예, 동일하게 할 수 있습니다 그러나'live()'는 모든 앵커 태그를 먼저 선택하고 아무 것도하지 않는다는 점에서 비효율적입니다. $ (document) .ready() 외부와 페이지의 헤더에있는 경우 문제가 적습니다. –

+1

"구문 상 더 정확한"이 무슨 뜻인지 모르겠습니다. 두 기능 모두 자신이하는 일을 설명합니다. .delegate의 이점은 잘 문서화되어 있으며 실제 성능 이점이 덜 극적이라 할지라도 (Kevin B에 따라), 클릭 연결 기능으로 .delegate()를 사용하는 것으로 전환하는 것은 나쁜 습관이 아닙니다. 게다가, 나는 "나는 선호한다"라고 말했고 대안을 제공했다. 옵션은 나쁜 것일 수 없습니다! –

2

가장 간단한 방법은, jQuery의 live() 방법을 사용하는 것입니다. 가능하면 delegate()은 더 나은 옵션, 그리고 둘 사이의 차이를 설명 여기에 몇 게시물이 있습니다 :

Jquery live() vs delegate()
jQuery: live() vs delegate()

일반적으로 가장 좋은 방법은 단순히 결합하는 것입니다 당신이에 필요 무엇이든은 새로운 <a> 요소는 AJAX를 통해로드됩니다. 예를 들어 말한 바와 같이

$.ajax({ 
    url: 'http://example.com' 
    type: 'GET' 
    data: 'whatever' 
    success: function(data){ 
     //after inserting the response somewhere... 
     $('.insertedContent').find('a'.trackClick({ 
     areaClick: function(element) { return getAreaClicked(element); }, 
     href: function(element) { return getHrefFromElement(element); }, 
     text: function(element) { return getTextFromElement(element); }, 
     exceptions: function(element) { return isException(element); } 
     }); 
    } 
} 
0

는 답변 .live()을 추천하고 .delegate()out of date이다.

비슷한 문제가 있습니다. 다양한 요소에 대해 다양한 클릭 핸들러가 이미 사용되었지만, 추가 클릭 핸들러를 추가하여 모든 것을 잡아서 다른 것들보다 먼저 조치를 취하고 싶습니다.

다른 유용한 도구를 클릭하면 웹 응용 프로그램의 다양한 도구가 기본 상태로 재설정되기를 원합니다.

다음

내 솔루션은 ...

$(document).on("click", function(e){ 
    // This catches all clicks. 
    // It can be suppressed if the target uses e.stopPropagation() 
}); 

// To start the bubbling from an element "higher" than the document, 
// then use delegation, e.g.: 
// $(document).on("click", ".your_class", function(e){ etc }) 
// This can be really useful if you only have one sensitive area in the layout, 
// or you want different "master" click behaviours for different areas! 

$("#my_element").on("click", function(e){ 
    // prevent the default action, e.g. prevent "#" navigation on <a href="#"> 
    e.preventDefault(); 
    // prevent the click bubbling to the $(document) handler 
    e.stopPropagation(); 
    // now do my stuff 
    // ... 
}); 

$("#my_other_element").on("click", function(e){ 
    // prevent the default action, e.g. prevent "#" navigation on <a href="#"> 
    e.preventDefault(); 
    // this time I want the "catch all" to fire 
    // so I don't do stopPropagation() 
    // now do my stuff 
    // ... 
}); 
관련 문제