捕获由jQuery.load()

时间:2015-06-26 11:46:17

标签: javascript jquery html ajax

我有一个Javascript控件,可以加载包含HTML的页面和只有该页面需要的一些Javascript。

最初我在YAGNI / KISS假设下运作,并将所有Javascript保存在一个大的functions.js文件中;但是现在页面数量已经增长,而且其中一些是需要稍微不同的相同功能实例化的变体。

所以我觉得能够写

非常有用
 <div>...<button id="object123">Don't click me!</button>... </div>
 <script>
     $('#object123').on('click', function(){
         alert("I said not to click!");
     });
 </script>

并加载

 // All error checking omitted for clarity
 $(divSelector).load('page-with-object-123.html');

鉴于我已经对ID等的唯一性进行了检查,如果脚本包含语法错误,则会出现问题。在那种情况下,当然执行会停止,但更重要的是,我在jQuery (.load执行<script>标记的位置)中收到错误。因此,不能立即将错误跟踪到原始HTML。

能够得到错误(就此而言,我的脚本中唯一的语法错误现在是有意的),但是我想抓住它以便优雅地处理它。

我用try/catch

尝试过这个问题
try {
    $(divSelector).load(sourceHTML);
} catch (err) {
    alert("An error occurred in " + sourceHTML);
}

但错误并未被发现。 This answer会建议它应该是,除非jQuery对try / catch机制做了一些奇怪的事情。

我已根据this other answer的建议尝试使用window.onerror。默认情况下,可以使用(即我全局定义onerror回调)。

此时我尝试在函数体本身进行更改,并在不再需要处理器时恢复处理程序。

虽然 出现曾经工作过一次(可能是因为我正在查看由于客户端缓存导致的旧代码的全球版本),但我似乎无法使其工作

在强制facepalm 之后

/**
 * Effect a call 
 * @param string    op*        command
 * @param dict      data       data to send
 * @param callable  callback   function to be called on success 
 * @param callable  onError    function to be called on failure
 */
function poster(op, data, callback, onError) {
    // Save handler
    var origHandler = window.onerror;
    // Install new error handler
    window.onerror = function(message, url, lineNumber) {
        alert(message + "\n" + url + "\n" + lineNumber);
        return true;
    };
    $.post(
        ajaxUrl,
        $.extend({ op: op }, data),
        function (responseText, statusText, jqXHR) {
            // Evaluate the response for server error notifications
            var todo = jqBadResponse(responseText) ? onError : callback;
            // Edit: try using onerror to watch also callbacks.
            // window.onerror = origHandler;
            todo && todo(responseText);
            // Restore error handler
            window.onerror = origHandler;
        }
    ).fail(function(jqXHR, title) { // Outer failure.
        // Restore error handler
        window.onerror = origHandler; 
        jqCheckFail(jqXHR, title); // Notify of the error
    });
}

我知道what my basic problem is ...我 知道的是 在这种情况下

1 个答案:

答案 0 :(得分:0)

通常的副作用是仔细检查在Stack Overflow上发布明智问题的要求 - 你偶然发现了答案

正如我所说,我使用函数将HTML加载到DIV中。但是现在使用上面的函数我的方式不同。实际的分配不再由.load() 中的jQuery完成,而是由我自己的回调完成。

jQuery将解释Javascript并在.html()调用中抛出一个SyntaxError ,而不再在.load()调用中抛出。在.load函数中,加载的HTML代码只是一个字符串,它包含的语法错误将被忽略。

当我告诉jQuery将该字符串视为HTML并将其放在DOM中以引发异常时。当我在.post函数内部时发生 ,但它在范围内发生了更远。

我仍然不太明白为什么外try {}未能抓住它,但我有理由相信这可能与

这个事实有关。
try (
    var a = ...*some Promise whose payload will be executed sometime in the near future*...
} catch (e) {
    // Here I catch the error and there is no error;
    // the Promise did promise the impossible, but that
    // offer hasn't been picked up yet.
}
...
// NOW finally the Promise executes and throws. But I'm no longer inside
// a try/catch block.

确实,如果我将try / catch放在同步块中

poster(
    'form',
    {
        code:  ...,
        id:    ...
    },
    function (responseText) {
        try {
            $('#details').html(responseText.data.html);
        } catch(e) {
            alert("GOTCHA");                
            return;
        }
        ...
    }
);

正确捕获了异常。