我不是一个
javascript开发人员,所以请耐心等待…
我需要在jQuery点击事件完成后执行重定向.这就是我所拥有的,但我无法将.done应用于.click.在$.when中包装整个东西不起作用以太…
$("#printpng").click(function(){ $('#tool_docprops').click(); $('#tool_docprops_save').click(); $('#tool_export').click() }).done(function(){ window.location.href = "<?PHP echo $base_url ?>/sign/print" });
有没有人有更好的解决方案?
谢谢
解决方法
假设每次单击都触发了一个Ajax调用(你为什么会遇到这个问题),你可以简单地等待任何/所有Ajax请求完成:
$(document).ajaxStop(function () { window.location.href = "<?PHP echo $base_url ?>/sign/print" });
如果需要,您还可以在更改URL之前添加超时,以防在Ajax加载后进行其他处理.
如果它不是Ajax问题请澄清,我将调整(或删除)这个答案.
完整版(Ajax等待后额外延迟1秒)可能看起来像:
$("#printpng").click(function(){ $('#tool_docprops').click(); $('#tool_docprops_save').click(); $('#tool_export').click(); $(document).ajaxStop(function () { setTimeout(function(){ window.location.href = "<?PHP echo $base_url ?>/sign/print" },1000); }); });
正如所承诺的[sic]使用promises更好的解决方案
由于从未提供完整的代码,假设有多个ajax调用,解决方案就是猜测.
一般的解决方案是不触发点击事件,而是以承诺友好的方式简单地为每次点击调用相关代码.
假设每个单击处理程序都有一个专用函数,只需让每个函数返回一个promise:
例如
function loadPropsViaAjax(){ // simply return the ajax call as $.ajax returns a promise return $.ajax({parameters here}); } function saveDocPropsViaAjax(){ // simply return the ajax call as $.ajax returns a promise return $.ajax({parameters here}); } function waitForImageToload(){ // create a deferred object var def = $.Deferred(); // When the image eventually loads,resolve the promise $('#someimageselector').on('load',function(){ def.resolve(); }); // Return the promise immediately return def.promise(); }
然后在你的例子中使用它(使用.then()顺序运行):
// On click button event... $("#printpng").click(function(){ // Run operations sequentially loadPropsViaAjax().then(saveDocPropsViaAjax).then(waitForImageToload) .done(function(){ window.location.href = "<?PHP echo $base_url ?>/sign/print" }); });
或者,如果它们可以并行运行,请使用$.when:
// On click button event... $("#printpng").click(function(){ // Run operations in parallel $.when(loadPropsViaAjax,saveDocPropsViaAjax,waitForImageToload) .done(function(){ window.location.href = "<?PHP echo $base_url ?>/sign/print" }); });