如何在dojo中创建等待事件,等待用户在继续之前单击按钮
How do I create a wait event in dojo that waits for a user to click a button before continuing?
我在javascript文件中有以下代码:
if(dojo.byId('WC_selectedColorNumber') == null && this.defaultColor != null)
{
dijit.byId('WC_color_selection').domNode.style.display = 'block';
dojo.html.set(dojo.query(".message__button .add"), "Add product with only base color " + this.defaultColor + "?");
var userResponse = true;
dojo.connect(WC_add_color_yes, "onclick", function(evt){
userResponse = true;
});
dojo.connect(WC_add_color_no, "onclick", function(evt){
userResponse = false;
});
//var userResponse = confirm("Add product with only base color " + this.defaultColor + "?");
//I WANT TO WAIT HERE FOR THE RESPONSE
if(userResponse == false) //if user clicks Cancel or 'no', display a message and leave the function.
{
alert("Remember to select a color before adding to cart."); //should be a tooltip/popup (not javascript alert) with the same message
return; //return so item doesn't get added to cart
}
}
首先,这段代码背后的逻辑是正确的,当使用javascript确认时,它可以很好地工作。
到目前为止,一切都出现并正确显示,单击按钮执行正确的操作(如果我在onclick dojo事件中放入console.log,当我单击按钮时,它们确实会打印到控制台)。但是,程序并不等待响应,而是在dojo之外继续执行。在它看到用户的输入之前连接方法。
我需要它等待,直到按下是或否按钮,但我不知道如何做到这一点。我试过使用
while(userResponse == null);
但是a)这通常是个糟糕的主意b)不管怎样它都不起作用。
我如何让我的代码等待,直到用户已经点击了两个按钮之一?
如果你可以做一个jsfiddle,我想我可以帮助你更多,但是你的dojo.connect
调用不应该在这样的逻辑流中。相反,在小部件startup
上设置连接,并让它们正常工作。
在你的示例代码中,它看起来像我说"是"意味着"使用默认颜色",而"否"意味着"用户必须指定颜色"。所以…
startup: function () {
this.inherited(arguments);
dojo.connect(WC_add_color_yes, "onclick", dojo.hitch(this, function(evt){
this.useDefaultColor();
}));
dojo.connect(WC_add_color_no, "onclick", dojo.hitch(this, function(evt){
this.displayColorPicker();
}));
}
,然后……只在合适的时候显示这两个按钮(或者它们所在的对话框)。
javascript中没有"wait"或"sleep"函数,javascript代码的每次调用执行到完成(它不会在执行过程中被其他事件的响应中断)。您已经正确识别了克服此全局警报的历史异常,并确认函数在浏览器本机代码中执行并等待用户输入。
因此,你的代码将不得不以某种方式进行重组,例如,"添加到购物车"的事件处理程序验证颜色选择,并调用函数将其添加到购物车(如果有效)。如果无效,则修改DOM以向用户显示一些按钮。"yes"选项的处理程序同样会调用相同的函数来将其添加到购物车中。
特定的代码不在这个答案的范围内-在页面和代码设计中必须有许多方法才能达到预期的结果。例如:分解顺序代码并将其放在单独的事件处理程序中,使用EC6中定义但在MSIE中不支持的Promise对象进行编码,或者甚至在颜色选择逻辑中提供"仅无基色"选项。
仅供参考,dojo 1.10工具包文档报告了对dojo Promises的支持,但我留下研究来确定它的适用性。
- 等待函数执行后再继续
- 如何让foreach循环等待$http.get完成后再继续
- 主干:等待多次提取继续
- 如何在Node.js中等待函数完成后再继续
- 等待AJAX响应后再继续
- jQuery验证,在继续之前等待服务调用响应
- 等待 AJAX,然后再继续执行单独的函数
- 使用生成器等待输入,然后再继续 forEach 循环的主体
- 如何使用 JQuery 添加延迟?(让它等待 5 秒再继续)
- 等待多个 ipc 调用完成,然后再继续电子/冗余
- 等待函数 $.get 中的代码完成以继续
- 如何等待findOneAndUpdate完成,然后再继续async.series
- 等待 API 调用在 Javascript 中完成,然后再继续
- Angular2 可观察 - 等待多个函数调用,然后再继续
- 等待方法的响应,然后再继续而不使用 SJAX
- 在继续Javascript之前,如何等待多个facebook图形api调用
- 如何使用 Ajax 一次仅按顺序发布数组的 1 个值,并在继续之前等待响应
- 等待 .each 完成,然后再继续 (jQuery)
- 如何为性能执行多个异步函数(非嵌套),但等待它们完成再继续
- 使用javascript/jQuery,等待3秒钟点击,然后继续