2009-12-27 35 views
6

Tôi đang cố gắng đóng gói một javascript mà tôi đã tạo bằng jQuery, jQuery UI, Biểu mẫu jQuery và xmlDom.Tự động tải jQuery và các tiện ích mở rộng

Tôi muốn có thể gửi cho khách hàng của mình chỉ một javascript tham chiếu đến các trình duyệt khác, bao gồm chỉ một phần nhỏ của js cho các cài đặt tùy chọn.

Tìm dưới đây một ví dụ:

<script language="javascript"> 
var myOptions = { 
    shop: 1, 
    style: "gold" 
} 
load(); 
</script> 
<script src="http://myServer/myScript.js" type="text/javascript"></script> 

Đó là gần như không thể đối với tôi để tải jQuery và plugin tự động. Tôi đọc rất nhiều ví dụ, jQuery hoạt động tốt khi tôi tải nó động, nhưng phần còn lại của các phần mở rộng không bao giờ làm việc đúng cách. trình tự sau đây là một trong những độc đáo mà nạp ít nhất một vài plugins:

Đặt một chức năng tải mà tải jQuery động:

load = function() { 
    load.getScript(url_base + "/js/jquery-1.3.2.js"); 
    load.tryReady(0); 
} 
load.getScript = function(filename) { 
    var script = document.createElement('script') 
    script.setAttribute("type","text/javascript") 
    script.setAttribute("src", filename) 
    if (typeof script!="undefined") 
    document.getElementsByTagName("head")[0].appendChild(script) 
} 
load.tryReady = function(time_elapsed) { 
    // Continually polls to see if jQuery is loaded. 
    if (typeof $ == "undefined") { // if jQuery isn't loaded yet... 
    if (time_elapsed <= 5000) { // and we havn't given up trying... 
     setTimeout("load.tryReady(" + (time_elapsed + 200) + ")", 200); // set a timer to check again in 200 ms. 
    } else { 
     alert("Timed out while loading jQuery.") 
    } 
    } else { 
    ... 
    } 

tải mỗi Plugin sau đó, jQueryForm, jQuery UI, xmlDom

Khi tôi kiểm tra biểu mẫu jQuery có sẵn:

if (jQuery().ajaxForm) 

Khi tôi kiểm tra xmlDom nó hoạt động.

Khi tôi kiểm tra giao diện người dùng jQuery, nó không bao giờ có sẵn.

if(jQuery().ui) 

Tôi không đặt thời gian chờ đợi giao diện người dùng, nó không bao giờ được tải. Dường như jQuery thực hiện các tính năng giao diện người dùng của tôi trước khi nó được tải.

Ai đó có thể gửi cho tôi liên kết để trợ giúp điều này không?

+0

Khi bạn xem html là thẻ tập lệnh ui trong đầu? Điều gì sẽ xảy ra khi bạn kiểm tra 'if (jQuery.fn.ajaxForm)'? – czarchaic

+0

Dòng mà bạn đã đề cập đến công trình, ý tôi là, biểu thức là đúng. Tôi cần tất cả các phần mở rộng được tải trước khi kịch bản của tôi. Tôi có thể nhận được một giải pháp cho IE nhưng nó không hoạt động trong Chrome và Firefox, đó là kiểm tra những điều kiện trong một khoảng thời gian nhất định cho đến khi nó trở thành sự thật hoặc trả về theo thời gian chờ. –

Trả lời

3

Như Zen của Python nói, "Đơn giản là tốt hơn phức tạp". Tất cả những mớ hỗn độn này có hết thời gian chờ không? Như tôi giả định, trình duyệt sẽ CÓ tải tất cả các thư viện js theo bất kỳ cách nào (để thực thi tệp "myScript.js" của bạn), vì vậy không dễ dàng hơn khi đưa chúng vào "bình thường" không?

+0

Tôi đánh giá cao nhận xét của bạn nhưng tôi cần thực hiện theo cách khác. –

+0

Sau đó, bạn đã cố gắng làm cho chức năng 'tải' của bạn mà không có bất kỳ thời gian chờ? Điều đó sẽ giúp (tôi đã làm như vậy và nó đã làm việc). Nếu không, bạn cũng có thể thử di chuyển việc đưa 'myScript.js' của bạn từ đầu vào phần thân của tài liệu. –

7

Có lẽ, this might help. Từ dive.into.javascript trang web:

SidJS là một trọng lượng nhẹ Javascript thư viện sử dụng để nạp JavaScript script và stylesheet CSS theo yêu cầu. Nó làm tăng các ứng dụng AJAX hiệu suất bằng cách tải tài nguyên khi cần có .

Được giảm thiểu với Google Closure Compiler, nó nặng ở mức 1,12KB (625 byte khi GZipped).

Nếu bạn hoàn toàn không thể bao gồm thư viện javascript khác, bạn có thể xem mã (không có nhiều, thực sự); với những ý tưởng trong đó, bạn sẽ có thể sửa kịch bản của mình.

EDIT
Nếu bạn sử dụng Closure Compiler Google để rút gọn kịch bản, bạn sẽ cần phải thêm lại dòng node.sheet.cssRules. Dường như nó được sử dụng trong các trình duyệt Gecko và Webkit, để kiểm tra nếu một bản định kiểu được tải xuống hoàn toàn đã được tải xuống hoàn toàn (tất nhiên, nếu bạn không tải các bảng định kiểu tải xuống, bạn có thể xóa hoàn toàn phần đó).

+0

Điều này đã cứu mạng tôi, cảm ơn! –

+1

Khi tôi lần đầu tiên thực hiện điều này, tôi đã nhận được lỗi 'appendChild' khi cố gắng thêm tệp js. Nhưng css sẽ làm việc tốt. Lý do là vì tôi đã bao gồm điều này trong thẻ 'head' trước khi' body' có sẵn trong DOM. Vì vậy, bạn cần phải quấn một '$ (tài liệu) .ready();' xung quanh nó để làm cho nó hoạt động. – SammyK

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