2010-11-11 36 views
6

Tôi muốn phát hiện xem thẻ tập lệnh (được tạo động và thêm vào DOM) không tải được. Sự kiện onerror hoạt động, ngoại trừ với các tệp: // URL trong Firefox.Cách phát hiện tải tập lệnh của một tệp: // URL không thành công trong Firefox?

Rất tiếc, không có kỹ thuật nào trong số các kỹ thuật described here (ngoại trừ thời gian chờ, không được chấp nhận trong trường hợp của tôi) có vẻ hoạt động trong Firefox nếu src của thẻ tập lệnh là một tệp: // URL (hoặc URL tương đối và trang được tải qua file: // URL)

Kiểm tra trường hợp:

var script = document.createElement('script'); 
script.setAttribute('type', 'text/javascript'); 
script.setAttribute('src', 'doesnotexist.js'); 
script.onerror = function() { alert("Loading failed!"); } 
document.getElementsByTagName('head')[0].appendChild(script); 

tải này trong một trang HTML với một file: // URL. Sự kiện onerror sẽ không thực thi trong Firefox. Tải từ máy chủ web hoặc trên Safari hoặc Chrome và nó sẽ.

Điều này có vẻ giống như một lỗi đối với tôi. Có cách nào biết xung quanh nó không?

+7

Bạn nên chấp nhận câu trả lời cho câu hỏi của mình. – SLaks

+0

@Marcel Korpel: Anh ấy nói rằng thời gian chờ không phải là một lựa chọn, vì vậy điều đó sẽ không hiệu quả. – PleaseStand

+2

Để tham khảo, vấn đề với Firefox không kích hoạt sự kiện 'lỗi' khi URL dựa trên' file: // 'không tải được là [Bugzilla bug 621276] (http://bugzilla.mozilla.org/show_bug.cgi? id = 621276). –

Trả lời

1

Nếu bạn sử dụng giải pháp Pauls để truy xuất tài liệu nhưng bỏ qua kết quả. Nếu nó tải việc tạo thẻ script của bạn. Nhược điểm là tập tin sẽ tải hai lần.

+0

Vâng, đây là giải pháp mà tôi đã sử dụng ngay bây giờ, nhưng tôi không hài lòng về nó;) – tlrobinson

2
var loadScript = function(scriptURL, failureCallback) { 
    var script = document.createElement('script'), 
     scriptProtocol = scriptURL.match(/^([a-zA-Z]+:)\/\//); 
    script.setAttribute('type', 'text/javascript'); 

    if (navigator.product === 'Gecko' && 
     navigator.userAgent.indexOf('KHTML') === -1 && 
     window.location.protocol === 'file:' && 
     (!scriptProtocol || scriptProtocol[1] === 'file:')) { 

     var req = new XMLHttpRequest(); 
     req.open('GET', scriptURL, true); 
     req.onreadystatechange = function() { 
      if (req.readyState === 4) { 
       if (req.status === 0) 
        script.textContent = req.responseText; 
       else 
        failureCallback(); 
      } 
     }; 
     try { 
      req.send(null); 
     } 
     catch (e) { 
      failureCallback(); 
     } 
    } 
    else { 
     script.setAttribute('src', scriptURL); 
     script.onerror = failureCallback; 
    } 

    document.getElementsByTagName('head')[0].appendChild(script); 
}; 

loadScript('doesnotexist.js', function() { alert('Loading failed!'); }); 

Bit đột nhập, nhưng có vẻ như nó hoạt động.

+0

Như Tom đã chỉ ra, một nhược điểm của phương pháp này là bạn sẽ mất siêu dữ liệu gỡ lỗi cho tập lệnh nếu nó được tải thông qua XHR. –

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