Rumah  >  Artikel  >  hujung hadapan web  >  Analisis penggunaan dan contoh kemahiran window.onerror()_javascript

Analisis penggunaan dan contoh kemahiran window.onerror()_javascript

WBOY
WBOYasal
2016-05-16 15:17:282066semak imbas

sintaks kesilapan menggunakan

onerror mempunyai tiga parameter input secara lalai:

•msg: mesej ralat
•url: Fail di mana ralat terletak
•baris: Baris kod tempat ralat terletak, integer
window.onerror = function(msg, url, line){ // beberapa kod }; Untuk bentuk 76dc30a2218f22243eb63e771bb54ab1, parameter boleh diperolehi melalui hujah[0], hujah[1] dan hujah[2] dalam urutan.

Apa yang paling biasa kami gunakan dalam js ialah toleransi kesalahan js

window.onerror=function(){return true;}

Ciri Asas
Anda boleh menghalang penyemak imbas daripada memaparkan mesej ralat dengan menetapkan returnValue=true, atau kembali benar secara langsung. Tetapi ia tidak akan menghalang kotak penyahpepijatan daripada muncul oleh penyahpepijat skrip.
Onerror hanya akan dicetuskan oleh ralat masa jalan, bukan oleh ralat sintaks.

Onerror boleh dicetuskan dalam tiga cara berikut:

• Ralat masa jalan seperti rujukan objek tidak sah atau sekatan keselamatan

• Muat turun ralat seperti gambar
•Dalam IE9, kegagalan untuk mendapatkan data multimedia juga akan mencetuskan
Teg 855348821b2e8f2cc4b633bf98f064df tidak menyokong onerror.

Atribut onerror yang ditakrifkan pada teg 6c04bd5ca3fcae76e30b72ad730ca86d adalah bersamaan dengan window.onerror (diuji, disokong oleh Firefox dan Opera, tetapi tidak bertindak balas dalam IE9 dan chrome).

Keserasian Pelayar

Sokongan untuk onError dalam setiap penyemak imbas yang disenaraikan oleh QuirksMode

•Chrome 13

•Firefox 6.1
•Internet Explorer 5.5
•Safari 5.1
•Opera 11.61 (QuirksMode tidak disokong oleh 11.51 apabila diuji, tetapi 11.61 yang saya ada sudah menyokongnya)
Selain objek tetingkap, elemen yang menyokong onerror:

•a1f02c36ba31691bcfe87b2722de723b Sokongan penuh

•855348821b2e8f2cc4b633bf98f064df IE9/IE10/safari 5.1/chrome 13 disokong
3a674e06c111e35179a3a4f5628fe265 dan d5ba1642137c3f32f4f4493ae923989c

Masalah dan Penyelesaian

Untuk ralat dalam merujuk fail js luaran, penyemak imbas

Webkit dan Mozilla akan mengganggu maklumat ralat asal, mengakibatkan tiga parameter input terakhir yang diperolehi oleh onerror:

Salin kod Kod adalah seperti berikut:
"Ralat skrip.","", 0

例如http://a.com/index.html,引入了http://b.com/g.js,如果g.js出错,最终传递到window.onerror的信息会被篡改。

浏览器之所以做这样的处理,是考虑到两个特性:

•3f1c4e4b6b16bbbd69b2ee476dc4f83a 能执行非同源下的第三方js文件。
•3f1c4e4b6b16bbbd69b2ee476dc4f83a 元素会忽略加载的文件的MIME类型,而当作脚本来执行。
在攻击场景中,恶意页面引入了正常页面的js文件,js文件会自动执行,若发生异常触发的报错信息,可能会泄漏某些敏感数据。这些信息最终会被恶意页面的window.onerror处理。

经测试,存在此特性的浏览器(当前最新版)有Firefox、Chrome、Safari、Opera。

Adam Barth(work on the security of the Chrome browser at Google)建议的解决方案是使用CORS (Cross-Origin Resource Sharing)。

简言之,当在页面中 3f1c4e4b6b16bbbd69b2ee476dc4f83a 引入外部js文件时,增加一个属性crossorigin(类似于a1f02c36ba31691bcfe87b2722de723b 的CROS属性)。服务器在接受到请求时,在HTTP Header里增加一个授权字段(值可以是具体的某个域名):

Access-Control-Allow-Origin: *

浏览器检测到此js已经授权此页面所在域名,则不用再篡改由此js传递到window.onerror的错误信息了。

经测试,此方案尚未被浏览器实现。
已经在Chrome、Firefox的较新版本中支持。

其他参考资料

Internet Explorer http://msdn.microsoft.com/en-us/library/cc197053.aspx

Mozilla Firefox https://developer.mozilla.org/en/DOM/window.onerror

Opera http://dev.opera.com/articles/view/better-error-handling-with-window-onerror/

Wiki http://www.w3.org/wiki/DOM/window.onerror

syntax errors and runtime errors http://www.htmlgoodies.com/primers/jsp/article.php/3610081/Javascript-Basics-Part-11.htm

window.下面是一些实例大家可以参考下:

onerror = function(sMessage,sUrl,sLine){};

onerror函数的三个参数用于确定错误确切的信息,代表的意思依次为:错误信息;发生错误的文件;发生错误的行号。

示例:

<SCRIPT>
window.onerror=fnErrorTrap;
function fnErrorTrap(sMsg,sUrl,sLine){
oErrorLog.innerHTML="<b>An error was thrown and caught.</b><p>";
oErrorLog.innerHTML+="Error: " + sMsg + "<br>";
oErrorLog.innerHTML+="Line: " + sLine + "<br>";
oErrorLog.innerHTML+="URL: " + sUrl + "<br>";
return false;
}
function fnThrow(){
eval(oErrorCode.value);
}
</SCRIPT>
<INPUT TYPE="text" ID=oErrorCode VALUE="someObject.someProperty=true;">
<INPUT TYPE="button" VALUE="Throw Error" onclick="fnThrow()">
<P>
<DIV ID="oErrorLog">
</DIV>

上面示例的方法很值得借鉴。
在捕获js错误时,我们通常使用try{}catch(e){}的方式,然后通过e.errorMessage等方式获取错误信息然后报告错误。但对于onerror事件可能很少问津,我们是否思考过如何报告错误所在的行号?如果想过这个是否也被这个问题所困扰过,是否认为在js里不可能捕获错误的行号呢?其实本人就遇到上述的几个问题,今日读某人写的一段js代码顿然发现了onerror事件,要说onerror这个时间也是n久以前就知道了,但对于其所带有的三个参数和其特殊性质却一直没有去了解过。经过自己的研究测试,对onerror事件有了一些新的认识和了解。在页面没有错误时,window.onerror事件是不存在的,也就是null(废话!没出错如果onerror出现还正常吗?)我们一般通过函数名传递的方式(引用的方式)将要执行的操作函数传递给onerror事件,如window.onerror=reportError;window.onerror=function(){alert('error')},但我们可能不知道该事件触发时还带有三个默认的参数,他们分别是错误信息,错误页面的url和错误行号。要知道这个可是事件,就如onclick和onmouseover等事件一样,但它是有参数。我们可以这样测试。

<script type="text/javascript">  
  window.onerror=testError;  
  function testError(){  
  arglen=arguments.length;  
  var errorMsg="参数个数:"+arglen+"个";  
  for(var i=0;i<arglen;i++){  
  errorMsg+="/n参数"+(i+1)+":"+arguments[i];  
}  
  alert(errorMsg);  
  window.onerror=null;  
  return true;  
}  
function test(){  
  error  
}  
test()  
</script> 

Liez d'abord la méthode testError à l'événement onerror, puis déclenchez une erreur dans la méthode de test lors de l'exécution dans IE, nous avons trouvé l'invite suivante :
---------------------------- Microsoft Internet Explorer ------------------ - ------
Nombre de paramètres : 3
Paramètre 1 : 'erreur' non défini
Paramètre 2 : file://E:/yanwei/test/testError.html
Paramètre 3 : 14
--------------------------- Bien sûr---------------------- -----
On constate que la fonction testError capture trois paramètres lorsqu'une erreur se produit. En liant la fonction à l'événement onerror, vous pouvez capturer les trois paramètres ci-dessus lorsque la page échoue.
Les problèmes suivants ont également été constatés lors du test :
1. En ajoutant return true à la fin de la fonction, le message d'erreur système (IE) n'apparaîtra pas lorsqu'une erreur se produit dans la fonction.
2. S'il y a plusieurs erreurs sur la page, seule la première erreur sera capturée et traitée, puis l'exécution des programmes suivants sera interrompue.
3. L'événement onerror ne peut pas capturer toutes les erreurs. Il ne peut capturer que les erreurs en dehors de la fonction ou à l'intérieur de la fonction (?? Qu'est-ce que cela signifie ? Ce n'est pas une blague, par exemple, adasdf function test(){ aaaa } peut). capture les erreurs inutilisées d'adasdf. La fonction d'erreur définie test(){ aaaa; } peut capturer les erreurs aaaa non définies, mais les erreurs dans la fonction test(){} ou la fonction test()dd{} ne peuvent pas être capturées et un message d'erreur système apparaîtra. directement.
4. Onerror est exécuté de la même manière dans les navigateurs tels que IE et FF, et tous deux contiennent ces trois paramètres.

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn