var noop = function(){}; var errorHandler = { callback: null, init: function (callback) { errorHandler.callback = callback || noop; window.onerror = errorHandler.script; window.addEventListener('error', errorHandler.source, true); window.addEventListener('unhandledrejection', errorHandler.promise, true); }, // 记录普通错误 script: function (message, source, lineno, colno) { var stack = source + ':' + lineno + ':' + colno; errorHandler.callback('script', message, stack); }, // 记录资源加载错误 source: function (e) { e.preventDefault(); var target = e.target || e.srcElement; var isElementTarget = target instanceof HTMLScriptElement || target instanceof HTMLLinkElement || target instanceof HTMLImageElement; // 不是资源加载错误时,直接返回 if (!isElementTarget) { return false; } var url = target.src || target.href; errorHandler.callback('source', 'Unable to load resources', url); }, // 记录promise错误 promise: function (e) { e.preventDefault(); var error = e.reason || {}; errorHandler.callback('promise', error.message, error.stack); } };