권장

2011-05-12 2 views
4

배경 정보권장

createTreeWalker 방법의 NodeFilter 속성이 콜백 함수 대신 콜백 함수를 포함하는 객체가 있다고 생각 어디에 버그가 IE9 현재 존재한다. 이런 통화

:

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, filter, false);

filter 웹킷과 도마뱀에서 "방법 acceptNode 포함 된 객체"로 정의된다; 그러나 IE9에는 acceptNode에 대한 언급이 전혀 없습니다. 객체 둘러싸 기가없는 "콜백 메소드"가 필요합니다.

실제 질문

그래서 명시 적 브라우저 감지을하지 않고이 문제를 를 해결하는 가장 좋은 방법은 무엇입니까? 어떤 경우에는 filter 메서드가 필요하고 다른 메서드에서는 메서드가 포함 된 개체가 필요합니다. 이 작업을 수행 할 수있는 명확한 방법이 있습니까? 이 브라우저의 모든 DOM 2.0을 지원 주장, 그래서 나는 그에서 테스트 할 수 없습니다 ...

문서 - 버그 증명 여기

는 각 문서의 비교입니다 :

  1. W3C Spec
  2. Gecko
  3. Webkit
  4. Microsoft ("NodeFilter는 콜백 함수입니다 ..."- WRONG)
+1

Gecko는 거의 10 년 동안 acceptNode 메소드가 포함 된 객체와 콜백 함수를 허용했습니다. https://bugzilla.mozilla.org/show_bug.cgi를 참조하십시오.id = 113008 – Neil

+0

의심의 여지가 없습니다. 그러나 표준에서는 콜백을 포함하는 객체라는 것을 명시합니다. 이 의견은 하루 종일 문제를 해결하는 데는 효과가 없습니다. IE9는 표준을 지원하지 않습니다. 그래서 나는 ... 당신의 요점은 무엇입니까? –

+0

이것은 답이 아니라 주석이었습니다. 콜백이 도움이 될 경우 적어도 하나의 다른 브라우저에서 작동한다는 점을 지적하고자했습니다. – Neil

답변

6

글쎄, 나는 작동하는 한 가지를 생각해 냈습니다. 더 나은 대안을 엽니 다

var filter = { acceptNode: function() { 
    //do filtering... 
} }; 

// Hackzilla. A true W3C-compliant nodeFilter object isn't passed, and instead a "safe" one _based_ off of the real one. 
var safeFilter = filter.acceptNode; 
safeFilter.acceptNode = filter.acceptNode; 

document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, safeFilter, false); 

이 같은 좋은 브라우저가 나쁜 것을 시도하고 즉시 실행됩니다 필터 객체에 .acceptNode를 호출합니다 작동합니다.

대체품?

+1

당신은'function filter() {/ * ... * /} '을 써서 해킹을 개선 할 수있을 것입니다. filter.acceptNode = filter;' – Neil

+0

충분합니다; 이 경우 코드가 최적 인 것처럼 보입니다. – Neil

+0

(죄송합니다, 내 의견을 저크가 덜한 것처럼 말끔히 삭제하고 동일하게 대체하십시오.) - 불행히도 저는'필터 '의 인스턴스화를 제어 할 수 없습니다. :) –

5

실제로 IE 9 입니다. 이는 ECMAScript를 함수 참조입니다

있는 NodeFilter

객체 다음 ECMAScript bindings section of the DOM spec를 읽어보십시오. 이 메서드는 Number를 반환합니다. 매개 변수는 Node 객체입니다.

따라서 일치하는 브라우저 (모든 주요 브라우저의 최신 버전 포함)는 모두 filter 매개 변수로 함수를 허용합니다.

+0

흥미 롭습니다! (겉으로보기에) 모순 된 정의는 무엇입니까? –

+0

DOM에는 handleEvent() 메소드 (http://www.w3.org/)가 포함 된 객체 인'EventListener'로 지정된 listener 파라미터를 가진'addEventListener()'와 같은 다른 유사한 예제가있다. TR/DOM-Level-2-Events/events.html # Events-EventListener), ECMAScript 바인딩 섹션은'EventListener'가 함수 참조가되도록 지정합니다. DOM이 단일 프로그래밍 언어에 묶여 있지 않고 Java와 같은 많은 언어가 함수를 첫 번째 클래스 객체로 지원하지 않고 대신 모든 함수를 메소드로 요구하기 때문에 이렇게 지정되었다고 생각합니다. –

+0

+1, +1. 통찰력에 감사드립니다. –