├── README.md
├── index.html
├── js_logger.min.js
└── js_logger.js
/README.md:
--------------------------------------------------------------------------------
1 | JavaScript error logging
2 | ========================
3 |
4 | Small tool for logging JavaScript errors via window.onerror event
5 | - No jQuery or other dependencies, except JSON.stringify (IE8+)
6 | - RequireJS support
7 | - Smart detection of DOMContentLoaded/onload event
8 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | JavaScript error logging demo
5 |
6 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/js_logger.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Logging function that will trap javascript errors and report them
3 | *
4 | * @author sap1ens https://github.com/sap1ens/javascript-error-logging (fork from https://github.com/robby1066/javascript-error-logging)
5 | * @dependency JSON.stringify() // IE8+
6 | */
7 | var js_logger=function(){function e(b,a,c){"undefined"!==typeof b&&f 0) {
61 | var params = '{"loggedErrors":' + JSON.stringify(errors) + '}';
62 |
63 | var req = new XMLHttpRequest();
64 | req.open('POST', track_event_url, true)
65 | req.setRequestHeader("Content-Type", "application/json");
66 | req.send(params);
67 |
68 | errors = [];
69 | error_count = 0;
70 | }
71 | }
72 |
73 | /**
74 | * RequireJS support
75 | */
76 | function setRequireJSErrorHandling() {
77 | if(typeof require !== "undefined" && require.onError) {
78 | require.onError = function(msg) {
79 |
80 | // if object
81 | if(msg === Object(msg) && msg.requireType && msg.requireModules) {
82 | msg = "requireType: " + msg.requireType + ", requireModules: " + msg.requireModules;
83 | }
84 |
85 | logError(msg, "", 0);
86 | };
87 | }
88 | }
89 |
90 | /**
91 | * Cross-browser support of onDOMContentLoaded event
92 | *
93 | * http://javascript.ru/tutorial/events/ondomcontentloaded
94 | */
95 | function onReady(handler) {
96 | var called = false;
97 |
98 | function ready() {
99 | if (called) return;
100 | called = true;
101 | handler();
102 | }
103 |
104 | if (document.addEventListener) {
105 | document.addEventListener("DOMContentLoaded", function() {
106 | ready();
107 | }, false)
108 | } else if (document.attachEvent) {
109 | if (document.documentElement.doScroll && window == window.top) {
110 | function tryScroll() {
111 | if (called) return;
112 | if (!document.body) return;
113 | try {
114 | document.documentElement.doScroll("left");
115 | ready();
116 | } catch(e) {
117 | setTimeout(tryScroll, 0);
118 | }
119 | }
120 | tryScroll();
121 | }
122 |
123 | document.attachEvent("onreadystatechange", function() {
124 | if (document.readyState === "complete") {
125 | ready();
126 | }
127 | });
128 | }
129 |
130 | if (window.addEventListener) {
131 | window.addEventListener('load', ready, false);
132 | } else if (window.attachEvent) {
133 | window.attachEvent('onload', ready);
134 | }
135 | }
136 |
137 | return {
138 | init: function() {
139 | var loaded = function() {
140 | setRequireJSErrorHandling();
141 |
142 | is_loaded = true;
143 | reportErrors();
144 | };
145 |
146 | onReady(loaded);
147 |
148 | window.onerror = function(msg, url, line) {
149 | logError(msg, url, line);
150 |
151 | // change to the "true" for suppressing error
152 | return false;
153 | };
154 | },
155 | report: function(msg, url, line) {
156 | logError(msg, url, line);
157 | }
158 | };
159 | })();
160 |
161 | js_logger.init();
162 |
--------------------------------------------------------------------------------