Javascript onload 和脚本回调函数,哪个优先?

标签 javascript callback onload onerror external-script

我正在加载一个使用回调函数的外部脚本,它会返回一些特定的数据。如果未收到此数据,则应显示错误。

这是我编写的代码:

<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 处理程序?

https://jsfiddle.net/5sfk9ht5/4/

最佳答案

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/

相关文章:

javascript - 使用数组而不是参数数组

javascript - 参数函数中未定义。什么时候应该使用它?

c++ - Maya API - 从 Material 中获取网格

css - div 类在加载页面时淡入淡出

jQuery - 如果值与数组中的元素匹配,则禁用复选框

javascript - 在 React 中保护路由的最佳选择是什么?

javascript - sequelize中如何返回非唯一的join表记录?

c++ - 生成指向回调函数的常量指针数组

typescript - "Inject"带有异步/等待的回调

javascript - 无法在 image.onload 内生成输出