TLDR:你不能在问题的底部找到替代解决方案(即我妥协的那个)。
我有一个异步功能,可以在链接点击时将数据发送到服务器,当然这很可能因为页面卸载时间而无法发送。
有没有办法可以延迟点击的效果,直到回调函数运行或发生超时(两者都有效,超时可以限制可能的延迟)。
click =>等待超时/回调=>继续正常活动。
OR
click =>开始电话&超时,取消默认功能 回调/超时调用函数继续/重启点击过程
我希望这一切都有意义,谢谢你。
编辑:服务器调用不需要100%完成。
编辑:我想继续原来的"功能"点击事件并没有替换或编辑window.location变量因为onclick无法保证导航,例如,中键点击。
编辑:这是代码的基本结构(它真的很复杂):item.onclick = function(){
var callback = function(){
// continue as if nothing happened
// including non-navigational clicks (e.g. middle-click)
};
// Send call with callback
sendCall(callback);
// if no callback not triggered in 250ms then continue anyway
setTimeout(callback, 250);
return false; // or not if there's a way to delay
}
编辑:我似乎没有有用的解决方案,因此我发布了我在答案中使用的代码。
答案 0 :(得分:3)
您可以阻止点击的默认操作,以便实际上不会在点击上触发链接。然后你发送你的ajax调用,当它完成时,你的代码就会变成新的页面。
假设您已经在链接中执行ajax调用的单击处理程序:
function myClickHandler(e) {
e.preventDefault();
var self = this;
sendAjax(..., function() {
// ajax call done here
// do the page navigation
window.location = self.href;
})
}
您可能希望创建一些用户反馈,点击正在处理,因为用户可能会看到在短暂延迟之后(在处理您的ajax呼叫时)没有发生任何事情,并且您不想鼓励用户再次单击,因为它似乎没有任何反应。您甚至可能希望在处理ajax调用时防止多次点击。
回复您的修改:
在处理异步ajax调用然后继续正常执行时,Javascript中没有方法可以阻止Javascript执行最多250毫秒。因此,代码中的大纲无法直接显示,因为您已经显示过它。
Javascript中的常用设计模式是阻止默认操作,设置异步操作(在您的情况下为ajax调用和计时器),然后当异步事件完成或超时时,您手动触发默认操作将已经。但是你必须知道如何自己触发默认操作(这是我上面的代码建议所示)。
我能想到的唯一解决方法是你可以发送一个同步Ajax调用(通常被认为是一种不好的做法),并在ajax调用本身设置超时。这将暂停执行您的Javascript以及与该页面的所有其他交互,直到ajax调用完成或超时。您必须非常彻底地测试它,看它是否在许多浏览器中为您提供了所需的交互,因为它肯定不是经常使用的标准内容。我个人不会推荐它(同步ajax只是邪恶,因为它锁定了浏览器)。
通过更全面地了解您正在尝试解决的问题,我会寻找更好的设计解决方案。到目前为止,您只描述了您尝试过的解决方案,而不是您尝试解决的实际问题。这被称为XY problem,并且极大地限制了我们如何为您提供帮助。
答案 1 :(得分:1)
如果你想在成功的ajax之后做一些事情,那么就像我之前提到的用户一样,你可以使用ajax成功函数来触发所需的行为以及'mousedown'/'touchstart'以节省一些ms而不是'click' 。
{{1}}
我真的不明白你的意思“我不能使用window.location技巧”,但希望这会有所帮助。
干杯