对象超出延迟范围?

时间:2012-03-22 13:41:48

标签: jquery jquery-deferred

我正在做一些测试,试图更多地了解延迟。所以,我做了一个ajax网页导航:

$('ul#nav a').on('click', function(e){          
    var hash = $(this).attr('href');
    check(hash).fail(function(){
        e.preventDefault();
    });
});
function check(hash){
    var deferred = $.Deferred();
    if (!hash) {                
        hash = window.location.hash;
    }
    if (!hash) {
        var url = window.location.pathname;
        var file = url.substring(url.lastIndexOf('/')+1);
        hash = file.replace(extension,'');
    }
    if (hash !== prev_url){
        prev_url= hash;
        loadPage(hash).done(
            function(data){ 
                var html = $(data);
                var filtered= html.find('#content');
                content.html(filtrado.html());
                deferred.resolve();
            }
        ).fail(function(){ // Url doesn't exist
            content.html('<p>Page does not exist!</p>');
            deferred.reject();                  
        });
    }
    return deferred;
}

除了check.fail函数无法访问事件对象之外,所有内容似乎都运行正常,因此我无法阻止页面更改,因此失败。

1 个答案:

答案 0 :(得分:3)

fail回调关闭e(它是一个闭包)所以它肯定应该有访问权限(或者你得到错误?)。

问题很可能是在fail回调执行的那一刻(一段时间后你正在做一个Ajax请求,异步),事件处理已经完成。致电e.preventDefault()不再有任何影响。


您需要在点击后直接e.preventDefault();并假设该页面不存在,直到异步延迟事件告诉您。

$('ul#nav a').on('click', function(e){
    e.preventDefault();  // Assume bad link until otherwise proven
    var hash = $(this).attr('href');
    check(hash).done(function(){
       window.location.href = hash; // Good hash, let's go to that
    });
});