2012-01-12 28 views
8

Tôi biết tải động/css động bằng cách thêm các thẻ <style> hoặc <link> vào đầu hoặc phần nội dung của trang, nhưng sau đó nó sẽ được thực thi bởi trình duyệt khi tải xuống. Tôi đã suy nghĩ về những cách khác để tải xuống nhưng không thực thi mã javascript/css. Đầu tiên điều gì sẽ đến trong tâm trí tôi là XMLHttpRequest:Các cách tải JavaScript hoặc CSS mà không cần thực thi chúng là gì?

//simple execution received script 
var executeScript = function(code){ 
    eval(code); 
}; 
//create XMLHttpRequest in cross-browser manner 
var xhr = createXMLHTTPObject(); 
//check whether file is loaded 
var checkStatus = function(){ 
    if(xhr.readyState == 4){ 
     if(xhr.status >= 200 && xhr.status < 300 || xhr == 304){ 
      executeScript(xhr.responseText); 
     } 
     else {//error 
     } 
    } 
}; 
//do request 
xhr.open('get','http://podlipensky.com/examples/dynamicscript/hey.js', true); 
xhr.onreadystatechange = checkStatus; 
xhr.send(null); 

Nhưng trong trường hợp này, chúng tôi đang giới hạn với kịch bản từ cùng một tên miền vì Policy xứ Same (mặc dù chúng ta có thể cố gắng workaround nó với CORS)

Một cách tiếp cận khác, tôi đã nghĩ đến là thêm động iframe vào trang và sau đó thêm script thẻ vào iframe, vì vậy tập lệnh sẽ được thực thi sau khi tải xuống, nhưng nó sẽ xảy ra trong ngữ cảnh của một trang khác - iframe.

Có cách nào khác để tải xuống và không thực thi tập lệnh không?

UPDATE:

Một trong những lý do tại sao nó sẽ hữu ích để tải về, nhưng không thực hiện javascript/css là pre-load thư viện của bên thứ ba, nhưng sử dụng chúng chỉ theo yêu cầu.

+3

Chỉ vì css/javascript được tải xuống không có nghĩa là nó được thực thi ngay lập tức. Đó là những gì các phương pháp/lớp học được cho. Ngoài ra, nếu bạn định sử dụng ajax, hãy sử dụng 'jQuery' – Darcy

+8

Có đúng là chỉ 23% trong số 83 câu hỏi khác mà bạn đã hỏi đã nhận được câu trả lời chấp nhận được không? –

+1

Đây là một cách độc đáo, nhưng chắc chắn không thực tế cho việc sử dụng bình thường http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html – qw3n

Trả lời

1

Bạn cũng có thể sử dụng iframe và sử dụng URL tập lệnh/css làm src của khung (vì vậy nó không được đánh giá/áp dụng), mặc dù bạn muốn chắc chắn trong trường hợp đó JavaScript/CSS được phân phối với Content-Type text/plain để tránh những điều không may xảy ra với các ký tự < và như vậy. Mặc dù bạn cũng nên gặp các vấn đề về SOP với cách tiếp cận này, trên trình duyệt phong nha, nếu iframesrc là từ một nguồn gốc khác.

Khác hơn thế, tôi nghĩ bạn phần lớn có nó được đề cập đến với các tùy chọn bạn liệt kê.

+0

Vâng, không quan trọng chính xác cách tải tập lệnh vào khung nội tuyến, nhưng dù sao cũng cảm ơn ... –

+0

@PaulPodlipensky: Không theo dõi bạn. Nó quan trọng rất nhiều nếu bạn không muốn kịch bản thực hiện ngay lập tức khi tải, đó là những gì câu hỏi của bạn dường như yêu cầu. Có ** rất nhiều ** một tập lệnh có thể thực hiện từ bên trong 'iframe' nếu bạn chạy nó (giống như trình duyệt ở một nơi khác hoàn toàn). Nếu bạn muốn * tải * nó mà không cần chạy nó, nó quan trọng như thế nào bạn làm điều đó, chắc chắn? :-) –

+0

Tôi có nghĩa là nếu tập lệnh được tải vào iframe, nó không thực sự quan trọng nếu nó thực thi hay không - bởi vì nó không thể làm được nhiều trong iframe và ngữ cảnh là iframe, không phải trang của tôi. Vì vậy, cả phương pháp tiếp cận của tôi và của bạn đều khả thi. Tôi chỉ tự hỏi liệu có cái gì khác mà chúng ta có thể tìm ra trong lĩnh vực này ... –

0

Nếu kịch bản của bạn đơn giản định nghĩa một hàm thì nó có thể được thực hiện mà không thực sự chạy bất cứ điều gì. Tất nhiên, điều này sẽ đòi hỏi sự hợp tác từ cả hai phía ala JSONP

//jsonp 
var result = {/*...*/}; 

//missingnonp 
var f = function(){ /**/ }; 
+0

đây không phải là trường hợp –

0

Giả sử bạn kiểm soát các máy chủ cung cấp trang, vào mà bạn muốn tải JS trong câu hỏi, cách dễ nhất là gửi URL thông qua AJAX đến máy chủ của bạn, tải nó từ đó (ví dụ thông qua PHP file_get_contents ($ url);) và lấy lại nó như là kết quả của cuộc gọi AJAX.

+0

OP bao gồm điều này trong câu hỏi. Câu hỏi là * "Có ** cách nào khác để tải xuống và không thực thi tập lệnh không?" * (Sự nhấn mạnh của tôi). –

+0

@ T.J.Crowder Tôi không thể thấy bất kỳ phần nào của OQ đề cập đến việc xử lý bên SERVER ... bạn có thể cụ thể hơn một chút không? –

+0

OP nói về việc sử dụng Ajax để lấy nội dung và nói về các vấn đề xung quanh (SOP, CORS, v.v.). Nếu bạn có nghĩa là sử dụng máy chủ của riêng mình như một proxy, câu trả lời là không rõ ràng về điều đó. –

4

Chỉ cần phát hiện ra thêm một tùy chọn để tải script/css không đồng bộ (không có mâu thuẫn với SOP) - là sử dụng <object> tag:

<object data="http://podlipensky.com/examples/dynamicscript/hey.js" /> 

Tìm thấy phương pháp này here. Vì vậy, tôi chỉ chia sẻ với bạn những phát hiện của tôi, hy vọng nó sẽ hữu ích.

+0

Điều này thực sự là đáng tin cậy hơn một khung nội tuyến vì các vấn đề được đề cập trong câu trả lời bởi @TJCrowder với iframe chạy kịch bản. Không tương thích với IE <= 8, nhưng bài đăng được liên kết giải thích một cách tiếp cận khác cho IE. –

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