我正在做一些测试,试图更多地了解延迟。所以,我做了一个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函数无法访问事件对象之外,所有内容似乎都运行正常,因此我无法阻止页面更改,因此失败。
答案 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
});
});