2012-03-30 15 views
5

mã: http://jsfiddle.net/4hV6c/4/ chỉ thực hiện bất kỳ lựa chọn, và bạn sẽ nhận được một lỗi script trong IE8jQuery không hỗ trợ .has trong IE8? một công việc xung quanh là gì?

Tôi đang cố gắng để làm điều này:

$(end_node.parentNode).has(start_node) 

đó trong các trình duyệt hiện đại (chrome, ff, opera , vv) trả về [] nếu start_node không nằm trong end_node.parentNode và trả về phần tử (tôi quên cái nào) nếu nó được tìm thấy.

bây giờ, end_node là phần tử văn bản và parentNode là thực thể DOM thực tế. IE sẽ thực hiện .has chỉ trên $(end_node).has(start_node) nhưng đó rõ ràng là hành vi khác nhau.

Có công việc nào để làm việc này không?

  • trong IE fiddle sẽ xảy ra lỗi, các trình duyệt khác sẽ cảnh báo bạn với giá trị boolean.

CẬP NHẬT: đây là một từ xung quanh ghi đè .has() cho trường hợp cụ thể của tôi .. không chắc chắn nếu nó hoạt động cho tất cả các trường hợp .has, như tôi không biết tất cả. http://jsfiddle.net/8F57r/13/

+1

Nếu điều này thực sự đúng, nó sẽ là một vấn đề lớn và cũng có báo cáo lỗi jQuery liên kết với nó, phải không? – Sparky

+0

fiddle không nói dối. = \ Tôi sẽ xem liệu tôi có thể liên lạc với ai đó tại jQuery/đăng bài này ở đâu đó không. – NullVoxPopuli

+0

Trình tự hoạt động dự kiến ​​và kết quả mong đợi trong jsFiddle của bạn là gì? Tôi nhận được một cảnh báo có chứa "sai" bất kể tôi làm gì. Sử dụng Safari. – Sparky

Trả lời

4

Vấn đề là không jQuery

Chạy

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

Tuy nhiên, sau ném một ngoại lệ http://jsfiddle.net/mendesjuan/4hV6c/8/

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

Điều đó có nghĩa là bạn không thể chuyển nút văn bản vào $.has. Bạn nên báo cáo lỗi với jQuery

Dòng được erroring ra là đưa ra các thông báo sau

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

Đó là cố gắng để gọi phương thức contains trên một nút. Điều đó có nghĩa là đây thực sự là một lỗi IE mà jQuery đã không làm việc xung quanh. Tôi đã sao chép các vấn đề mà không cần phải gọi $.hashttp://jsfiddle.net/4hV6c/10/

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

Cách giải quyếthttp://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

nó không chỉ phát hiện nếu nó có một thẻ, tôi cần phải kiểm tra các yếu tố cụ thể. Bởi vì nếu có nhiều nhịp? Ngoài ra, không phải là khác với bộ chọn jQuery? – NullVoxPopuli

+0

Kiểm tra một phần tử cụ thể cũng hoạt động tốt, xem cập nhật của tôi –

+0

vấn đề là trong IE8, end_node.parentNode (là phần tử DOM chưa xác định đối với tôi, vì nó có thể là div, span hoặc bất kỳ thứ gì) không có .has() phương pháp. Bạn đang gọi .has() một EVERY div ... ALso, bạn đang hardcoding để có được kết hợp nhịp đầu tiên .... – NullVoxPopuli

1

Bạn luôn có thể tự làm? :) Tôi nghe thấy việc lập chỉ mục con đệ quy hoạt động nhanh chóng và khá dễ thực hiện.

Xem ở đây cho một hướng dẫn tuyệt vời:

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

+0

@KirkWoll - "được gửi bằng thư"? –

+0

@KirkWoll - Xem liên kết để biết chi tiết, nó thực sự là khá dễ dàng để làm. Thay vì xây dựng toàn bộ cây bạn chỉ có thể kiểm tra thời tiết nút là cái bạn cần. Tuy nhiên, dựa trên câu trả lời của Juan ở trên có vẻ như IE hỗ trợ '.has()' làm điều này không cần thiết cho OP làm. –

+1

Điều này đi ngược lại ý tưởng của jquery, nơi mà tất cả các công cụ gritty được thực hiện cho bạn để giúp giữ sạch mã của riêng bạn. – NullVoxPopuli

0

Có thấy làm những gì bạn muốn?

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

"Đối tượng không hỗ trợ thuộc tính hoặc phương thức này" = ( hoạt động không phải là ie8. = \ – NullVoxPopuli