2010-05-26 27 views
6

Tôi có một trang hoạt động hoàn toàn tốt trong Firefox, nhưng đang ném một lỗi trong IE. Tôi đang tải jQuery động (nếu nó chưa được tải), và sau đó làm một số công cụ trong khối jQuery (document) .ready(). Tuy nhiên, IE ném lỗi "Object expected" đáng sợ khi nó truy cập khối jQuery (document) .ready().IE7 jQuery (tài liệu) .ready() problem

Bạn có thể xem mã trang đầy đủ ở đây: http://www.pastie.org/977767

IE được ném lỗi ngay tại jQuery (document) .ready().

Mọi ý tưởng về những gì đang diễn ra ở đây? Một lần nữa, điều này hoạt động hoàn toàn tốt trong Firefox. Dường như gần như IE cho rằng jQuery được nạp nhưng nó vẫn chưa thực sự hoặc jQuery vẫn đang tải khi khối jQuery (document) .ready() gặp phải?

Trả lời

2

Khi bạn nối thêm tập lệnh vào tài liệu, nó sẽ được tải xuống không đồng bộ. Trong IE, tập lệnh sau ...

try{ 
jQuery(document).ready(function() { 
    jQuery.getScript("/CalendarViewer/js/utils.js", function(){ 
     jQuery.getScript("/CalendarViewer/js/groupcatselector.js", function(){ 
      jQuery.getScript("/CalendarViewer/js/calendarportlet.js", function(){ 
       jQuery.getScript("/CalendarViewer/js/calendarportletmain.js", function(){ 
        var cpm = calendarportletmain; 
        cpm.doEditDefaults("V_7f208bca412b42a68c19eb104bf46f14", "/CalendarViewer", groupCats_V_7f208bca412b42a68c19eb104bf46f14); 
       }); 
      }); 
     }); 
    }); 
}); 
}catch(err){ 
    alert("error in view.jsp="+err.number+" "+err.description); 
} 

... được phân tích cú pháp và thực thi trước khi IE hoàn tất tải xuống và phân tích cú pháp tập lệnh jQuery. Đây có thể không phải là trường hợp trong Firefox nếu Firefox đã lưu trữ tập lệnh, sẽ không mất thời gian để tải xuống và có thể được phân tích cú pháp ngay lập tức. Nó có thể phân tích cú pháp làm việc khác nhau, Firefox phân tích cú pháp kịch bản ngay sau khi nó được tải xuống và IE xếp hàng phân tích cú pháp cho đến khi luồng trở nên nhàn rỗi.

Bạn có thể di chuyển mã này đến cuối hàm setUpJquery, có nghĩa là nó sẽ chỉ được thực hiện khi đối tượng jQuery khả dụng. Ngoài ra, bạn có thể đặt mã bên trong hàm riêng của nó và gọi hàm đó từ hàm setUpJquery.

+0

Cảm ơn bạn, nhưng mã bạn thấy thực sự được chứa trong một số tệp khác nhau. Các kịch bản tải jQuery được sử dụng trên nhiều trang khác nhau, vì vậy tôi không thể đặt mã cụ thể trong đó. Có cách nào khác mà tôi có thể đặt một kiểm tra trên jQuery (tài liệu) .ready() và chỉ có nó được xử lý một lần jQuery thực sự được nạp? – Zendog74

+0

@ Zendog74: Bạn có thể làm cho jQuery trở thành một phần đồng bộ của tài liệu. Thay vì sử dụng DOM để nối thêm, sử dụng một cái gì đó như 'if (typeof jQuery ==" undefined ") document.write ('');'. Điều này sẽ đảm bảo rằng jQuery được tìm nạp trước khi các tập lệnh khác được chạy. –

+0

Cảm ơn ... điều đó đã xảy ra. Chắc chắn không phải là thanh lịch, nhưng nó hoạt động. Tôi muốn IE và FFX sẽ hành xử nhất quán khi tải các kịch bản bên ngoài, thở dài. – Zendog74

1

Cách tôi đã nhận xung quanh nó là:

$(document).ready(function() { 
    document_init(); 
}); 

function document_init() { 
    try{ 

    checkDivLoaded(); 

    [ ... do more stuff ... ] 

    } catch(err) { 
    setTimeout('document_init()', 200); 
    } 
} 

function checkDivLoaded() { 
    if ($('#targetDiv').length == 0) $jquery.error('not ready'); 
} 

Nó không phải là đẹp, nhưng nó hoạt động ... nó hoạt động trên một số tác phẩm, ở mọi trình duyệt tôi có thể nghĩ đến (mà tôi quan tâm) và có nghĩa là bạn không phải gây rối với mã nguồn của trang gốc. Vì vậy, bạn có thể giữ các thẻ rõ ràng.

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