3

I have jQuery UI confirm dialog:

function fnComfirm(title, content) {
    $("#dialog:ui-dialog").dialog("destroy");
    $("#dialog-confirm p").html(content);
    $("#dialog-confirm").dialog({
        title: title,
        resizable: false,
        height: 200,
        width: 486,
        modal: true,
        buttons: {
            "OK": function() {
                $( this ).dialog("close");
                return true;
            },
            Cancel: function() {
                $( this ).dialog("close");
                return false;
            }
        }
    });
}

Called by JSF2 html:

<a4j:commandButton action="#{userBean.makeSomething()}"  type="button" onclick="if (fnValidateUsersList()) {return fnComfirm('Delete User', 'Bla bla')}" />

But I can't get true/false value from this function. I saw many questions here on this site about it, tried all of them, but still get no success.

UPDATE: output of <a4j:commandButton>:

<input type="button" value="Make Something" onclick="jsf.util.chain(this,event,&quot;if (fnValidateUsersList()) {return fnComfirm('Delete User', 'Bla bla')}&quot;,&quot;RichFaces.ajax(\&quot;frm:j_idt25\&quot;,event,{\&quot;incId\&quot;:\&quot;1\&quot;} )&quot;);return false;" name="frm:j_idt25" id="frm:j_idt25">
4

5 に答える 5

2

ここで私が使用するアプローチ(あなたはあなたの例のために一般的な考えを取ることができます)

2つのボタンが必要です

最初Yesのボタンは非表示になり、確認ダイアログをクリックした結果として呼び出されます。この非表示のボタンは、サーバー側のメソッドを呼び出しrenderf:ajax

<h:commandButton id="myHiddenButtonID" value="DeleteHiddenButton" action="#{userBean.makeSomething()}" style="display:none">
    <f:ajax render="@form" ></f:ajax>
</h:commandButton>

2番目のボタンはダイアログを開きます。このボタンはexecute="@form"、サーバーBeanで更新するフォームをサーバーに送信します(テーブルに選択列がある場合(テーブルにいくつかの列を選択し、ボタンをクリックして削除します)。例)

<h:commandButton value="Delete">
    <f:ajax execute="@form" onevent="openDialogFunc()"></f:ajax>
</h:commandButton>

次に、js関数の実装について説明します。

function openDialogFunc(data){
    if (data.status === 'success') {
        $('#dialog').dialog({
                    title: title,
                    resizable: false,
                    height: 200,
                     width: 486,
                     modal: true,
         buttons: {
                 "Ok": function() { 
                     $("#myHiddenButtonID").click();
                     $(this).dialog("close"); 
                 }, 
                 "Cancel": function() { 
                     $(this).dialog("close"); 
                 } 
             }
         });
    }
}

[OK]ダイアログボタンをクリックした場合にのみ、非表示のボタンが実行されることに注意してください。$("#myHiddenButtonID").click();それ以外の場合は何も起こりません...

私が過去に答えた同様の質問からこれを取りましたJSFでJQuery確認ダイアログを実装する方法

于 2012-07-10T17:30:13.923 に答える
0
function fnComfirm(title, content) {
    $("#dialog:ui-dialog").dialog("destroy");
    $("#dialog-confirm p").html(content);
    $("#dialog-confirm").dialog({
        title: title,
        resizable: false,
        height: 200,
        width: 486,
        modal: true,
        buttons: {
            "OK": function() {
                //do whatever you need here, i.e. form post
                alert('ok!');
            },
            Cancel: function() {
                $( this ).dialog("close");
                return false;
            }
        }
    });
}
于 2012-07-10T15:27:36.317 に答える
0

これは、関数が実行され、ダイアログプラグインが呼び出されて終了するために発生します。このプラグインは実行され、ボタンの戻りはイベントに影響しません。

これを克服する最善の方法は、押されたボタンに応じて実行されるcalback関数を作成することです。

function fnComfirm(title, content, callbackOK, callbackCancel) {  
    $("#dialog:ui-dialog").dialog("destroy");  
    $("#dialog-confirm p").html(content);  
    $("#dialog-confirm").dialog({  
        title: title,  
        resizable: false,  
        height: 200,  
        width: 486,  
        modal: true,  
        buttons: {  
            "OK": function() {  
                $( this ).dialog("close"); 
                if (typeof callbackOK == function) {
                    callbackOK();
                } else if (callbackOK) {
                    window.location.href = callbackOK;
                }
                return true;  
            },  
            Cancel: function() {  
                $( this ).dialog("close");
                if (typeof callbackCancel == function) {
                    callbackCancel();
                } else if (callbackCancel) {
                    window.location.href = callbackCancel;
                }

                return false;  
            }  
        }  
    });
    return false;
}  

次に、次のように呼び出すことができます。

... onclick="if (fnValidateUsersList()) {return fnComfirm('Delete User', 'Bla bla', this.href)}" 
于 2012-07-10T15:27:49.573 に答える
0

戻り値は、ネストされた関数の[OK]ボタンと[キャンセル]ボタンのコンテキストで、コールバックを試すことができます。

function fnComfirm(title, content,onSusses,onCancel) {
    $("#dialog:ui-dialog").dialog("destroy");
    $("#dialog-confirm p").html(content);
    $("#dialog-confirm").dialog({
        title: title,
        resizable: false,
        height: 200,
        width: 486,
        modal: true,
        buttons: {
            "OK": function() {
                $( this ).dialog("close");
                onSusses();
            },
            Cancel: function() {
                $( this ).dialog("close");
                onCancel();
            }
        }
    });
}

そして電話する

fnComfirm(title,content,function(){alert('Ok')},function(){alert('cancel');}})
于 2012-07-10T15:29:44.410 に答える
-2

JSについてはよくわかりませんがreturn false、入れ子関数内に戻ってきていると思いますか?!あなたがしたいのはこれです。

function fnComfirm(title, content) {
var returnVar;
$("#dialog:ui-dialog").dialog("destroy");
$("#dialog-confirm p").html(content);
$("#dialog-confirm").dialog({
    title: title,
    resizable: false,
    height: 200,
    width: 486,
    modal: true,
    buttons: {
        "OK": function() {
            $( this ).dialog("close");
            returnVar = true;
        },
        Cancel: function() {
            $( this ).dialog("close");
            returnVar = false;
        }
    }
});
return returnVar;
}

私が言ったように、私はJavascriptの専門家ではありませんが、これが問題だと思います:)

于 2012-07-10T15:23:40.670 に答える