views:

420

answers:

2

The onerror page on MSDN states that the onerror handler can be attached to a script element and that it "Fires when an error occurs during object loading.".

For the purpose of unit tests, I am trying to get this onerror handler to fire, but could not find a suitable example.

The following code triggers an error in Firefox, but no alert is displayed in Internet Explorer

<script src="http://www.google.com/NOTFOUND.js" onerror="alert('error fired')"></script>

Does anyone know a value for script.src that would fire the handler attached to script.onerror?

A: 

Having just done a bit of reading on this, it looks like onerror can also be attached to the window object. See:

http://www.javascriptkit.com/javatutors/error.shtml

According to that page, you can pass in msg, url and linenumber arguments:

window.onerror=function(msg, url, linenumber){
 alert('Error message: '+msg+'\nURL: '+url+'\nLine Number: '+linenumber)
 return true
}

Not sure on the browser support for this, but thanks for bringing it to my attention!

Update: didn't do anything in Safari 4 (apart from logging an error in firebug as per usual), but shows the alert in Firefox 3.6 Beta 5. Error test at http://www.javascriptkit.com/javatutors/errortest2.htm

Update 2: done a test with the following:

index.html:

<html>
<head>
<script type="text/javascript">

window.onerror=function(msg, url, linenumber){
 alert('Error message: '+msg+'\nURL: '+url+'\nLine Number: '+linenumber)
 return true
}
</script>

<script type="text/javascript" src="js.js"></script>
</head>
<body>
</body>
</html>

js.js: (stupid name, i know!)

document.write('hi there'

Result in FF 3.6 Beta 5:

Result

adam
Thanks for the comment. I should have mentioned that I know how to trigger the window.onerror handler; here I am specifically interested in the script.onerror handler.
Eric Bréchemier
Ah, ok. I've just done a quick test, and the url passed to window.error is the url of the script that causes the error (if it is external). This should work as a global script.error, as you can detect which script is firing the error.
adam
Thanks Adam, but I am really trying to fire script.onerror here, not window.onerror. I want to detect the (unsuccessful) end of loading a dynamic script, and setting the handler to window.onerror would not really help.
Eric Bréchemier
+2  A: 

I found this buried in some MSDN documentation:

Note that the documentation mistakenly says this works for elements too; the error will be fixed in the Workshop documentation for the final release of Internet Explorer 5 in March.

The next thing I thought of that could help is the onreadystatechange event:

<script src="http://www.google.com/NOTFOUND.js" onreadystatechange="alert(this.readyState)">

This event fires twice for me, once with "loading" and again with "loaded", whether the script is valid or not. Other documentation I've found says that sometimes it fires a complete event, and it's not really clear when it's supposed to fire. So it looks like that won't work.

So I think you're left with the hacky solution of checking that a variable which the script is supposed to declare really exists. In HTML:

<script src="http://yourdomain.com/declare_foo.js"&gt;&lt;/script&gt;
<script>if (typeof foo == "undefined") {alert ('error loading script');}</script>

And then of course in declare_foo.js, you'd have

var foo = 'Script loaded successfully';
Annie
Very nice catch!! Sadly I cannot assume that a particular variable will be present in the script, as this code will be used in the wild to load third party scripts dynamically.I added a comment to the onerror page on MSDN to point back to the article and the note you found. Thank you Annie.
Eric Bréchemier