2011-04-06 28 views
8

Dường như JavaScript tự động chuyển đổi các ký tự đặc biệt nhất định thành các thực thể HTML khi xuất nội dung thông qua hàm innerHTML(). Đây là một vấn đề, vì tôi cần có khả năng xuất ra < và> mà không cần chuyển đổi thành gt; và lt;Javascript - sử dụng innerHTML cho chuỗi đầu ra * KHÔNG * Ký tự đặc biệt được mã hóa HTML?

Chuyển đổi tự động này có thể được ngăn chặn, đảo ngược hoặc bị thoát không? Cho đến nay, bất kể tôi làm gì, < và> luôn tự động được mã hóa thành các thực thể HTML.

Ví dụ mã:

function DisplayQueries() { 
    var IDs = ['AllOpenedINC','AllOpenedCRQ','AllClosedINC','AllClosedCRQ','SameDayINC','SameDayCRQ','NotSameDayINC','NotSameDayCRQ', 
     'StillOpenINC','StillOpenCRQ','OpenOldINC','OpenOldCRQ','OtherQueuesINC','OtherQueuesCRQ'] 

    for (var i = 0; i < IDs.length; i++) { 
     if (eval(IDs[i])) 
      document.getElementById(IDs[i]).innerHTML = eval(IDs[i]); 
    } 
} 

Ví dụ truy vấn biến:

AllOpenedINC = "('Company*+' = \"test\" OR 'Summary*' = \"%test%\") AND ('Submit Date' >= \"" + theDate + 
    " 12:00:00 AM\" AND 'Submit Date' <= \"" + theDate + " 11:59:59 PM\")" + nameINC; 
+0

Bạn có thể gửi một số mẫu mã (và cho chúng tôi biết trình duyệt bạn đang chạy nó trong)? –

+0

Bạn có muốn chèn thẻ (XML của một số loại), sau đó bạn có thể sử dụng .appendChild ("") ;, nhưng tôi có một cảm giác đó không phải là những gì bạn muốn? – Guidhouse

+0

Thông tin thêm về những gì nó là, bạn muốn thực hiện xin vui lòng – Guidhouse

Trả lời

0

Tôi đã tìm hiểu điều gì đang diễn ra. Không có cách nào dễ dàng để ngăn chặn innerHTML chuyển đổi các ký tự đặc biệt sang các thực thể HTML, nhưng vì vấn đề đã xuất hiện khi sao chép nội dung của một DIV vào clipboard (sử dụng JS chỉ có IE, hoạt động vì nó nằm trong môi trường chính phủ nơi mọi người đều có để sử dụng IE), tôi chỉ sử dụng hàm replace() để chuyển đổi các thực thể HTML trở lại thành < và>.

+0

Vâng, innerHTML thực sự không chuyển đổi bất cứ điều gì. Trong trường hợp của tôi, đó là khuôn mẫu ria mép đang chuyển đổi công cụ. –

1

Tôi nghĩ rằng câu hỏi của bạn được dựa trên một giả thuyết sai lầm. Chỉ cần thực hiện một thử nghiệm rất đơn giản:

document.getElementById("testdiv").innerHTML = '<h1><em>Hello</em></h1>'; 

nếu điều này hoạt động tốt thì vấn đề không nằm ở phía JS, thay vào đó bạn sử dụng một số thành phần khác trong hệ thống mã hóa HTML ký tự của bạn.

+0

Vâng, ngay cả khi tôi làm document.getElementById ("testdiv"). InnerHTML = '< test >'; nó vẫn mã hóa các đối tượng HTML là < and >. Nó có vẻ như nó chỉ bỏ qua những người cho các thẻ HTMl thực tế, có lẽ ..? – ClairelyClaire

+0

@shifuimam Có thể chuỗi của bạn được truyền trực tiếp tới trình phân tích cú pháp HTML và các ký tự không được hiểu là HTML hợp pháp được chuyển đổi. - Đây chỉ là vấn đề nếu bạn muốn chèn HTML bị hỏng vào tài liệu. Tôi có thể hỏi bạn mục đích của bạn là gì? Có lẽ chúng ta có thể đề xuất các giải pháp khác. - Bạn có thể thêm điều này vào câu hỏi ban đầu của mình. – vbence

+0

Tôi đã thêm một ví dụ về văn bản mà tôi đưa ra cho câu hỏi ban đầu của mình. Văn bản là truy vấn sử dụng toán hạng như <= and > = ..đó là những biểu tượng được tự động chuyển đổi thành các thực thể. – ClairelyClaire

1

Bạn nên tập trung vào những gì bạn muốn đạt được kết quả, thay vì cách thực hiện. innerHTML() không mã hóa, innerText() và textContent() cũng mã hóa. Vì vậy, bạn nên giải mã các chuỗi của bạn nếu bạn muốn chúng như < hoặc> trở lại.

Bạn có thể sử dụng chức năng unescapeHTML() này để nhận kết quả như bạn muốn.

function unescapeHTML() { 
    return this.stripTags().replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&'); 
    } 

Tôi hy vọng điều này sẽ hữu ích. Tôi đã sao chép nó từ Prototype.

+0

Tôi thực sự, thực sự không muốn sử dụng một khung công tác JS chỉ cho một chức năng. Có một chức năng thủ công mà những gì stripTags() không? – ClairelyClaire

+0

Bạn không phải sử dụng khung công tác. Bạn chỉ có thể sử dụng chức năng này mà không cần sử dụng khung công tác. Tôi đã sao chép nó từ khung công tác cho bạn. Bao gồm nó bên trong các thẻ của bạn. – celiker

-2

Bạn có thể sử dụng jquery.append()

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