2012-08-26 2 views
0

사이트의 ajax 탐색을 설정할 때 jQuery 선택기에 문제가 발생했습니다. 사이트는 트위터 부트 스트랩을 기반으로하며 프레임 워크에서 제공하는 탐색 모음 및 드롭 다운을 사용합니다.jquery 선택자의 차이점

class="ajaLink"의 링크를 클릭하면 hashchange 이벤트를 사용하여 section#main에 새 콘텐츠를로드합니다.

이벤트가 트위터 부트 스트랩 드롭 다운 메뉴의 링크에 바인딩되지 않는 것처럼 보였습니다. 나는 드롭 다운에 대한 JS를 조사했지만 이벤트가 묶이고 트리거되는 것을 막을 수있는 것을 볼 수 없었다. 좌절에서

나는 이것은 탐색 바, 드롭 다운에있는 모든 링크 이벤트 바인딩을 만든

$('.ajaxLink').on('click', function (e) { 
    ... 
} 

$(document).on('click', '.ajaxLink', function (e) { 
    ... 
} 

에서 선택을 chanegd 만의 링크를 떠날 것이다 동적으로로드 된 콘텐츠

두 개의 선택자 사이의 차이점을 알아낼 수 없으며이 동작을하는 이유는 무엇입니까? 내 솔루션 지금까지 두 선택기를 사용하는 것입니다하지만이 doesnt 솔루션으로 같은 느낌이 오랫동안 같은 이벤트에 대한 두 번 같은 요소를 바인딩 할 수 없습니다.

그래서 두 개의 선택기 사이의 차이점은 무엇입니까? 각 .ajaLink 요소를 한 번만 바인딩하도록 선택기를 다시 작성하는 방법은 무엇입니까?

html로 ...

<!DOCTYPE html> 
<html> 
<head> 


</head> 
<body> 
    <div class="container"> 
     <header> 
      <div class="navbar navbar-inverse"> 
       <div class="navbar-inner"> 
        <div class="container"> 
         <!-- Minimizing the menu under a button when screen gets too small. --> 
         <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> 
          ... 

         </a> 

        <div class="nav-collapse"> 
        <ul class="nav"> 
         <!-- Choose application. --> 
         <li class="dropdown"> 
          <a class="dropdown-toggle" href="#" data-toggle="dropdown"> Menu 1 <b class="caret"></b></a> 
          <ul class="dropdown-menu"> 
           <li class=""><a class="ajaxLink" href="/Blabla">Blabla</a></li> 
           <li class=""><a class="ajaxLink" href="/Yadayada">Yadayada</a></li> 
           ... 
          </ul> 
         </li> 
         <!-- Choose application. --> 
         <li class="dropdown"> 
          <a class="dropdown-toggle" href="#" data-toggle="dropdown"> Menu 2 <b class="caret"></b></a> 
          <ul class="dropdown-menu"> 
           <li class=""><a class="ajaxLink" href="/Blabla2">Blabla 2</a></li> 
           <li class=""><a class="ajaxLink" href="/Yadayada2">Yadayada 2</a></li> 
           ... 
          </ul> 
         </li> 
        </ul> 
        <form class="navbar-search pull-right" action="/Home/Search" method="post" > 
         <input type="search" class="search-query" placeholder="Sök" /> 
         <button type="submit" class="btn btn-inverse" id="search-button ">Search</button> 
        </form> 


        </div><!--/.nav-collapse --> 
       </div> 
       </div> 
      </div> 
     </header> 
     <div class="log label label-important" style="display:none;" ></div> 
    <section id="main" style="opacity: 1; "> 

    <div class="row-fluid"> 
    <div class="span2"> 

    </div> 
    <div class="span10"> 
     <span class="gradientlabel"><a href="#">Artiklar</a></span> 

     <table class="table table-striped table-bordered table-condensed overview-table"> 
      <tbody><tr> 
       <th> 
        Art No. 
       </th> 
       <th> 
        Description 
       </th> 
       <th> 
        Price 
       </th> 
       <th></th> 
      </tr> 

      <tr> 
       <td> 
        16791 
       </td> 
       <td style="overflow:hidden;white-space: nowrap;"> 
        175/70-13 82Q Semperit Ice Grip 2 Dubbat 
       </td> 
       <td> 
        300 
       </td> 
       <td> 
        <a class="ajaxLink" href="/Artiklar/Edit/16791">Edit</a> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        16792 
       </td> 
       <td style="overflow:hidden;white-space: nowrap;"> 
        195/55-15 85Q Uniroyal Nordic Dubbat 
       </td> 
       <td> 
        550 
       </td> 
       <td> 
        <a class="ajaxLink" href="/Artiklar/Edit/16792">Edit</a> 
       </td> 
      </tr> 
      ... 
     </tbody></table> 
    </div> 
    </div> 
    </section> 
     <footer> 
     </footer> 
    </div> 

</body> 
</html> 

자바 스크립트

//Add event for all ajaxLink (except for the ones in the bootstrap dropdown) 
$(document).on('click', '.ajaxLink', function (e) { 
    var self = $(this); 
    if (self.attr('href').length > 2) { 
     window.location.hash = "!" + self.attr('href'); 
    } 
    return false; 
}); 

//I dont really know yet, but this is the only way to attach the event to bootstraps dropdown, and also have to close the dropdown programmatically. 
$('.ajaxLink').on('click', function (e) { 
    var self = $(this); 
    //if (self.prop('tagName') != 'A') { alert('not a link'); self = self.find('a:first'); } 
    if (self.attr('href').length > 2) { 
     window.location.hash = "!" + self.attr('href'); 
    } 
    self.closest('.dropdown').removeClass('open'); 

    return false; 
}); 
+0

짧은하지만 HTTP를 복제 : // 유래.com/a/8111171/1478467 – Sherbrow

+0

이 문제는 실제로 중복되지 않습니다. 그 이유는 선택자 사이의 차이점에 대한 좋은 설명이 있습니다.하지만 왜 '$ (document) .on ('click ','.ajaxLink ', function() {..}); ,하지만 동적으로로드? 그래서 두 선택자 사이의 차이는 없지만 질문의 두 번째 부분은 없습니다. 마지막 바인딩은 여러 번 묶어 두지 않는다고 확신하게 만들었습니다. $ ('header, # main'). on ('click', '.ajaxLinl', function() {..}); 이 일을 제 편으로 많이했습니다. –

답변

3

의 차이는 $('.ajaxLink').on('click', function (e) { ... } 이미 존재하는 요소를 결합하는 것입니다.

$(document).on('click', '.ajaxLink', function (e) { ... }에는 대리인이 있으며 나중에 동적으로 생성되는 .ajaxLink 요소도 바인딩합니다.


당신은 대리인이 정말 document보다 하위 요소에 더 가까운 부모를 사용해야합니다. 그 이유는 더 나은 성능을 제공하는 DOM 트리에서 불필요한 검색을 저장하기 때문입니다. 나는 JQuery docs에서 읽은에서

+0

5 초가 지나면 고맙습니다. 그러나 여전히, 왜 탐색 막대 메뉴의 기존 요소에 $ (document) .on ('click', '.ajaxLink', function (e) {...}가 바인드되지 않습니까? –

+0

@PH 확실하지 않을 수 있습니다. 다른 것들의 배수. 문제를 설명하는 jsfiddle을 만들 수 있습니까? – sQVe

+0

전에 jsfiddle을 사용하지 않았지만 시도해 보겠습니다. –

2

, 그것은 $('.ajaxLink') 반환 현재 일치하는 DOM 요소의 배열을 것, 그리고 $(document).on(’click') 언제든지 후손 호출되는 반면 on('click')는, 그 배열의 각 항목에 한 번 바운드됩니다 가 클릭 된 다음 .on() 메서드에서 전달 된 filert와 일치하는 경우에만 실행됩니다. 그와

마음에, 당신은 또한 다음과 같은 시도 할 수 :

$(".dropdown-menu").on("click", ".ajaxLink", function(e) { ... }); 
+0

예, 이것이 제가 sqve의 대답을 해석 한 방법입니다. 하지만 나에게 이것은'$ (document) .on ('click')'은 주로로드 된 문서의 모든 링크에 연결될 것이고 동적으로로드 된 내용에도 연결된다는 것을 의미합니다. 하지만 주로로드 된 콘텐츠의 링크에 첨부하지 않아도됩니다. 이것이 저를 궁금하게 만듭니다. –

관련 문제