你可以等待javascript回?
-
22-07-2019 - |
题
我试图利用延长的警报,对话从图书馆 http://abeautifulsite.net/notebook/87 而不是默认的警报(这看起来很可怕我的意见).这似乎是一个伟大的图书馆,但没有一个如何使用jConfirm图书馆。
我需要做的事情是这样的:
function confirm() {
var result = false;
var response = false;
jConfirm('are you sure?', 'Confirmation Dialog',
function(r) {
result = r;
response = true;
return r;
});
if (response == true) {
alert(result);
return result;
}
else {
//wait for response
alert('hi');
}
}
和我的电话从我的。净按钮:
我已经发布评论的插件的网站(只是今天早上)和没有谷歌搜索javascript和等待回到完全没有结果。
任何想法上如何使用回正确地取得结果之前,其余的javascript执行?
谢谢。
解决方案
jConfirm('are you sure?', 'Confirmation Dialog',
function(r) {
result = r;
response = true;
return r;
}
);
if (response == true) {
这暴露了对使用异步代码发生的事件顺序的误解。仅仅因为您内联编写了它并不意味着它将严格从上到下执行。
- jConfirm 被调用,接收一个函数作为其参数之一,并记住该函数。
- jConfirm 在页面上显示其 UI 并立即返回。
- 执行“if (response==true)”行。实际上,这应该只是读取“if(响应)”,布尔比较是多余的。但无论如何,回应当然是错误的。您的函数放弃并退出,将控制权交还给浏览器。
- 用户单击 jConfirm 的 UI。
- jConfirm 现在才开始执行操作并回调您之前提供给它并且它之前记住的函数。
- 您的嵌套函数将响应设置为 true,对于“if (response==true)”条件来说太晚了,无法对其执行任何操作。
您已经编写了“//等待响应”作为替代方案,但您无法编写实际执行此操作的 JavaScript 代码。您的函数必须返回以将控制权交还给浏览器,然后浏览器才能触发 jConfirm UI 上的单击事件以使处理继续进行。
使异步代码在同步上下文中工作(反之亦然)的方法是存在的 - 特别是线程和协程(及其有限的关系生成器)。但 JavaScript 没有这些功能,因此您必须编写代码以适应您的库正在使用的同步或异步模型。
其他提示
您刚刚打在JavaScript很大的局限性。一旦你的代码进入异步世界,有没有办法回到经典程序的执行流程。
在你的实施例中,解决方案将是使一个循环等待响应将被填充。问题是,JavaScript并没有提供任何指令,让您无限循环而不采取的处理能力的100%。所以,你最终会阻止浏览器,有时到这种地步,你的用户将不能够回答的实际问题。
这里唯一的解决办法是粘到异步模型,并保持它。我的建议是,你应该添加一个回调必须做一些异步工作的任何功能,使主叫方可以在你的函数结束执行的东西。
function confirm(fnCallback)
{
jConfirm('are you sure?', 'Confirmation Dialog', function(r)
{
// Do something with r
fnCallback && fnCallback(r); // call the callback if provided
});
}
// in the caller
alert('begin');
confirm(function(r)
{
alert(r);
alert('end');
})
由于回调是异步的(至少,在这个意义上,它是等待用户做一些事情),这可能是比较容易处理,你需要回调里面是什么:
function confirm() {
jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
if (r) doSomething();
});
}
@klogan [注释]
我假设你从这里?
有这些在页面给你答案:(看在用法)
这些方法不返回相同的值作为确认()和提示()。你必须访问使用回调函数所产生的值。 (详情请参阅演示。)
@klogan
我想说明的一点是,确实没有一个简单的方法来完成你想要的东西。你想关联的程序和事件驱动程序 - 一些JavaScript不帮你做。
<击>的
最简单的(尽管,的 风险 强>)解决方案是使用伪无限循环。但是,如果callback
不会被调用,你现在有一个实际的无限循环。而且,根据不同的JavaScript引擎,你可能会杀死浏览器等。 行使>
点: 最好的办法是避免的 <击>这个击> 试图迫使事件驱动成程序 强>
function confirm() {
var result = false;
var response = false;
jConfirm('are you sure?', 'Confirmation Dialog',
function(r) {
result = r;
response = true;
});
while(!response) continue; // wait
return result;
}
的撞击> <击>的 的撞击>
从技术上讲, 是的, 但我不会那样做的一个网站。
看看 叙述JavaScript, ,这是基于关闭 水仙.
叙述JavaScript是一个小的扩展到JavaScript语言,能够阻挡的能力异事件的回调。这使得异步码令人耳目一新的可读和易懂。
硒 使用这种技术。
更新
检查了 JavaScript股:
JavaScript股增加了协程和 合作社线程的支持 JavaScript语言,以便能阻止 能力异的事件 回调。这使得代码 利用异步操作太多 更多的线性、可读和易于管理。股是建立在叙述 JavaScript写的尼尔混合, 许多叙述JavaScript 仍然存在的股,包括多的 这个文件。
在JavaScript你的代码不能简单地 等到的事件已经解雇--的 活动必须始终是处理通过一个 独立的、异步的事件的处理程序。有时候,这是好的,但它往往 军队的什么应该是一个简单的 序列的发言到粗糙的 扭曲.它还打破了 能力封功能 由于调职能必须知道 提供回调处理程序。股 提供的能力和暂停 恢复程的执行。的执行 可以中止恢复当事 完成。这可以让你写 难读异的事件 处理在简单的、线性的、可读 代码封装的执行。
我会假设你必须抓住这样的反应。我不认为你需要一个回调。
function confirm() {
var response = jConfirm('are you sure?', 'Confirmation Dialog');
if (response) {
alert(result);
}
else {
//wait for response
alert('hi');
}
}
我想我已经想出了一个可能的解决这个问题。我读这篇文章: http://treasure4developer.wordpress.com/2008 / 06/23 /主叫回发事件从 - 的JavaScript /
基本上的想法是,你逼的javascript回发,起初我发现回发会工作,但不会要求我的按钮事件,但阅读我发现我可以检测,如果它是JavaScript的回传后篇和只是调用一个方法来执行处理
此致DotnetShadow
帅哥是怎么说的,也没办法!但是...我们如何使用在我的国家(巴西)说,勒甘比:
我们可以这样做的:
<h:commandLink styleClass="linkValor xExcluir" value="x"
onclick="if(confirmar('Confirmar excluir.','Deseja realmente excluir este registro?', this)) return true; else return false;"
action="#{mBeanPesquisarLinhas.excluir}"/>
和JavaScript的:
function confirmar(titulo, msg, elemento) {
if ($(elemento).attr('sim')) {
$(elemento).removeAttr('sim');
return true;
} else if ($(elemento).attr('nao')) {
$(elemento).removeAttr('nao');
return false;
} else {
$("#dialog-confirm").html('<p>' + msg + '</p>').dialog({
resizable : false,
height : 200,
modal : true,
title : titulo,
buttons : {
"Sim" : function() {
$(this).dialog("close");
$(elemento).attr('sim', 'sim');
$(elemento).click();
},
"Não" : function() {
$(this).dialog("close");
$(elemento).attr('nao', 'nao');
$(elemento).click();
}
}
});
}
return false;
}
它是相同的问题,但使用jquery-UI。
再见,我希望这可以帮助别人。
想想回调将邮件发送,它会导致你的代码更好的结构。
这个事情的作品。需要的jQuery。
function myconfirm(kyssa, elm, e){ // neG
if(jQuery('#confirmquestion').data('result')){
var V = jQuery('#confirmquestion').data('result');
jQuery('#confirmquestion').remove();
return V == 'Y' ? true : false;
}else if(!jQuery('#confirmquestion').length){
jQuery('body').append('<div id="confirmquestion">'+
'<h4>Kinnitus</h4>'+
'<div id="kyssa">'+kyssa+'</div>'+
'<center>'+
'<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'Y\');">Jah</button> '+
'<button onclick="jQuery(\'#confirmquestion\').data(\'result\', \'N\');">Ei</button></div>'+
'</center>');
jQuery('#confirmquestion button').click(function(){
jQuery(elm).trigger(e.type);
})
}
return false;
}
onChange="if(myconfirm(\'Saada kiri: \'+jQuery(this).find(\'option:selected\').html()+\' ?\', this, event)) { ... }"
CSS
#confirmquestion{
border:1px solid #999;
background:white;
padding-bottom: 30px;
position:fixed;
width:300px;
font-size:12px;
top:45%;
left:50%;
margin-left:-150px;
}
#confirmquestion h4 {
background:blue;
color:white;
margin:0;
padding: 2px 5px;
border-bottom:#777;
text-align:center;
}
#confirmquestion #kyssa {
padding: 30px 25px;
}