æµè§å¨å 许æä»¬è·è¸ªå¤é¨èµæºçå è½½ ââ èæ¬ï¼iframeï¼å¾ççã
è¿éæä¸¤ä¸ªäºä»¶ï¼
onloadââ æåå è½½ï¼onerrorââ åºç° errorã
å è½½èæ¬
å设æä»¬éè¦å è½½ç¬¬ä¸æ¹èæ¬ï¼å¹¶è°ç¨å ¶ä¸ç彿°ã
æä»¬å¯ä»¥åè¿æ ·å¨æå è½½å®ï¼
let script = document.createElement('script');
script.src = "my.js";
document.head.append(script);
â¦â¦ä½å¦ä½è¿è¡å¨è¯¥èæ¬ä¸å£°æç彿°ï¼æä»¬éè¦çå°è¯¥èæ¬å è½½å®æï¼ä¹åæè½è°ç¨å®ã
å¯¹äºæä»¬èªå·±çèæ¬ï¼å¯ä»¥ä½¿ç¨ JavaScript moduleï¼ä½æ¯å®ä»¬å¹¶æªè¢«å¹¿æ³åºç¨äºç¬¬ä¸æ¹åºã
script.onload
æä»¬çå¾åå©ææ¯ load äºä»¶ãå®ä¼å¨èæ¬å 载并æ§è¡å®ææ¶è§¦åã
ä¾å¦ï¼
let script = document.createElement('script');
// å¯ä»¥ä»ä»»æåï¼domainï¼ï¼å 载任æèæ¬
script.src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"
document.head.append(script);
script.onload = function() {
// è¯¥èæ¬å建äºä¸ä¸ªåé "_"
alert( _.VERSION ); // æ¾ç¤ºåºççæ¬
};
å æ¤ï¼å¨ onload 䏿们å¯ä»¥ä½¿ç¨èæ¬ä¸çåéï¼è¿è¡å½æ°çã
â¦â¦å¦æå 载失败æä¹åï¼ä¾å¦ï¼è¿é没æè¿æ ·çèæ¬ï¼error 404ï¼æè æå¡å¨å®æºï¼ä¸å¯ç¨ï¼ã
script.onerror
åçå¨èæ¬å è½½æé´ç error ä¼è¢« error äºä»¶è·è¸ªå°ã
ä¾å¦ï¼æä»¬è¯·æ±ä¸ä¸ªä¸åå¨çèæ¬ï¼
let script = document.createElement('script');
script.src = "https://example.com/404.js"; // 没æè¿ä¸ªèæ¬
document.head.append(script);
script.onerror = function() {
alert("Error loading " + this.src); // Error loading https://example.com/404.js
};
请注æï¼å¨è¿éæä»¬æ æ³è·åæ´å¤ HTTP error ç详ç»ä¿¡æ¯ãæä»¬ä¸ç¥é error æ¯ 404 è¿æ¯ 500 æè å ¶ä»æ åµãåªç¥éæ¯å 载失败äºã
onload/onerror äºä»¶ä»
è·è¸ªå è½½æ¬èº«ã
å¨èæ¬å¤çåæ§è¡æé´å¯è½åçç error è¶
åºäºè¿äºäºä»¶è·è¸ªçèå´ãä¹å°±æ¯è¯´ï¼å¦æèæ¬æåå è½½ï¼åå³ä½¿èæ¬ä¸æç¼ç¨ errorï¼ä¹ä¼è§¦å onload äºä»¶ã妿è¦è·è¸ªèæ¬ errorï¼å¯ä»¥ä½¿ç¨ window.onerror å
¨å±å¤çç¨åºã
å ¶ä»èµæº
load å error äºä»¶ä¹éç¨äºå
¶ä»èµæºï¼åºæ¬ä¸ï¼basicallyï¼éç¨äºå
·æå¤é¨ src çä»»ä½èµæºã
ä¾å¦ï¼
let img = document.createElement('img');
img.src = "https://js.cx/clipart/train.gif"; // (*)
img.onload = function() {
alert(`Image loaded, size ${img.width}x${img.height}`);
};
img.onerror = function() {
alert("Error occurred while loading image");
};
使¯æä¸äºæ³¨æäºé¡¹ï¼
- 大夿°èµæºå¨è¢«æ·»å å°ææ¡£ä¸åï¼ä¾¿å¼å§å è½½ã使¯
<img>æ¯ä¸ªä¾å¤ãå®è¦çå°è·å¾ src(*)åæå¼å§å è½½ã - 对äº
<iframe>æ¥è¯´ï¼iframe å è½½å®ææ¶ä¼è§¦åiframe.onloadäºä»¶ï¼æ è®ºæ¯æåå è½½è¿æ¯åºç° errorã
è¿æ¯åºäºåå²åå ã
è·¨æºçç¥
è¿éæä¸æ¡è§åï¼æ¥èªä¸ä¸ªç½ç«çèæ¬æ æ³è®¿é®å
¶ä»ç½ç«çå
容ãä¾å¦ï¼ä½äº https://facebook.com çèæ¬æ æ³è¯»åä½äº https://gmail.com çç¨æ·é®ç®±ã
æè ï¼æ´ç¡®åå°è¯´ï¼ä¸ä¸ªæºï¼å/端å£/åè®®ä¸è ï¼æ æ³è·åå¦ä¸ä¸ªæºï¼originï¼çå 容ãå æ¤ï¼å³ä½¿æä»¬æä¸ä¸ªååï¼æè ä» ä» æ¯å¦ä¸ä¸ªç«¯å£ï¼è¿é½æ¯ä¸åçæºï¼å½¼æ¤æ æ³ç¸äºè®¿é®ã
è¿ä¸ªè§åè¿å½±åå ¶ä»åçèµæºã
妿æä»¬ä½¿ç¨çæ¯æ¥èªå ¶ä»åçèæ¬ï¼å¹¶ä¸è¯¥èæ¬ä¸åå¨ errorï¼é£ä¹æä»¬æ æ³è·å error ç详ç»ä¿¡æ¯ã
ä¾å¦ï¼è®©æä»¬ä½¿ç¨ä¸ä¸ªèæ¬ error.jsï¼è¯¥èæ¬åªå
å«ä¸ä¸ªï¼é误ï¼å½æ°è°ç¨ï¼
// ð error.js
noSuchFunction();
ç°å¨ä»å®æå¨çåä¸ä¸ªç½ç«å è½½å®ï¼
<script>
window.onerror = function(message, url, line, col, errorObj) {
alert(`${message}\n${url}, ${line}:${col}`);
};
</script>
<script src="/article/onload-onerror/crossorigin/error.js"></script>
æä»¬å¯ä»¥çå°ä¸ä¸ªå¾å¥½ç error æ¥åï¼å°±åè¿æ ·ï¼
Uncaught ReferenceError: noSuchFunction is not defined
https://javascript.info/article/onload-onerror/crossorigin/error.js, 1:1
ç°å¨ï¼è®©æä»¬ä»å¦ä¸ä¸ªåä¸å è½½ç¸åçèæ¬ï¼
<script>
window.onerror = function(message, url, line, col, errorObj) {
alert(`${message}\n${url}, ${line}:${col}`);
};
</script>
<script src="https://cors.javascript.info/article/onload-onerror/crossorigin/error.js"></script>
æ¤æ¥åä¸ä¸é¢é£ä¸ªç¤ºä¾ä¸çä¸åï¼å°±åè¿æ ·ï¼
Script error.
, 0:0
error ç详ç»ä¿¡æ¯å¯è½å æµè§å¨èå¼ï¼ä½æ¯åçæ¯ç¸åçï¼æå ³èæ¬å é¨çä»»ä½ä¿¡æ¯ï¼å æ¬ error å æ è·è¸ªï¼é½è¢«éèäºãæ£æ¯å ä¸ºå®æ¥èªäºå¦ä¸ä¸ªåã
为ä»ä¹æä»¬éè¦ error ç详ç»ä¿¡æ¯ï¼
å 为æå¾å¤æå¡ï¼æä»¬ä¹å¯ä»¥æå»ºèªå·±çæå¡ï¼ä½¿ç¨ window.onerror çå¬å
¨å± errorï¼ä¿å error å¹¶æä¾è®¿é®ååæ error çæ¥å£ãè¿å¾å¥½ï¼å 为æä»¬å¯ä»¥çå°ç±ç¨æ·è§¦åçå®é
ä¸ç errorã使¯ï¼å¦æä¸ä¸ªèæ¬æ¥èªäºå¦ä¸ä¸ªæºï¼originï¼ï¼é£ä¹æ£å¦æä»¬ååçå°ç飿 ·ï¼å
¶ä¸æ²¡æå¤ªå¤æå
³ error çä¿¡æ¯ã
å¯¹å ¶ä»ç±»åçèµæºä¹æ§è¡ç±»ä¼¼çè·¨æºçç¥ï¼CORSï¼ã
è¦å
许跨æºè®¿é®ï¼<script> æ ç¾éè¦å
·æ crossorigin ç¹æ§ï¼attributeï¼ï¼å¹¶ä¸è¿ç¨æå¡å¨å¿
é¡»æä¾ç¹æ®ç headerã
è¿éæä¸ä¸ªçº§å«çè·¨æºè®¿é®ï¼
- æ
crossoriginç¹æ§ ââ ç¦æ¢è®¿é®ã crossorigin="anonymous"ââ 妿æå¡å¨çååºå¸¦æå å«*ææä»¬çæºï¼originï¼ç headerAccess-Control-Allow-Originï¼åå 许访é®ãæµè§å¨ä¸ä¼å°ææä¿¡æ¯å cookie åéå°è¿ç¨æå¡å¨ãcrossorigin="use-credentials"ââ 妿æå¡å¨åéå带ææä»¬çæºç headerAccess-Control-Allow-OriginåAccess-Control-Allow-Credentials: trueï¼åå 许访é®ãæµè§å¨ä¼å°ææä¿¡æ¯å cookie åéå°è¿ç¨æå¡å¨ã
ä½ å¯ä»¥å¨ Fetchï¼è·¨æºè¯·æ± ä¸ç« ä¸äºè§£æå
³è·¨æºè®¿é®çæ´å¤ä¿¡æ¯ãè¿ä¸ç« æè¿°äºç¨äºç½ç»è¯·æ±ç fetch æ¹æ³ï¼ä½çç¥æ¯å®å
¨ç¸åçã
è¯¸å¦ âcookieâ ä¹ç±»çå å®¹è¶ åºäºæ¬ç« çèå´ï¼ä½ä½ å¯ä»¥å¨ Cookieï¼document.cookie ä¸ç« å¦ä¹ å®ä»¬ã
卿们ç示ä¾ä¸æ²¡æä»»ä½è·¨æºç¹æ§ï¼attributeï¼ãå æ¤ï¼è·¨æºè®¿é®è¢«ç¦æ¢ã让æä»¬æ¥æ·»å å®å§ã
æä»¬å¯ä»¥å¨ "anonymous"ï¼ä¸ä¼åé cookieï¼éè¦ä¸ä¸ªæå¡å¨ç«¯ç headerï¼å "use-credentials"ï¼ä¼åé cookieï¼éè¦ä¸¤ä¸ªæå¡å¨ç«¯ç headerï¼ä¹é´è¿è¡éæ©ã
妿æä»¬ä¸å
³å¿ cookieï¼é£ä¹å¯ä»¥éæ© "anonymous"ï¼
<script>
window.onerror = function(message, url, line, col, errorObj) {
alert(`${message}\n${url}, ${line}:${col}`);
};
</script>
<script crossorigin="anonymous" src="https://cors.javascript.info/article/onload-onerror/crossorigin/error.js"></script>
ç°å¨ï¼å设æå¡å¨æä¾äº Access-Control-Allow-Origin headerï¼ä¸å齿£å¸¸ãæä»¬æäºå®æ´ç error æ¥åã
æ»ç»
å¾ç <img>ï¼å¤é¨æ ·å¼ï¼èæ¬åå
¶ä»èµæºé½æä¾äº load å error äºä»¶ä»¥è·è¸ªå®ä»¬çå è½½ï¼
load卿åå è½½æ¶è¢«è§¦åãerrorå¨å 载失败æ¶è¢«è§¦åã
å¯ä¸çä¾å¤æ¯ <iframe>ï¼åºäºåå²åå ï¼ä¸ç®¡å è½½æåè¿æ¯å¤±è´¥ï¼å³ä½¿é¡µé¢æ²¡æè¢«æ¾å°ï¼å®é½ä¼è§¦å load äºä»¶ã
readystatechange äºä»¶ä¹éç¨äºèµæºï¼ä½å¾å°è¢«ä½¿ç¨ï¼å 为 load/error äºä»¶æ´ç®åã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼