2011-01-31 5 views
2

에 부착 된 경우 내가 이것을 실행 해요 확인jQuery를 & livequery 함수는 요소

(function($) { 
    $.fn.blah = function(){ 
    var that = this; 
    return this.each(function(){ 
     $(this).bind('change', function(){ 
      // do some stuff here 

      return true; 
     }).change(); 

    }); 
}; 

})(jQuery); 

과 HTML은 다음과 같습니다

<div id="boo"> 
<div class="content"> 
    <input type="text" /> 
    <input type="text" /> 
    ... 
</div> 
</div> 

<div class="content">  
<input type="text" /> 
<input type="text" /> 
</div> 
... 

그래서 내가하려는 것은 모든 기능에 & 이벤트를 첨부하는 것입니다. t 요소는 #boo 안에 있지 않습니다. 이 방법이 효과적이지만 문제는 매초마다 반복적으로 문제가 발생하여 브라우저가 정지하는 것입니다.

html이 가끔 업데이트되기 때문에 livequery가 필요하며 새로운 요소에 이벤트를 다시 첨부해야합니다.

입력 요소에 이미 blah()이 적용되었는지 확인하려면 어떻게합니까?

답변

1

당신이 $.data(object, 'events')를 조회 할 때 당신은 그것을에 부착 된 이벤트의 속성 다시 개체를 가져옵니다. 따라서 귀하의 경우 다음 조건을 추가 할 수 있습니다 :

(function($) { 
    $.fn.blah = function(){ 
    var that = this; 
    return this.each(function(){ 
     if ($.data($(this).get(0), 'events') !== void(0) && 
      $.data($(this).get(0), 'events').change === void(0)) { 
      $(this).bind('change', function(){ 
       // do some stuff here 
       return true; 
      }).change(); 
     } 
    }); 
}; 
})(jQuery); 

... 아직 함수가 아닌 경우에만 바인딩 할 수 있습니다.

2

저는 솔직히 그렇게하지 않을 것입니다. 첫 번째 진술은 큰 NoNo입니다. 마크 업의 모든 단일 노드를 쿼리하고 필요한 요소를 제외하면됩니다. 왜 이런 식으로 일을하지 : 여기 내 범위에서 인 할 더 아무것도없는 경우 물론

$('input').filter(function() { return !!$(this).closest('#boo').length }) 
      .live('change', function() { 
       // do some stuff here 
      }).change(); 

이 만, 의미가

. 하지만 여기에는 .livequery이 필요하지 않은 것 같습니다.

업데이트

위의 코드는 작동하지 않을 수 있습니다. 그러나이 그것을 수행해야합니다

$('input').live('change', function() { 
    if(!$(this).closest('#boo').length) { 
     // do some stuff here 
    } 
}).change(); 
+0

그녀는 #boo에없는 사람들 만 원하기 때문에 필터 기능에 단 하나의 '!'가 있어야한다고 생각합니다. 어쨌든 +1 – mVChr