我正在加载一个使用回调函数的外部脚本,它会返回一些特定的数据。如果未收到此数据,则应显示错误。
这是我编写的代码:
<script>
//setting initial state so that function will only work once
var visitors_loaded=false;
var my_callback = function( data ) {
if (visitors_loaded) return 0;
if (data) {
//success: callback function is called and it has a proper data
visitors_loaded=true;
alert(JSON.stringify(data));
}
else alert ('error'); //something went wrong
};
</script>
<script onload="my_callback(null)" onerror="my_callback(null)"
src="https://api.clicky.com/api/stats/4?site_id=32020&sitekey=9a19b1a4d1171193&type=visitors&date=this-month&output=json&json_callback=my_callback"></script>
如您所见...脚本可能会出现很多问题,因此我很自然地添加了一个onerror 事件。如果您将脚本的主机名或域更改为不存在的内容,则此错误事件实际上会触发。
但是,如果您只更改脚本的 url,它仍然可以连接到服务器并触发 onload 事件。那些无效请求不会调用我的回调函数,因此我还添加了一个onload 处理程序。
现在的问题是,如果所有加载正常并返回数据,它将同时触发回调函数 和onload。我注意到回调函数在 onload 之前触发并设置了 visitors_loaded 变量,以便处理函数只被调用一次。
到目前为止,它在 JS fiddle 和我的离线站点中运行良好,但我想知道这是否是预期的行为? json_callback 函数是否始终优先于 onload 处理程序?
最佳答案
Will that json_callback function always have precedence before the onload handler?
如果外部脚本同步调用 my_callback
那么是。
官方中的脚本
部分html5 specification描述了这些东西应该如何工作。该规范非常笼统,必须处理很多细节,包括编码、CORS、ignore-destructive-writes counter
等等。但是对于这个问题,我们不关心这些细节。
在第4步有一个注释:
Note: This is where the script is compiled and actually executed.
在第 7 步中,load
事件被触发:
fire a simple event named load at the script element.
因此规范定义了 load
事件总是在脚本执行后触发。
如您所见,规范还告诉我们为什么在更改 URL 时不会触发 onerror
事件。 error
事件仅在加载脚本失败时创建。但是对 https://api.clicky.com/api/stats/
的所有请求都会返回 HTTP 200 状态。无效的 URL 返回 XML,因此抛出 SyntaxError。但这不会导致触发 onerror
处理程序。
正如其他人所提到的,如果异步调用回调,他们可以在 onload
事件之后调用您的回调。但我看不出他们会在您的外部脚本中执行此异步操作的原因。
关于Javascript onload 和脚本回调函数,哪个优先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37762047/