2013-11-26 4 views
5

私はいくつかのWebサイトにJavaScriptウィジェットを提供しています。それらは非同期に読み込まれます。私のウィジェットは、私のコントロールの外に、別のパーティーが提供するスクリプトをロードする必要があります。サードパーティのスクリプトが読み込まれなくなるとすぐにJavaScriptを実行してください

スクリプトが正常に読み込まれたかどうかを確認する方法はいくつかあります。ただし、スクリプトの読み込みに失敗した場合は、別のコードを実行する必要があります。

動作しない明白なツールが含まれます:私は、jQueryのようのJavaScriptライブラリを使用して喜んでいないよ

  • 。ウィジェットを使用するサイトへの影響を最小限に抑えるには、非常に小さなスクリプトが必要です。

  • 私はできるだけ早く障害を検出したいので、タイマーを使用してポーリングすることは望ましくありません。私は、古いブラウザの最後の手段としてタイマーを使用しても構いません。

  • 私は<script>タグのonerrorイベントが一部の主要なブラウザでは信頼できないと判断しました。 (インストールされたアドオンに依存しているように見えました)

  • document.writeを含むものはどれも間違いありません。 (その方法は本質的に悪であることに加えdocument.writeページに悪いことを行うことができますので、私のコードは、非同期でロードされます。)

は、私は新しいで <script>をロード関与以前のソリューションを持っていました。そのiframeでは、 <script onload=...>イベントが既に発生しているかどうかをチェックするイベントハンドラを <body onload=...>に設定しました。 <script>は最初のドキュメントの一部であり、後で非同期で注入されなかったため、ネットワークレイヤが <script>タグで行われた後にのみ起動されます。 onload

ただし、親文書に読み込むスクリプトが必要です。それ以上iframeに入れることはできません。ネットワーク層がスクリプトを取得しようとするのをやめた直後に、コードをトリガーする別の方法が必要です。

私は "Deep dive into the murky waters of script loading"を読んで、どのブラウザでも何ができるか保証するための努力をしています。

私はそこに文書化技術を理解していれば:

  • 私は別の.jsのファイルに私の障害処理コードを配置する必要があります。
  • 次に、特定のブラウザでは、サードパーティスクリプトが実行されたか、または失敗した後にのみコードが実行されるようにすることができます。これは、どちらかのサポートするブラウザが必要です:DOMを経由してfalseに<script async>属性、
  • またはIE 6+で<script onreadystatechange=...>を使用して設定

async support tableを見ているにもかかわらず、私は、これが実現可能にするための十分なブラウザでスクリプトの順序に頼ることができるかどうかわかりません。

私が制御しないスクリプトの読み込み中にエラーを確実に処理する方法はありますか?

+0

スクリプト内に何かが存在するかどうかを確認しますか?スクリプトに特定のオブジェクトが含まれているように、 –

+0

@CrayonViolentを探してみると、スクリプトがロードされたと判断するのは簡単です。しかし、私はいつチェックするかを知る必要があります。私があまりにも早くチェックすると、スクリプトはまだダウンロードされていないでしょう。私は "まだロードされていない"と "私たちがあきらめたのでロードしない"の違いを伝える方法を知る必要があります。スクリプトが処理された後に私の小切手が実行されることを確かめることができれば、私はすべて設定されています。 –

+0

うまくいけば、スクリプト内で一意のものを確認することが最も信頼できる方法になります。しかし、実際には、setTimeoutを100msごとにx時間使用してからそれをやめないと、それをやり遂げる方法はないと思います。これは私がこれのような状況でやっていることであり、これまで私はよりよい方法を見つけていませんでした。/ –

答えて

2

は、私はそれが判明しても、これは私が実際に持っていた問題が解決しない、私は尋ねた質問を解決してきたと信じています。しかたがない。私の解決策は次のとおりです。

ブラウザがサードパーティのスクリプトを読み込もうとした後にいくつかのコードを実行して、正常に読み込まれたかどうかを確認します。フォールバックスクリプトの負荷を制限することで、サードパーティスクリプトが実行または失敗した後にのみ実行されます。フォールバックスクリプトは、サードパーティスクリプトが想定していたグローバルを作成したかどうかを確認できます。

クロスブラウザの順序通りのスクリプト読み込みhttp://www.html5rocks.com/en/tutorials/speed/script-loading/からインスピレーションを受けました。

var fallbackLoader = doc.createElement(script), 
    thirdPartyLoader = doc.createElement(script), 
    thirdPartySrc = '<URL to third party script>', 
    firstScript = doc.getElementsByTagName(script)[0]; 

// Doesn't matter when we fetch the fallback script, as long as 
// it doesn't run early, so just set src once. 
fallbackLoader.src = '<URL to fallback script>'; 

// IE starts fetching the fallback script here. 

if('async' in firstScript) { 
    // Browser support for script.async: 
    // http://caniuse.com/#search=async 
    // 
    // By declaring both script tags non-async, we assert 
    // that they need to run in the order that they're added 
    // to the DOM. 
    fallbackLoader.async = thirdPartyLoader.async = false; 
    thirdPartyLoader.src = thirdPartySrc; 
    doc.head.appendChild(thirdPartyLoader); 
    doc.head.appendChild(fallbackLoader); 
} else if(firstScript.readyState) { 
    // Use readyState for IE 6-9. (IE 10+ supports async.) 
    // This lets us fetch both scripts but refrain from 
    // running them until we know that the fetch attempt has 
    // finished for the first one. 
    thirdPartyLoader.onreadystatechange = function() { 
     if(thirdPartyLoader.readyState == 'loaded') { 
      thirdPartyLoader.onreadystatechange = null; 
      // The script-loading tutorial comments: 
      // "can't just appendChild, old IE bug 
      // if element isn't closed" 
      firstScript.parentNode.insertBefore(thirdPartyLoader, firstScript); 
      firstScript.parentNode.insertBefore(fallbackLoader, firstScript); 
     } 
    }; 
    // Don't set src until we've attached the 
    // readystatechange handler, or we could miss the event. 
    thirdPartyLoader.src = thirdPartySrc; 
} else { 
    // If the browser doesn't support async or readyState, we 
    // just won't worry about the case where script loading 
    // fails. This is <14% of browsers worldwide according to 
    // caniuse.com, and hopefully script loading will succeed 
    // often enough for them that this isn't a problem. 
    // 
    // If that isn't good enough, you might try setting an 
    // onerror listener in this case. That still may not work, 
    // but might get another small percentage of old browsers. 
    // See 
    // http://blog.lexspoon.org/2009/12/detecting-download-failures-with-script.html 
    thirdPartyLoader.src = thirdPartySrc; 
    firstScript.parentNode.insertBefore(thirdPartyLoader, firstScript); 
} 
0

窓のonerrorハンドラの使用を検討しましたか?これにより、ほとんどのエラーが発生したときにそれを検出し、適切な処置を取ることができます。このように捕まえられなかった問題の代替として、try/catchを使用して独自のコードを保護することもできます。

また、サードパーティのスクリプトが実際にロードされていることを確認する必要があります

<script type="text/javascript" onload="loaded=1" src="thirdparty.js"></script> 

そして、それがロードされているかどうかを確認:

window.onload = function myLoadHandler() { 
    if (loaded == null) { 
    // The script doesn't exist or couldn't be loaded! 
    } 
} 

をあなたはurlパラメータを使用して、エラーの原因となったスクリプトをチェックすることができます。

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) { 
    if (url == third_party_script_url) { 
    // Do alternate code 
    } else { 
    return false; // Do default error handling 
    } 
} 
+0

スクリプトエラーを移植可能に検出する例を挙げることができますが、特定の '

  • 11. UiTableviewCellが正しく読み込まれていない
  • 12. フォーマットが正しく読み込まれていないフュージョンチャートデータ
  • 13. Apacheが正しく読み込まれていないDocumentRoot
  • 14. AngularJSテンプレートが正しく読み込まれていない
  • 15. リクエストボディが正しく読み込まれていない
  • 16. スクリプトとしてPySparkを実行してください
  • 17. 読み込みインクルードファイルがPHPスクリプトの読み込みを遅くしますか?
  • 18. PHPスクリプトが読み込まれない
  • 19. divがページの読み込み時にスクロールダウンされていることを確認してください
  • 20. ターミナルでphp/mysqlスクリプトを実行しないでください
  • 21. ブラウザ内でスクリプトを実行しないでください
  • 22. Javascriptの問題、flexsliderスクリプトが読み込まれない
  • 23. EF、すべてのプロパティを読み込まないでください!
  • 24. 文が正しく実行されていないか試してみてください。
  • 25. Aフレーム:画像が読み込まれるまで実行を待つ方法を教えてください。
  • 26. フォルダ内の単純なループファイルの読み込みがまったく実行されない
  • 27. シンプルなJavascriptが正しく実行されている問題
  • 28. JavaScript window.open()はすぐにウィンドウを読み込まない
  • 29. Windows PowerShellは、行がなくなるまで行を読み込みます。
  • 30. インターネットがなくてもWebViewが読み込まれないようにする