2011-11-20 28 views
5

Trong Internet Explorer < 9, ít nhất, liên kết với tài nguyên bị chặn (do tường lửa, WebSense, v.v.) sẽ trả về lỗi. Ví dụ, nếu Facebook bị chặn, việc liên kết tới tệp JavaScript của SDK Facebook sẽ dẫn đến lỗi trong Internet Explorer.Phát hiện bằng JavaScript rằng tập lệnh bị chặn (bằng lọc web, tường lửa, v.v.)

Có thể kiểm tra xem một trang web bị chặn trong JavaScript, trước khi liên kết đến tập tin JavaScript bên ngoài, cho các mục đích sau:

  1. Ngăn chặn một lỗi JavaScript hiển thị trong trình duyệt Internet Explorer
  2. Nếu mã phụ thuộc vào tệp bên ngoài, nó có thể bị ngăn không cho chạy, để gây thêm các lỗi JavaScript liên quan đến việc thiếu thư viện bên ngoài
+0

câu hỏi tương tự: http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2032014#2032014 – Ktash

+0

Hai trong số các các câu trả lời khác trong câu hỏi @Kt đề cập tro cũng có thể hữu ích cho những người khác: http://stackoverflow.com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/2027892#2027892 sử dụng window.onerror và http: // stackoverflow .com/questions/2027849/how-to-trigger-script-onerror-in-internet-explorer/8066204 # 8066204 sử dụng onload. – ToolmakerSteve

Trả lời

3

Nhìn vào SDK facebook, có vẻ như nó được chèn không đồng bộ bằng cách chèn phần tử tập lệnh vào đầu. Điều này có nghĩa là tất cả những gì bạn phải làm là tạo trình xử lý gọi lại và nếu facebook bị chặn thì điều đó sẽ không bao giờ được gọi. Bạn không nên nhận bất kỳ lỗi tập lệnh trình duyệt nào. Vì vậy, bạn sẽ có thể làm điều gì đó như:

<div id="fb-root"></div> 
<script> 
    var FACEBOOK_BLOCKED = true; 
    window.fbAsyncInit = function() { 
    FACEBOOK_BLOCKED = false; 
    FB.init({ 
     appId  : 'YOUR_APP_ID', // App ID 
     channelURL : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File 
     status  : true, // check login status 
     cookie  : true, // enable cookies to allow the server to access the session 
     oauth  : true, // enable OAuth 2.0 
     xfbml  : true // parse XFBML 
    }); 

    // Additional initialization code here 
    }; 

    // Load the SDK Asynchronously 
    (function(d){ 
    var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;} 
    js = d.createElement('script'); js.id = id; js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
    }(document)); 
</script> 

Đối với một trường hợp sử dụng tổng quát hơn, một cách tiếp cận tương tự sẽ làm việc với bất kỳ kịch bản mà bạn có thể gọi sử dụng một cách tiếp cận JSON-P. Điều này, tất nhiên, đòi hỏi rằng các máy chủ có một chức năng gọi lại như một tham số (hoặc tự động gọi một pre-tên chức năng):

// Load some SDK Asynchronously 
(function(d){ 
    var js = d.createElement('script'); 
    js.src = "http://www.example.com?callback=myfunc"; 
    d.getElementsByTagName('head')[0].appendChild(js); 
}(document)); 

var SCRIPT_LOADED = false; 
var myfunc = function() { 
    SCRIPT_LOADED = true; 
} 

CẬP NHẬT

Chỉ cần đi qua this phương pháp, bạn có thể muốn để cung cấp cho nó một shot:

function loadScript(sScriptSrc, oCallback) { 
    var oHead = document.getElementById('head')[0]; 
    var oScript = document.createElement('script'); 
    oScript.type = 'text/javascript'; 
    oScript.src = sScriptSrc; 
    // most browsers 
    oScript.onload = oCallback; 
    // IE 6 & 7 
    oScript.onreadystatechange = function() { 
     if (this.readyState == 'complete') { 
      oCallback(); 
     } 
    } 
    oHead.appendChild(oScript); 
} 
+0

SDK Facebook chỉ đơn giản là một ví dụ. Mã này có hoạt động cho bất kỳ tập lệnh nào mà tôi tìm thấy không? – mc10

+0

Không, tôi đã cập nhật câu trả lời cho trường hợp sử dụng chung hơn. –

+0

Tuyệt vời, cảm ơn! – mc10

0

bạn có thể sử dụng hàm getScript của jquery, nó có chức năng thành công chỉ là execu Nếu kịch bản đã được tải, hãy kiểm tra xem tại đây: http://api.jquery.com/jQuery.getScript/

+0

Tôi không muốn phải sử dụng jQuery; tuy nhiên, nếu sử dụng jQuery là giải pháp duy nhất, tôi sẽ. – mc10

+0

Tôi nhìn vào getScript nhưng tôi tin rằng sử dụng ajax để nó có thể không hoạt động nếu các tập tin javascript bạn đang kéo không được lưu trữ trên tên miền của bạn. –

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