2008-11-24 81 views
9

Làm việc trên dự án lớn, được tải cao Tôi đã gặp vấn đề đã được mô tả trong hàng tỷ chủ đề trên diễn đàn và blog, nhưng không có giải pháp nào giúp ích cho trường hợp của tôi. Đây là câu chuyện.javascript document.write trong tập tin js bên ngoài

Tôi có mã HTML của biểu ngữ, tôi không biết mã là gì. Đôi khi nó là HTML thuần túy, nhưng đôi khi nó là <script> thẻ với document.write bên trong nó với <script> thẻ có src để mạng DoubleClick trong đó.

Vì vậy, chúng tôi có: script> document.write> script (doubleclick).

mạng DoubleClick, như bạn có thể biết, hãy sử dụng document.write và hầu hết thời gian chúng cung cấp các biểu ngữ flash cần tải thêm một tệp js nữa.

Vì vậy, sau khi tất cả chúng ta có: script> document.write> script (DoubleClick)> document.write> script> ...

này hoạt động tốt khi bạn đặt nó trong HTML trực tiếp. Trang hiển thị 1 phần, tải banner1, tiếp tục hiển thị trang, tải banner2, hoàn tất hiển thị trang.

Nhưng bây giờ tôi cần hiển thị trang đầu tiên và chỉ sau biểu ngữ tải đó. Như biểu ngữ sử dụng document.write tôi cần phải tải nó trước khi sự kiện window.onload (lưu ý: sau khi window.onload document.write sẽ viết lại toàn bộ tài liệu.)

Những gì tôi đã làm:

Trong đầu phần Tôi có một đối tượng biểu ngữ (loại không gian tên thật khổng lồ :)), với phạm vi tài sản.

Khi render nên trang web và mã biểu ngữ là đáp ứng tôi đặt mã của các biểu ngữ vào phạm vi và đưa <div id="bannerPlaceHolder"+id></div> - vì vậy ở đây tôi sẽ cần phải đặt nội dung biểu ngữ sau này

Trang render và trước </body> tag Tôi đặt <script>banners.load()</script> phương pháp banners.load làm điều này cho mỗi mục trong mảng phạm vi:

document.write('<div id="codeHolder'+id+'">'); 
document.write(bannerCode); 
document.write('</div>'); 

Và chỉ sau này tôi có window.onload() sự kiện đó làm điều này:

mất tất cả băng rôn c odeHolders và nút-by-node nối thêm các nút từ codeHolder đến placeHolder, do đó, kết quả là tôi đã tải các biểu ngữ sau khi hiển thị trang và các biểu ngữ ở đúng vị trí.

Tất cả đều hoàn hảo ngoại trừ IE, nó tải bất kỳ tập lệnh js nào được nhúng trong DOM theo cách không đồng bộ, vì vậy document.write bên trong các tập lệnh nhị phân nối thêm các nút vào cuối tài liệu chứ không phải trong các nút codeHolder của tôi. Như thường lệ, nó chỉ có trong IE.

Tôi sẽ thực sự đánh giá cao những ai có thể biết giải pháp.

Trả lời

0

có lẽ bạn có thể sử dụng thuộc tính innerHTML: document.getElementById ("x"). InnerHTML = ".................";

Hoặc bạn có thể bạn DOM: createElement và AppendChild

+0

innerHTML không thực thi mã trong <'script> thẻ động Tôi không thể tạo tập lệnh dưới dạng mã html không thể kiểm soát được –

+0

nên có dòng mới giữa thẻ và động trong nhận xét trước –

1

Thông thường với các biểu ngữ bạn sẽ biết kích thước chính xác và vị trí, vậy làm thế nào về việc tạo ra một khung nội tuyến động với nội dung là những gì bạn có trong Bannercode và đó là tất cả .

0

tải nó vào một iframe ẩn (kích thước 0x0), sau đó di chuyển nó sang nơi khác với javascript

0

Tôi nghĩ giải pháp khung nội tuyến là xấu. Tại sao bạn không thể tải các biểu ngữ vào một trang riêng biệt và AJAX chúng thành một DIV?

0

Tách tệp document.write() - gọi trong các thẻ riêng biệt, do đó, đầu ra sẽ trông giống như:

document.write (''); document.write (bannerCode);

document.write ('');

IE sẽ đợi document.write (bannerCode) đã sẵn sàng và khi viết thẻ đóng.

3

Bạn cần writeCapture.js (tiết lộ đầy đủ: Tôi là tác giả.) Tất cả các phiên cược bị tắt với tập lệnh của bên thứ ba. Hôm nay họ sử dụng document.write để tạo một số HTML cụ thể, nhưng ngày mai họ có thể thay đổi nó và bất kỳ hack đơn giản nào dựa trên việc thay thế document.write sẽ cần phải được cập nhật. writeCapture chăm sóc điều đó. Việc sử dụng của bạn sẽ giống như sau:

$('#bannerPlaceHolder').writeCapture().html('<script type="text/javascript" src="http://doubleclick.net/bannerCode.js"></script>'); 

Thư viện có thể xử lý bất kỳ độ sâu tùy ý nào của thẻ tập lệnh và chỉ làm tốt với HTML xen kẽ. Nó cũng có một bản dựng độc lập nếu bạn không sử dụng jQuery.

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