2012-03-30 3 views
5

코드 : http://jsfiddle.net/4hV6c/4/ 은 어떤 선택을, 당신은 jQuery는 IE8에서 .has를 지원하지 않습니다? 주위에 어떤 일이 일어나는가?

나는이 할 노력하고있어 IE8

에서 스크립트 오류가 발생합니다 :

$(end_node.parentNode).has(start_node) 

하는 최신 브라우저에서 (크롬, FF, 오페라 , etc.)는 start_node가 end_node.parentNode에 없으면 []를 반환하고 요소가 발견되면 반환합니다.

이제 end_node는 텍스트 요소이고 parentNode는 실제 DOM 엔터티입니다. IE는 수행 할 것이다. 단지 $(end_node).has(start_node)에있다. 그러나 그것은 명백하게 다른 행동이다.

작동시키기위한 해결 방법이 있습니까?

  • IE에서 바이올린 오류가 발생합니다. 다른 브라우저는 부울 값으로 경고합니다.

업데이트 : 내 특정 시나리오에서 .has()를 재정의하는 단어가 있습니다. 모든 것을 잘 모르는 경우 .has의 모든 사례에서 작동하는지 확실하지 않습니다. http://jsfiddle.net/8F57r/13/

+1

이것이 사실이라면 큰 문제가 될 것이고 jQuery 버그 보고서도있을 수 있습니다. – Sparky

+0

바이올린은 거짓말을하지 않습니다. = \ jQuery에서 누군가에게 연락 할 수 있는지/어딘가에 게시 할 수 있는지 알 수 있습니다. – NullVoxPopuli

+0

jsFiddle에서 예상되는 동작 순서와 예상되는 결과는 무엇입니까? 내가하는 일에 상관없이 "거짓"을 포함하는 경고가 나타납니다. Safari 사용. – Sparky

답변

4

문제는 하지 jQuery를하지만

console.log($("div:has(span)").html()); 
console.log($("div").has($("span")[0]).html()); 

실행

, 다음과 같은 예외를 throw이다 http://jsfiddle.net/mendesjuan/4hV6c/8/

var textNode = $("span")[0].childNodes[0]; 
$("div").has(textNode); 

즉, $.has에 텍스트 노드를 전달할 수 없다는 의미입니다. 당신은

jQuery를

와 노드의 contains 메소드를 호출하려고 다음과 같은 메시지

No such interface supported jquery-1.7.1.js, line 5244 character 3

에게주고 밖으로 erroring되는 라인을 버그를 제출해야한다. 이것이 의미하는 바는 jQuery가 작동하지 않는 IE 버그입니다. 난 당신이 원하는 것을 찾을 수 있습니까 $.hashttp://jsfiddle.net/4hV6c/10/

// This is broken in IE 
var textNode = $("span")[0].childNodes[0]; 
var divNode = $("div")[0]; 
divNode.contains(textNode); 

해결http://jsfiddle.net/4hV6c/12/

function contains(outer, inner) { 
    var current = inner; 
    do { 
     if (current == outer) { 
      return true; 
     } 
    } while((current = current.parentNode) != document.body); 

    return false; 

} 
rangy.init(); 

$(document).bind("mouseup", function() { 
    var a = rangy.getSelection(); 
    start_node = a.anchorNode; 
    end_node = a.focusNode; 
    var b = a.getRangeAt(0); 
    var c = b.commonAncestorContainer; 
    b.selectNodeContents(c); 
    a.setSingleRange(b); 
    alert(contains(end_node.parentNode, start_node)); 
}); 
+1

에 게시 된 단지 태그가 있으면 검색, 특정 요소를 확인해야합니다. 여러 스팬이있는 경우 어떻게됩니까? 또한 jQuery 선택기와 다른 점이 있습니까? – NullVoxPopuli

+0

특정 요소를 검사해도 괜찮습니다. 내 업데이트 –

+0

을 참조하십시오. 문제는 IE8에서 end_node.parentNode (div, span 또는 기타 항목 일 수 있으므로 확인되지 않은 DOM 요소 임)입니다. .has() 메소드. 당신은 .has()를 모든 div로 호출하고 있습니다. 또한, 첫 번째 span 일치를 얻기 위해 하드 코딩하고 있습니다 ... – NullVoxPopuli

1

언제나 DIY 할 수 있습니까? :) 재귀 자식 인덱싱은 매우 빠르게 작동하며 구현하기가 쉽습니다.

훌륭한 튜토리얼 여기를 참조하십시오 :

http://blog.swapnilsarwe.com/javascript-traversing-html-dom-recursively.html

+0

@KirkWoll - "우편 발송"? –

+0

@KirkWoll - 자세한 내용은 링크를 참조하십시오. 실제로는 쉽게 할 수 있습니다. 전체 트리를 만드는 대신 노드가 필요한 날씨를 확인할 수 있습니다. 그러나 위의 Juan의 답을 바탕으로 IE는'.has() '를 지원하여 OP가 할 필요가없는 것처럼 보일 것입니다. –

+1

이것은 jquery의 아이디어에 반하는 것입니다. jquery는 코드 작성자가 스스로 코드를 정리할 수 있도록 도와줍니다. – NullVoxPopuli

0

를 호출 할 필요없이 문제를 재현 한?

rangy.init(); 

$(document).bind("mouseup", function() { 
    var a = rangy.getSelection(); 
    start_node = a.anchorNode; 
    end_node = a.focusNode; 
    var b = a.getRangeAt(0); 
    var c = b.commonAncestorContainer; 
    b.selectNodeContents(c); 
    a.setSingleRange(b); 
    alert($(end_node.parentNode).find(start_node).length > 0); 
});​ 
+0

"개체가이 속성 또는 메서드를 지원하지 않습니다"= ( 은 ie8에서 작동하지 않습니다. = \ – NullVoxPopuli

관련 문제