2010-09-01 8 views
13

Tôi làm việc cho một công ty viết phần mềm mà trang web khách hàng nhúng với < ngôn ngữ kịch bản = "JavaScript" src = ..... v.v. Chúng tôi phụ thuộc khá một chút trên document.write để viết các phần tử ra trang. Một trong những khách hàng của chúng tôi vì một số lý do đã chọn sử dụng loại nội dung "application/xhtml + xml", điều này làm cho document.write() không sử dụng được trong chrome.Thay thế document.write() s trong trang xhtml + xml

Tôi hiểu tại sao điều này và mã tuân thủ DOM phải tạo mỗi phần tử, đặt thuộc tính của nó, điền vào nó bằng nút văn bản nếu cần, đính kèm nút văn bản vào cha mẹ và mã gốc. ..

nhưng giải pháp tốt là gì không yêu cầu tất cả rác này? Hàm write() trong đó có quá nhiều thành phần mà mã kết quả sẽ rất ghê gớm nếu chúng ta tạo ra các nút và gắn chúng lại với nhau như Knex hoặc Legos hoặc những gì bạn có.

chỉnh sửa: Cố gắng sử dụng CDATA, nhưng ngay cả dòng này được lên án tương tự bằng cách phân tích cú pháp xhtml trên cùng một trang như kịch bản của chúng tôi nhúng:

<script language="text/javascript"><![CDATA[document.write('hi');]]></script> 
+1

Thoạt nhìn, JSONML - http://jsonml.org/ - có vẻ như nó làm những gì bạn muốn, nhưng vì tôi vừa mới google và không dành quá nhiều thời gian để xem nó, tôi không đủ tự tin để gọi đây là câu trả lời. – Quentin

Trả lời

10
var el = document.createElement('div'); 
el.innerHTML = 'What you used to document.write()'; 
document.body.appendChild(el); 

Lưu ý rằng bạn sẽ cần phải sửa chữa HTML là XHTML hợp lệ, nhưng điều đó sẽ ít hơn nhiều so với việc chuyển đổi tất cả mã để sử dụng thao tác DOM.

+0

innerHTML sẽ không hoạt động trong XML –

+0

Nó thực hiện html là xhtml hợp lệ. Đoạn mã trên được điều chỉnh từ mã sản xuất, và bạn sẽ thấy jQuery sử dụng một kỹ thuật tương tự để xây dựng các đoạn. Trang thử nghiệm: http://pastebin.com/4akXVkv3 – stormsweeper

+0

Ok, có vẻ như nó được triển khai cho tất cả các trình duyệt hiện đại và là một phần của HTML5. Tôi sẽ trả lời câu trả lời của bạn nhưng tôi bị khóa trừ khi bạn chỉnh sửa nó. –

0

Chúng tôi đã sử dụng Jquery và đặt thời gian chờ để viết lại mã được cung cấp cho chúng tôi bởi các tổ chức tương tự cho tổ chức của bạn. Dưới đây là một ví dụ từ Tìm kiếm Ignite:

<script> 
<!-- 
// once all the page has loaded 
$(document).ready(function() 
    { 
     // wait a bit so everything else that runs when the page has loaded loads, then... 
     setTimeout(function() 
     { 
      // ...load the tracking stuff 
      var headerTag = document.getElementsByTagName('head')[0]; 
      var seo_tag = $.createElement(document.location.protocol + "//track.searchignite.com/si/CM/Tracking/ClickTracking.aspx?siclientid=123456&jscript=1", "script"); 
      headerTag.appendChild(seo_tag); 

     }, 20); 
    }); 
// --> 
</script> 

Thời gian chờ đã lợi ích bổ sung làm cho trang của chúng tôi đáp ứng cho người dùng trước khi mã bên ngoài đã được tải bởi trình duyệt người dùng, rất hữu ích nếu máy chủ của nhà cung cấp bên ngoài của từng đi xuống. Có, chúng tôi mất một số thống kê theo dõi nhưng trải nghiệm người dùng không bị xâm phạm.

Rõ ràng bạn sẽ không thể dựa vào JQuery nhưng bạn sẽ có được ý tưởng chung.

2

Có lẽ bạn có thể tạo iframe loại text/html, viết nội dung vào đó, sau đó nhập các nút trở lại trang chính.

+0

+1 cho một ý tưởng rất sáng tạo, mặc dù câu trả lời được chấp nhận có lẽ đơn giản hơn. – MatrixFrog

+0

URL đã thay đổi trong khung sẽ không hiển thị trong trình duyệt, do đó người dùng không thể thêm trang cụ thể vào dấu trang – cwtuan