你能等javascript回调吗?
我试图使用jQuery警报对话框库,而不是默认警报(在我看来,默认警报非常糟糕)。这似乎是一个很好的库,但是没有一个关于如何使用jConfirm库的示例 我需要这样做:你能等javascript回调吗?,javascript,jquery,dialog,callback,confirm,Javascript,Jquery,Dialog,Callback,Confirm,我试图使用jQuery警报对话框库,而不是默认警报(在我看来,默认警报非常糟糕)。这似乎是一个很好的库,但是没有一个关于如何使用jConfirm库的示例 我需要这样做: function confirm() { var result = false; var response = false; jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
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');
}
}
以及我从.net按钮拨打的电话:
我在插件的网站上发表了一条评论(就在今天早上),在谷歌上搜索javascript,等待回调完成,但没有结果
在剩下的javascript执行之前,有没有关于如何正确使用回调来获得结果的想法
谢谢。我想你应该会像这样得到回应。我想你不需要回电话
function confirm() {
var response = jConfirm('are you sure?', 'Confirmation Dialog');
if (response) {
alert(result);
}
else {
//wait for response
alert('hi');
}
}
由于回调是异步的(至少在等待用户执行某项操作的意义上是如此),因此在回调中处理所需的内容可能更容易:
function confirm() {
jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
if (r) doSomething();
});
}
@克洛甘[评论] 我猜你是从哪里弄来的 该页面给出了您的答案:(在用法下查看) 这些方法返回的值与confirm()和prompt()不同。必须使用回调函数访问结果值。(有关更多详细信息,请参阅演示。)
@克洛根 我想说的一点是,要想实现你的目标,没有一个简单的方法。您正试图将过程性和事件驱动的编程关联起来——JavaScript对您没有帮助 最简单的(尽管,有风险的)解决方案是使用伪无限循环。但是,如果
callback
从未被调用,那么现在就有了一个实际的无限循环。而且,根据JavaScript引擎的不同,您可能会终止浏览器的等待
要点:您的最佳选择是避免试图强迫事件驱动进入程序。
从技术上讲,是的,但我不会在网站上这么做 看一看,这是基于 叙述式JavaScript是JavaScript语言的一个小扩展,它支持异步事件回调的阻塞功能。这使得异步代码具有刷新的可读性和可理解性 使用这种技术
更新 退房: JavaScript增加了协同程序和 对 启用阻塞的JavaScript语言 异步事件的功能 回调。这使得代码 多利用异步操作 更具线性、可读性和可管理性。 故事是建立在叙述的基础上的 由Neil Mix编写的JavaScript,以及 大部分叙述性JavaScript都有 仍然在股中,包括大部分的 这是一份文件 在JavaScript中,您的代码不能简单地 等待直到触发了事件,然后 事件必须始终由 独立的异步事件处理程序。 有时这很好,但经常是这样 强迫应该是简单的 将语句顺序转换为粗糙的 扭曲。它也打破了传统 封装功能的能力 因为调用函数必须知道 提供一个回调处理程序。股 提供挂起和恢复的功能 恢复执行线程。执行 事件发生时可以暂停或恢复 完成了。这让你可以写作 难读异步事件 以简单、线性、可读的方式处理 封装实现的代码 这暴露了对使用异步代码发生的事件序列的误解。仅仅因为您是内联编写的,并不意味着它将严格地从上到下执行
使异步代码在同步上下文中工作(反之亦然)的方法是存在的——特别是线程和协程(以及它们的有限关系生成器)。但是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');
})
我想我已经想出了解决这个问题的可能办法。我在读这篇文章: 基本上,这个想法是强制从javascript进行回发,起初我发现回发可以工作,但不会调用我的按钮
jConfirm('are you sure?', 'Confirmation Dialog',
function(r) {
result = r;
response = true;
return r;
}
);
if (response == true) {
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');
})
<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}"/>
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;
}
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)) { ... }"
#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;
}