We make a request to your servers as if you are loading a JavaScript file. The url
will contain the query parameters that you want to pass to the server.
This method has two advantages:
- The code for sending the request is simple as we are just creating/changing the script tag
src
- We can return some behavior back to the browser from the server possibly redirecting users to some other location
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers/onerror | |
//https://blog.sentry.io/2016/01/04/client-javascript-reporting-window-onerror.html | |
//https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/ | |
window.onerror = function (messageOrEvent, source, lineno, colno, error) { | |
try { | |
console.log({ | |
//error message(string).Available as event (sic!) in HTML onerror = "" handler. | |
messageOrEvent: messageOrEvent, | |
//URL of the script where the error was raised(string) | |
source: source, | |
//Line number where error was raised(number) | |
lineno: lineno, | |
//Column number for the line where the error occurred(number) | |
colno: colno, | |
//Error Object(object) | |
error: error | |
}); | |
/* | |
* WE THEN MAKE A REQUEST TO YOUR SERVERS AS IF YOU ARE LOADING A | |
* JAVASCRIPT FILE. THE URL WILL CONTAIN THE QUERY PARAMETERS THAT | |
* YOU WANT TO PASS TWO THE SERVER. | |
* THIS METHOS HAS TWO ADVANTAGES: | |
* 1. THE CODE FOR SENDING THE REQUEST IS SIMPLE AS WE ARE JUST CREATING/CHANGING THE SCRIPT TAG `src` | |
* 2. WE CAN RETURN SOME BEHAVIOR BACK TO THE BROWSER FROM THE SERVER POSSIBLE REDIRECTING USERS TO SOME OTHER LOCATION | |
*/ | |
//placeholder array for request parameters | |
var params = [], | |
//saves a unique id to prevent creating a new script tags for each error | |
___guid = window.onerror___guid || (window.onerror___guid = (new Date().getTime() + '-' + new Date().getTime())), //a guidto for the error script element id | |
//create a new function if none exists with the unique id | |
___logError = function (___url) { | |
___domScript = document.getElementById(___guid); | |
if (!___domScript) { | |
var ___head = document.head || document.getElementsByTagName('head')[0], | |
___domScript = document.createElement('script'); | |
___domScript.id = ___guid; | |
___domScript.async = 'async'; | |
___head.insertBefore(___domScript, ___head.firstChild); | |
} | |
___domScript.src = ___url; | |
}; | |
params.push('browser=' + encodeURIComponent(((navigator.userAgent + '|' + navigator.vendor + '|' + navigator.platform + '|' + navigator.platform) || '').toString().substring(0, 150))); | |
params.push('lineNumber=' + encodeURIComponent((lineno || '').toString().substring(0, 150))); | |
params.push('colNumber=' + encodeURIComponent((colno || '').toString().substring(0, 150))); | |
params.push('source=' + encodeURIComponent((source || '').toString().substring(0, 150))); | |
params.push('error=' + encodeURIComponent((error || '').toString().substring(0, 150))); | |
params.push('messageOrEvent=' + encodeURIComponent((messageOrEvent || '').toString().substring(0, 150))); | |
params.push('url=' + encodeURIComponent((window.location.href || '').toString().substring(0, 150))); | |
// `/JavascriptError` is your servers endpoint | |
___logError('/JavascriptError?' + params.join('&')); | |
} | |
catch (e) { | |
// squelch, because we don’t want to prevent method from returning true | |
console.log(e); | |
} | |
//When the function returns true, this prevents the firing of the default event handler. | |
return true; | |
}; |
Top comments (0)