Tôi đang thực hiện một số thao tác của TextNodes trong javascript, và tôi (không may) cần hỗ trợ IE6. Node.normalize() đang bị lỗi và tôi cần giải quyết vấn đề này. Độ nghiêng đầu tiên của tôi là chỉ thực hiện lại nó bằng các phương thức DOM khác. Làm thế nào tôi sẽ thực hiện điều này?Node.normalize() treo trong IE6
Trả lời
Phiên bản Sau đây là ngắn hơn và hiệu quả hơn so với những người khác được đăng ở đây. Những cải tiến bao gồm:
- Không cuộc gọi lặp đi lặp lại để
node.childNodes
vànode.childNodes.length
- Không tạo ra các nút văn bản thêm; thay vào đó, đối với mỗi hợp nhất, giữ nút văn bản hiện đầu tiên và sử dụng phương pháp
appendData()
nó - ngắn
Mã:
function normalize(node) {
var child = node.firstChild, nextChild;
while (child) {
if (child.nodeType == 3) {
while ((nextChild = child.nextSibling) && nextChild.nodeType == 3) {
child.appendData(nextChild.data);
node.removeChild(nextChild);
}
} else {
normalize(child);
}
child = child.nextSibling;
}
}
Bạn cần phải xem xét đệ quy tất cả các nút con của nút hiện tại. Khi xem xét một nút, bạn sẽ xóa bất kỳ nút văn bản trống nào và kết hợp bất kỳ nút văn bản liền kề nào.
function myNormalize(node)
for each child node of node do
if child is not text
normalize(child)
else
if child node is empty
delete
continue
else
sibling = next node
while sibling exists and sibling is a text node
if sibling is empty
delete sibling
else
combine sibling with child
get next sibling
end
end
end
end
end
mã giả tốt. bạn có thể dịch nó sang javascript không? –
dựa trên giả tvanfosson của, đây là những gì tôi đã đưa ra trong javascript:
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
function normalize(node) {
for (i=0; i<node.childNodes.length; i++) {
var child = node.childNodes[i];
if (child.nodeType == ELEMENT_NODE) {
normalize(child);
continue;
}
if (child.nodeType != TEXT_NODE) { continue; }
var next = child.nextSibling;
if (next == null || next.nodeType != TEXT_NODE) { continue; }
var combined_text = child.nodeValue + next.nodeValue;
new_node = node.ownerDocument.createTextNode(combined_text);
node.insertBefore(new_node, child);
node.removeChild(child);
node.removeChild(next);
i -= 1;
}
}
Tôi thực sự ghét chấp nhận câu trả lời của riêng tôi, nhưng tôi đã phụ thuộc rất nhiều vào tvanfosson để đưa ra điều này, và tôi đã bình chọn anh ấy. –
Các giải pháp trên đã chạy rất chậm và đâm Firefox cho tôi. Vì vậy, tôi đã tối ưu hóa nó một chút và nó hoạt động tốt ngay bây giờ (vấn đề chính là liên tục tham chiếu đến đối tượng bộ sưu tập HTML node.childNodes).
Cảm ơn các điểm khởi đầu tuyệt vời, nhưng tôi figured này là giá trị niêm yết:
function myNormalize(node) {
for (var i=0, children = node.childNodes, nodeCount = children.length; i<nodeCount; i++) {
var child = children[i];
if (child.nodeType == 1) {
myNormalize(child);
continue;
}
if (child.nodeType != 3) { continue; }
var next = child.nextSibling;
if (next == null || next.nodeType != 3) { continue; }
var combined_text = child.nodeValue + next.nodeValue;
new_node = node.ownerDocument.createTextNode(combined_text);
node.insertBefore(new_node, child);
node.removeChild(child);
node.removeChild(next);
i--;
nodeCount--;
}
}
Tôi nghĩ rằng giải pháp cung cấp ở trên là không hoàn toàn chính xác. FWIW, đây là một chức năng bình thường hóa làm việc cộng với một hàm keo mà sử dụng bình thường hóa bản địa nếu nó có sẵn:
function _myNormalizeNode(node) {
if (! node) {
return;
}
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var child = node.firstChild;
while (child) {
if (child.nodeType == ELEMENT_NODE) {
this._myNormalizeNode(child);
}
else if (child.nodeType == TEXT_NODE) {
var next;
while ((next = child.nextSibling) && next.nodeType == TEXT_NODE) {
var value = next.nodeValue;
if (value != null && value.length) {
child.nodeValue = child.nodeValue + value;
}
node.removeChild(next);
}
}
child = child.nextSibling;
}
}
function _normalizeNode(node) {
if (! node) {
return;
}
if (typeof node.normalize == "function") {
return node.normalize();
}
return _myNormalizeNode(node);
}
Nhận xét về câu trả lời của tôi sẽ hữu ích nếu nó không chính xác. Ngoài ra, những gì bạn đã thực sự sửa chữa? –
- 1. Đa luồng JavaScript trong IE6?
- 2. IE6 background-position (?) Issue
- 3. CSS sprites và IE6
- 4. Tắt tính năng nén GZIP cho các máy khách IE6
- 5. Kiểm tra IE6 trên Mac OS X
- 6. Ember.js có hỗ trợ IE6 không?
- 7. IE6 - không thể tải JPG bình thường
- 8. Vấn đề chuỗi javascript đơn giản trong ie6 và ie7
- 9. Một vấn đề lạ khi sử dụng jquery trong IE6
- 10. Chiều rộng tối thiểu CSS trong IE6, 7 và 8
- 11. CSS - border-radius không hiển thị trong IE6/7/8
- 12. Đối tượng JSON trong IE6 - Làm thế nào?
- 13. Sử dụng các lớp kép trong CSS IE6?
- 14. IE6 min-height tiến thoái lưỡng nan
- 15. App treo trong FroYo & Gingerbread
- 16. file_get_contents treo
- 17. JavaScript 'treo'
- 18. Ai đang trực tuyến trong giá treo
- 19. Silverlight HttpWebRequest.Create treo bên trong khối async
- 20. Yêu cầu LDAP treo trong 15 giây
- 21. USB HID treo trên Read() trong C#
- 22. Các vòng lớn treo trong R?
- 23. Hỗ trợ lịch sử Angularj cho IE6 và IE7
- 24. Thư viện CSS (ví dụ: Bootstrap) hỗ trợ IE6?
- 25. Đăng bài HTTP dưới dạng IE6 bằng C#
- 26. Thanh trượt jQuery và các vấn đề IE6
- 27. Jenkins Treo mãi mãi
- 28. Kết nối JDBC treo
- 29. Vấn đề bố cục IE6 - định vị tuyệt đối
- 30. SendMessage (HWND_BROADCAST treo
1 cho '(không may)' – SLaks