webview中的load事件与location.href关系

最近开发遇到一个奇怪的问题,在安卓上的webview中js与原生系统的交互一般通过某些伪协议URL Schema,诸如location.href="http://api.xxx", 但如果此时你有一个正在类似异步处理的任务,如ajax请求,拉取图片,加载js,css等,这些资源的load事件可能不会被触发.

var script=document.createElement("script");  
script.src="a.js";  
script.onload=function(){  
    console.log("loaded");
}

location.href="abc://helloworld"  

本来安卓上shouldOverrideUrl事件会触发,因此java代码可以判断这个url是一个伪协议还是真实的http请求,也可以做到不卸载当前页面,继续留在当前页面,只认为这是js与我java的互操作

可是遇到这个问题之后反思:虽然页面没有被卸载,按理来说上面代码的load事件应该能够触发而不会被终止才对

但是考虑一种情况就是,当你的页面卸载之后,你这个页面还没返回的请求我要继续等待吗?浏览器当然是直接终止这个异步线程的任务,回收资源才是比较好的做法

例如我在a页面下载a图片还没返回,然后快速点击链接到B页面,此时a页面的a图片是不会有地方给它显示的,而且执行a页面图片下载的线程应该终止这个任务防止浪费浏览器的资源,那浏览器如何知道呢?

由于没有事件通知浏览器我马上就要离开这个页面了,因此我觉得如果是我设计的话当用户点击浏览器链接跳转的事件或者js设置location.href离开当前页面的代码执行完之后,浏览器应该马上停止当前页面的一些加载网络请求的行为,防止浪费线程资源,因此才会有前面说的一幕

当然还无法证明上述设想是否和浏览器的行为一致,但是逻辑上是比较通顺的

作者:shaynegui
喜欢打德州,玩dota,听电音,web前端脑残粉
我的专栏 GitHub