2012-03-28 2 views
1

현재로서는 우리는 레일스 프로젝트를위한 하나의 common.js 파일에서 사이트 전체의 이벤트 리스너를로드하고 있습니다. 우리는 거기에 포함 된 절충안을 (대부분) 알고 있으며, 단지 완화하려고합니다. 기본 아키텍처가 확보되면 컨트롤러 또는보기별로 파일을 분리 할 수 ​​있습니다. 아무도 주위에 없을 때 이벤트 리스너가 숲에서 선언 된 경우Javascript 이벤트 수신기가 호출되고 대상 요소가없는 경우 어떻게됩니까?

: 순간

는 빠른 질문은 필요한 경우에만 우리는 망가, 의사 선 질문을 구걸하는이를 활성화 할 수있는 방법입니다 그것을 듣기 위해, 그것은 여전히 ​​소리가나요? 즉

, 하나는 주어진 페이지에 자바 스크립트의 기본 리스너 (예., .live() 또는 .delegate() 같은 지속적인 아무것도)를 선언하고 대상 요소가 특정 페이지에 실제로 존재하지 않는 경우는, 정말 아무것도하지 그런데 그것을 평가하고 요소에 대한 DOM을 확인하는 데 사용되는 몇 가지주기 이외의 다른 일이 발생 했습니까? 그것은 그 요소를 찾고있는 기억에서 활발한가요? 다른 것? 다른 컨텍스트에서 null/nil/invalid 유형의 오류를 생성하는 것과 같은 호출이 주어진다면 오류를 던진 것처럼 보이지 않습니다. 예컨대

:

$(document).ready(function() { 
     $('#element').bind('blur keyup', function); 
    } 

#element 그 가정은 존재하지 않는다. 실제로 일어나는 일이 있습니까?

$(document).ready(function() { 
    if ($('#element')) { 
     $('#element').bind('blur keyup', function); 
    } 

을 또는 단순히 $(document).ready에 존재하지의 요소에 선언 된 기본 수신기를 무시 똑똑 브라우저에서의 .js 통역은 다음과 같습니다 또한 그것은 어떤 같은 프리 필터에 포장하는 것이 좋습니다? 위의 초기 간단한 형식을 선언하고 그 부분을 남겨 두거나 먼저 요소를 확인하여 몇 가지 귀중한 자료를 저장하거나 보이지 않는 오류를 피할 수 있습니까? 아니면 또 다른 각도가 있습니까?

감사합니다.

+0

은 관련 맥락에서, 나는 단순히 신체 클래스를 기반으로 거의 모든 상황에서 청취자와 다른 스크립트를 분리하는 아름답고 우아한 방법을 발견 : [링크] (http://stackoverflow.com/questions/4480158/how-to-separate-jquery-event-on-page) 그러나 이것은 가장 큰 질문에 대답하지 못합니다. 간단히 말해서 : 청취자가 호출되고 요소가 누락되었을 때 실제로 어떤 일이 일어나고 있습니까? – XML

답변

4

JQuery는 선택된 요소를 0 개 이상 사용하도록 설계되었습니다.
요소를 선택하지 않으면 아무 것도 발생하지 않습니다.

jQuery 선택기를 사용할 때 절대 null이되지 않습니다. 예를 들어 :

$('#IDontExist') // != null 
$('#IDontExist').length === 0 // true (it's ajQuery object with 
           //  zero selected elements). 

docs는 말한다 :

어떤 요소가 제공 셀렉터에 일치하지 않는 경우, 새로운 jQuery를 객체가 "빈"입니다; 즉, 아무 요소도 포함하지 않고 .length 속성이 0입니다.

+0

완벽한 답변. 감사! 전통적인 Javascript 이벤트 핸들러를 JQuery없이 사용하면 어떤 것과도 일치하지 않는 선택기를 삭제하면 어떻게되는지 알 수 있습니까? – XML

+0

@XMLilley. _ "셀렉터"_를 버리면 무슨 뜻입니까? 어쨌든 빈 jQuery 객체의 모든 jQuery 함수는 아무 것도하지 않습니다. 오류 또는 조치 없음. – gdoron

+1

@XMLilley : getElementById와 같은 선택기 함수는 페이지에없는 경우 undefined를 반환하므로 var el = document.getElementById (" 엑스"); if (el) "eventcode" ' –

2

결과가 비어있는 경우 jQuery는 아무 것도 수행하지 않습니다.

jQuery는 항상 객체를 반환하므로 빈 세트에서도 메소드를 호출 할 수 있지만 내부적으로는 로직을 적용하기 전에 검사를 수행합니다.

이벤트 처리기를 연결하기 전에 요소가 있는지 확인하려는 경우에도 length jQuery 개체의 속성을 사용할 수 있습니다.

if ($('#element').length > 0) { 
    $('#element').bind('blur keyup', function); 
} 
+0

'if ($ ('element'). length' 대신'if ($ ('# element')) , 또는 내가 거기에 뭔가 빠졌나요? 내가 왜 그것을 시도했지만, 그것은 단지 파이썬에서와 마찬가지로 작동 할 것이라고 생각하지 않습니다. 나는 종종 .length'를 사용하는 패턴을 보았습니다. – XML

+0

jQuery는 요소를 찾지 못해도 항상 객체를 반환하고 'if (object)'가 항상 통과하므로 그 이유가 바로 그 이유입니다. 요소가 있는지 실제로 확인하려면 jQuery가 찾은 요소의 수를 줄 수있는'length' 속성을 사용하십시오. – ShankarSangoli

+0

빈 배열과 객체는 진실이고 빈 문자열은 위선입니다 – XML

관련 문제