2013-07-10 26 views
12

Tôi đang tạo trình chỉnh sửa HTML thời gian thực tải sau khi DOM được hiển thị và tạo nguồn bằng cách lặp qua tất cả các nút. Tôi đã nhận thấy rằng khi tôi cố gắng đọc nodeValue của một nút văn bản có chứa một thực thể HTML, tôi luôn luôn nhận được giá trị unicode rendered của thực thể đó.nút văn bảnValue chứa thực thể HTML

Tôi làm cách nào để đọc nút văn bản được hiển thị và giữ mã thực thể HTML? (Sử dụng vani JS)

Ví dụ:

<div id="test">copyright &copy;</div> 
<script> 
var test = document.getElementById('test'); 
console.log(test.childNodes[0].nodeValue); 
// expected: copyright &copy; 
// actual: copyright © 
</script> 

Trả lời

6

Đáng tiếc là bạn không thể. Giao diện Text thừa hưởng từ CharacterData, và cả hai giao diện chỉ DOMStrings như một giá trị trả về, trong đó có chứa các ký tự Unicode cung cấp.

Hơn nữa, thuật toán phân tích cú pháp HTML5 về cơ bản sẽ xóa hoàn toàn đối tượng. Điều này được xác định trong một số phần của 8.2.4 Tokenization.

  • 8.2.4.1 trạng thái dữ liệu: mô tả rằng một dấu đặt phân tích cú pháp để tham chiếu nhân vật trong trạng thái dữ liệu
  • 8.2.4.2 Tham chiếu ký tự trong trạng thái dữ liệu mô tả rằng các thẻ tiếp theo là nên sử dụng dấu và. Nếu mọi thứ hoạt động tốt, nó sẽ trả về mã thông báo ký tự Unicode, chứ không phải thực thể!
  • 8.2.4.69 Mã hóa tham chiếu ký tự mô tả cách diễn giải &...; (về cơ bản thực hiện một số thứ và nếu mọi thứ đều OK, look it up in the table).

Vì vậy, vào thời điểm trình phân tích cú pháp của bạn đã hoàn thành thực thể đã biến mất và đã được thay thế bằng các ký hiệu Unicode. Đây không phải là điều đáng ngạc nhiên, vì bạn cũng có thể đặt biểu tượng © ngay vào mã HTML của mình nếu muốn.

Tuy nhiên, bạn vẫn có thể hoàn tác chuyển đổi rằng: bạn cần phải thực hiện một bản sao của table, và kiểm tra xem có bất kỳ ký tự trong tài liệu của bạn cho dù nó có một mục trong nó:

var entityTable = { 
    169: "&copy;" 
} 

function reEntity(character){ 
    var index = character.charCodeAt(0), name; 

    if(index < 127) // ignore ASCII symbols 
    return character; 

    if(entityTable[index]) { 
    name = entityTable[index]; 
    } else { 
    name = "#"+index; 
    } 
    return "&"+name+";" 
} 

Đây là khá nhiệm vụ rườm rà, nhưng do hành vi của trình phân tích cú pháp bạn có thể phải thực hiện. (Đừng quên kiểm tra xem ai đó đã làm điều đó).

+0

Đó là một chút đáng thất vọng. Tôi sẽ chỉ sử dụng một bảng, và có được một tự động hoàn thành. – Shea

+0

Có vẻ như có các ngoại lệ như '  ': Chuỗi 6 ký tự xuất hiện khi gọi' .innerHTML' trên các phần tử. Hãy thử: 'd = document.createElement ('i'); d.innerHTML = ' '; console.log (d.innerHTML) ' –

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