2012-11-21 32 views
6

Kiểm tra jsfiddle này riêng trong Chrome và Firefox: http://jsfiddle.net/9aE2p/1/hasChildNodes() của các nút thuộc tính trả về kết quả khác nhau dành cho Chrome và Firefox

Cũng dán mã tương tự ở đây:

var xmlStr = '<?xml version="1.0" encoding="UTF-8"?><abc abc_attr="abc_attr_value"><abc_child abc_child_attr="abc_child_attr_value1"/><abc_child abc_child_attr="abc_child_attr_value2"/></abc>'; 

var parser = new DOMParser(); 
var xmlDoc = parser.parseFromString(xmlStr, "text/xml"); 

var path = 'abc/@abc_attr'; 

var nodes = xmlDoc.evaluate(path, xmlDoc, null, XPathResult.ANY_TYPE, null); 

var result = nodes.iterateNext(); 

while (result) { 
    var textContent = '<BR>result.textContent: "' + result.textContent + '"'; 
    var nodeType = '<BR>result.nodeType: "' + result.nodeType + '"'; 
    var resultHasChildren = '<BR>result.hasChildNodes(): ' + result.hasChildNodes(); 

    document.write(nodeType); 
    document.write(textContent); 
    document.write(resultHasChildren); 

    result = nodes.iterateNext(); 
} 

Những gì tôi nhận thấy là hasChildNodes() trả về false cho Firefox và đúng đối với Chrome.

Nếu nodeType là nút thuộc tính, thì trong Chrome, nút này có nút con có giá trị thực. Nhưng trong Firefox, nó không có bất kỳ nút con nào và giá trị được lưu trữ bên trong nút thuộc tính.

Tôi tò mò muốn biết liệu có bất kỳ tài liệu nào về sự khác biệt tinh tế này không?

Tôi đã kiểm tra các tài liệu sau nhưng không thể tìm thấy bất kỳ chi tiết cụ thể như:

https://developer.mozilla.org/en-US/docs/DOM/Node.hasChildNodes

http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-810594187

+0

người quan tâm, Opera đã đồng ý với Chrome – dmi3y

+0

Có thể nó liên quan đến Webkit vs Gecko. Opera có dựa trên webkit không? – bits

+0

không, họ có uy tín riêng, đoán rất cũ – dmi3y

Trả lời

2

Như vừa mới công bố trong nhận xét của tôi, tôi tin rằng điều này đã làm với thay đổi đối với các thuộc tính cách được thực hiện trong DOM4 trái ngược với phiên bản trước.

Trong các phiên bản trước đó giao diện Attr mở rộng Node. Điều này đã được thay đổi để bạn không thể sử dụng các phương thức Node nữa. Tuy nhiên, các thuộc tính namevalue vẫn tồn tại.

0

selector

var path = 'abc/@abc_attr'; 

lợi nhuận nút (attr), đó là bởi thiên nhiên không thể có nút con ở tất cả các thuộc tính, và có lý do để các nhà phát triển Mozilla (đoán) làm hasChildNodes() bị phản đối cho các thuộc tính.

selector

var path = 'abc[@abc_attr]' 

lợi nhuận yếu tố nút (Element)

mẫu ở đây:

http://jsbin.com/udugug/1

liên kết

đặc tả mà làm cho ánh sáng chút ở đây:

http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-637646024

Các vấn đề liên quan