Javascript 在单击事件上完成
我不是一个javascript开发人员,所以请容忍我的这一点 我需要在jQueryJavascript 在单击事件上完成,javascript,jquery,Javascript,Jquery,我不是一个javascript开发人员,所以请容忍我的这一点 我需要在jQuery单击事件完成后执行重定向。这是我所拥有的,但我无法将.done应用于。单击。用$包装整个内容。当不起作用时 $("#printpng").click(function(){ $('#tool_docprops').click(); $('#tool_docprops_save').click(); $('#tool_export').click
单击事件完成后执行重定向。这是我所拥有的,但我无法将.done
应用于。单击。用$包装整个内容。当不起作用时
$("#printpng").click(function(){
$('#tool_docprops').click();
$('#tool_docprops_save').click();
$('#tool_export').click()
}).done(function(){
window.location.href = "<?php echo $base_url ?>/sign/print"
});
$(“#printpng”)。单击(函数(){
$('tool_docprops')。单击();
$('tool_docprops_save')。单击();
$(“#工具_导出”)。单击()
}).done(函数(){
window.location.href=“/sign/print”
});
有谁有更好的解决方案吗
谢谢试试这样的
$("#printpng").click(function(){
$('#tool_docprops').click();
$('#tool_docprops_save').click();
$('#tool_export').click()
window.location.href = "<?php echo $base_url ?>/sign/print"
});
据我所知,您需要在单击事件完成后执行页面重定向。
为此,只需在click事件上添加一个回调函数
单击完成后,将触发此回调函数,并在此函数中编写重定向代码
例如:
$("#printpng").click(function(){
$('#tool_docprops').click(function(e){
// write here your redirection code
});
$('#tool_docprops_save').click(function(e){
// write here your redirection code
});
$('#tool_export').click(function(e){
// write here your redirection code
});
});
谢谢假设每次单击都会触发一个超出您控制的Ajax调用(否则为什么会出现此问题),您只需等待任何/所有Ajax请求完成以下操作:
$(document).ajaxStop(function () {
window.location.href = "<?php echo $base_url ?>/sign/print"
});
然后在示例中使用它(使用.Then()
按顺序运行):
只需在click handler的末尾编写重定向代码
$("#printpng").click(function(){
$('#tool_docprops').click();
$('#tool_docprops_save').click();
$('#tool_export').click();
window.location.href = "<?php echo $base_url ?>/sign/print";
});
$(“#printpng”)。单击(函数(){
$('tool_docprops')。单击();
$('tool_docprops_save')。单击();
$(“#工具_导出”)。单击();
window.location.href=“/sign/print”;
});
若在更新页面位置之前需要等待异步进程(由单击事件触发)完成,则需要修复解决方案
i、 您的异步过程是一个ajax调用,它在单击#tool_docprops_save后生成一个请求。然后,您应该在该ajax调用上附加一个成功事件,该事件将在ajax调用完成后更新window.location.href。为了正确起见,这可以使用干净的异步方式完成。这些对象表示将在将来完成的任务,事件处理程序可以附加到该任务的完成。您可以手动调用延期付款的complete
对于大多数具有回调的异步任务,jQuery在后台处理这些对象,您可以实际等待它们完成。
你需要稍微修改一下你的代码
在#printpng
的click eventhandler中,需要为每个要完成的任务创建延迟对象
假设您手动触发的所有3个单击事件都有等待的内容,因此我们创建了3个延迟
$('#printpng').click(function () {
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
.......... other code not yet included
});
现在我们有3个表示任务的对象。如果你拜访他们,就意味着任务已经完成。我们希望在#tool_export
的click eventhandler完成时完成这些任务
假设这个#tool_export
有一个click事件处理程序,我们可以通过某种方式将延迟对象传递给它
$('#tool_export').click(function (e, deferred) {
$.ajax({
url: 'your_url',
success: function(result){
// your code does stuff with the result
if (deferred !== undefined) {
deferred.resolve();
}
},
error: function(result){
if (deferred !== undefined) {
deferred.reject();
}
},
});
});
如您所见,它进行AJAX调用,如果调用成功,则调用deferred.resolve()
,如果出现问题,则调用deferred.reject()
。很简单
现在的问题是:如何将这个延迟参数传递给click事件处理程序
你写了:
$('#tool_docprops').click();
这是以下内容的简写:
$('#tool_docprops').trigger('click');
要将def1
对象作为参数传递,只需编写:
$('#tool_docprops').trigger('click', def1);
因此,事件处理程序被修改为:
$('#printpng').click(function () {
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
$('#tool_docprops').trigger('click', def1);
$('#tool_docprops_save').trigger('click', def2);
$('#tool_export').trigger('click', def3);
..... something is still missing from here
});
您可以传递任意数量的参数
最后要做的事情就是推迟完成这项任务。有一个非常酷的helper方法,名为,它等待任何数量的延迟被解决。因为它也会创建一个延迟的,所以您可以调用它来获得回调。因此,要等待您之前创建的所有3个延迟,您可以编写:
$.when(def1, def2, def3).done(function() {
window.location.href = "<?php echo $base_url ?>/sign/print";
});
我举了一个非常简单的例子来说明这一点。没有ajax调用,只有一个超时,但是您可以理解
如果单击“开始”,则需要等待4秒钟才能完成:
我认为您正在寻找jquery承诺,它具有.done()
其他单击事件是否会触发ajax请求,您希望在重定向之前等待这些请求完成?为什么不将重定向简单地添加到事件处理程序的末尾?你到底在等什么?其中一个事件确实引发了ajax是的。我正在等待图像从画布流式传输到php脚本。重定向然后加载新创建的图像以进行打印。正在运行经过大量修改的SVG编辑版本;只是事件处理程序,因为您没有任何与之关联的函数,所以我认为您没有正确使用它。如果您需要实际触发一个实际的点击,您需要.trigger('click');我不认为这是OP想要的工作。。。他希望所有三个点击事件都被触发,而不是在每一个事件后都触发一个重拨。在我看来,这似乎是事件处理程序,而不是回调函数。更不用说,这实际上不会导致点击事件,只会捕获事件。请注意,来自SO的评论:“其中一个事件不会触发ajax是。”此解决方案不会等待任何异步进程完成,它会立即重定向。这就是我最初的想法,@TrueBlueAussie正好有这个问题。它在ajax完成之前重定向,这是我需要避免的使用async:false
是解决ajax问题的一个非常糟糕的方法(假设部分代码在他的控制下)。处理异步事件总是最好的(它们是异步的,这是有充分理由的):)向它添加额外的超时是很不礼貌的。这仍然是唯一能理解问题的答案。我的意思是在Ajax停止事件中超时(所以两者都是),但“正确”的方法是让事件捕捉到点击触发的每个操作的完成事件,并将它们链接在一起(或者组合承诺并行运行并等待所有3个)。基本上没有足够的信息
$('#tool_docprops').click();
$('#tool_docprops').trigger('click');
$('#tool_docprops').trigger('click', def1);
$('#printpng').click(function () {
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
$('#tool_docprops').trigger('click', def1);
$('#tool_docprops_save').trigger('click', def2);
$('#tool_export').trigger('click', def3);
..... something is still missing from here
});
$.when(def1, def2, def3).done(function() {
window.location.href = "<?php echo $base_url ?>/sign/print";
});
$('#printpng').click(function () {
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();
$('#tool_docprops').trigger('click', def1);
$('#tool_docprops_save').trigger('click', def2);
$('#tool_export').trigger('click', def3);
$.when(def1, def2, def3).done(function() {
window.location.href = "<?php echo $base_url ?>/sign/print";
});
});