我试图利用延长的警报,对话从图书馆 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) {

这暴露了对使用异步代码发生的事件顺序的误解。仅仅因为您内联编写了它并不意味着它将严格从上到下执行。

  1. jConfirm 被调用,接收一个函数作为其参数之一,并记住该函数。
  2. jConfirm 在页面上显示其 UI 并立即返回。
  3. 执行“if (response==true)”行。实际上,这应该只是读取“if(响应)”,布尔比较是多余的。但无论如何,回应当然是错误的。您的函数放弃并退出,将控制权交还给浏览器。
  4. 用户单击 jConfirm 的 UI。
  5. jConfirm 现在才开始执行操作并回调您之前提供给它并且它之前记住的函数。
  6. 您的嵌套函数将响应设置为 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>&nbsp;'+
        '<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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top