2011-11-10 38 views
9

Tôi đã sử dụng phương thức $.parseXML() mới với jQuery 1.5. Bất cứ khi nào tôi chèn một phần tử mới vào đối tượng XML, phần tử mới đó sẽ tự động nhận thuộc tính 'xmlns' với giá trị "http://www.w3.org/1999/xhtml". Ví dụ, xem đoạn mã dưới đây:Làm cách nào để ngăn jQuery chèn các thuộc tính 'xmlns' vào một đối tượng XML?

var myXml = "<one attr='a'><two attr='b'/><three attr='c'><four attr='d'/></three></one>"; 
myXml = $.parseXML(myXml); 
$(myXml).find('three').append($('<five>some value</five>')); 

Mã này tạo ra các yếu tố sau:

<five xmlns="http://www.w3.org/1999/xhtml">some value</five> 

Làm thế nào để ngăn chặn jQuery từ chèn thuộc tính 'xmlns'? Tôi đã thử sử dụng phương pháp .removeAttr(), nhưng thậm chí không có vẻ như để làm việc. Bất kỳ ý tưởng?

CẬP NHẬT: Đề xuất mà người dùng nrabinowitz cung cấp là hữu ích trong việc giải quyết vấn đề này. Việc thêm một thuộc tính xlmns vào phần tử mức cao nhất sẽ ngăn không cho thuộc tính xlmns tự động được gán cho mỗi phần tử mới. Tuy nhiên, tôi đã chọn giải pháp khác cho chương trình cụ thể của mình. Thay vào đó, tôi đã sử dụng phương thức .replace() để loại bỏ tất cả các thuộc tính xlmns sau khi tôi đã chuyển đổi đối tượng XML trở lại thành một chuỗi (được hiển thị trên một trang web).

+3

Bạn đã thử thêm thuộc tính XMLNS của riêng mình vào phần tử gốc chưa? Tôi nghi ngờ rằng trong trường hợp không có một không gian tên rõ ràng, jQuery mặc định là XHTML. – nrabinowitz

+3

Tôi không nghĩ rằng jQuery tự nó thực hiện bất kỳ phân tích cú pháp XML nào cả. Thay vào đó, nó cho phép trình duyệt làm điều đó. (Nếu jQuery có một trình phân tích cú pháp XML hoàn chỉnh được tích hợp sẵn, nó sẽ thậm chí còn lớn hơn :-) * edit * yup đã kiểm tra mã nguồn - nó chỉ đưa XML của bạn cho một cá thể "DOMParser". – Pointy

Trả lời

3

cố gắng sử dụng

$(myXml).find('three').append('<five>some value</five>'); 
+0

Điều này làm việc cho tôi, cảm ơn. – Chris

+0

cũng làm việc cho tôi, nhưng trường hợp được thêm ' cho phần tử như mong muốn – BobbyTables

+0

Làm việc hoàn hảo trong Chrome, nhưng trong IE 11 thì không có gì được thêm vào. Kiểm tra nó: http://jsfiddle.net/eygqwwgt/2/ Bạn có một đầu mối tại sao? – Bjoerg

0

bạn cần phải làm như thế này:

var myXml = "<one attr='a'><two attr='b'/><three attr='c'><four attr='d'/></three></one>"; 

myXml = $.parseXML(myXml); 

var el=xmlDoc.createElement("yourElement"); 

$(myXml).find('three').append($(el)); 
+0

Giải pháp của bạn vẫn cung cấp cho không gian tên trong thẻ "yourElement". Xem tại: http://jsfiddle.net/Lzfg7zpv/ – Bjoerg

1

gì xảy ra là nút bạn đang chèn có tài sản namespaceURI khác.

Node nguồn gốc từ $ .parseXML

$($.parseXML('<node/>'))[0].namespaceURI 
// null 

nút tạo của bạn

$('<node>')[0].namespaceURI 
// "http://www.w3.org/1999/xhtml" 

Bạn muốn nút tạo của bạn để cũng có một namespaceURI giá trị null.

Để làm cho nút được tạo kế thừa vùng tên bằng cách sử dụng jQuery, cung cấp nút gốc làm đối số thứ hai cho $() như $('<five>some value</five>', myXml).

var myXml = "<one attr='a'><two attr='b'/><three attr='c'><four attr='d'/></three></one>"; 
myXml = $.parseXML(myXml); 
$(myXml).find('three').append($('<five>some value</five>', myXml)); 
Các vấn đề liên quan