33

かなり見回しましたが、これに対するJQueryソリューション(おそらくJavaScriptの単なる制限)を見つけることができないようです:

<a href="somelink.php" 
   onclick="return confirm('Go to somelink.php?');">Click Here</a>

上記の例では、ユーザーがリンクをクリックすると、ユーザーが確認ボックスで[OK]をクリックした場合にのみhrefに移動します。

私がやろうとしているのは、ポップアップdivを使用してよりモダンな外観を取得することです。おそらくこのようなもの:

<a href="somelink.php" 
   onclick="return jq_confirm('Go to somelink.php?');">Click Here</a>

jq_confirmは、YES/NOまたはOK/CANCELボタンのペアで素敵なdivをポップアップするカスタムJQuery確認関数です)。

しかし、そのようなものは見当たらないようです。

同様の機能を提供するいくつかのJQueryウィジェットライブラリなどを見てきましたが、ユーザーからの応答を待つものはありません(少なくとも、上記のシナリオでは)。代わりに、先に進んでユーザーをリンクに移動します(またはリンクのhref=''部分に埋め込まれているJavaScriptを実行します)。これは、これらのウィジェットの多くにコールバック関数をアタッチしてtrue / false値を返すことができる一方で、onclickイベントは応答を待たず(コールバックは非同期)、それによって確認ボックスの目的が無効になるためだと思います。

私が必要としているのは、デフォルトのconfirm()コマンドが提供するのと同じ種類のhalt-all-javascript(モーダル)機能です。これはJQuery(またはJavaScript)でも可能ですか?

私はJavaScriptやJQueryの専門家ではないので、そこにいる教祖に任せます。すべてのJQuery(または純粋なJavaScript)ソリューションを歓迎します(可能であれば)。

ありがとう -

4

12 に答える 12

21

同じ問題を解決する必要がありました。JQuery UIdialogのウィジェットを使用して終了しました。コールバックを使用せずにこれを実装することができましたが、確認機能を使用するリンクのイベント ハンドラーで部分的に初期化する必要があります(これを複数のリンクに使用する場合)。これは、リンクのターゲット URL を確認ボタンのクリックのイベント ハンドラーに挿入する必要があるためです。 dialogclick

例に適しているように抽象化された私のソリューションを次に示します。CSS クラスを使用して、どのリンクに確認動作が必要かを示します。

<div id="dialog" title="Confirmation Required">
  Are you sure about this?
</div>

<script type="text/javascript">
  $(document).ready(function() {
    $("#dialog").dialog({
      autoOpen: false,
      modal: true
    });

  $(".confirmLink").click(function(e) {
    e.preventDefault();
    var targetUrl = $(this).attr("href");

    $("#dialog").dialog({
      buttons : {
        "Confirm" : function() {
          window.location.href = targetUrl;
        },
        "Cancel" : function() {
          $(this).dialog("close");
        }
      }
    });

    $("#dialog").dialog("open");
  });




  }); // end of $(document).ready


</script>

<a class="confirmLink" href="http://someLinkWhichRequiresConfirmation.com">Click here</a>
<a class="confirmLink" href="http://anotherSensitiveLink">Or, you could click here</a>
于 2009-06-09T21:29:37.913 に答える
7

http://www.84bytes.com/2008/06/02/jquery-modal-dialog-boxes/をチェックしてください

JQuery用のさまざまなモーダルボックスがあります。

http://www.ericmmartin.com/simplemodal/を見る必要があると思います

JavaScript確認機能のモーダルダイアログオーバーライド。onShowの使用方法と、デフォルトのJavaScript確認ダイアログの代わりにモーダルダイアログ確認を表示する方法を示します。

于 2009-05-18T17:01:29.293 に答える
7

jQuery UI サイトのjQuery Modal Dialogはご覧になりましたか?

于 2009-05-27T09:44:03.883 に答える
6

ここで、この問題の解決策についてブログを書きました: http://markmintoff.com/2011/03/asp-net-jquery-confirm-dialog/

この記事は ASP.Net を対象としていますが、php にも簡単に適用できます。false を返し、ユーザーが「OK」または「YES」または what-have-you をクリックしたときにクリックを防止することに依存しています。リンクまたはボタンをもう一度クリックするだけです。

var confirmed = false;
function confirmDialog(obj)
{
    if(!confirmed)
    {
        $( "#dialog-confirm" ).dialog({
            resizable: false,
            height:140,
            modal: true,
            buttons: {
                "Yes": function()
                {
                    $( this ).dialog( "close" );
                    confirmed = true; obj.click();
                },
                "No": function()
                {
                    $( this ).dialog( "close" );
                }
            }
        });
    }

    return confirmed;
}

試してみて、感想を教えてください。これで問題が解決することを願っています。

于 2012-01-25T08:46:06.637 に答える
2

次のコードを記述して、標準の window.confirm 関数をオーバーライドできるはずです。

window.confirm = modalConfirm

次に、このような関数を作成する必要があります

function modalConfirm(message){
  // put your code here and bind "return true/false" to the click event
  // of the "Yes/No" buttons.
}

まだテストしていませんが、これは機能するはずです。私はまさに今これを行うつもりであり、それがどのように機能したかを皆さんにお知らせします.

編集: 上記の例をテストしましたが、不可能でした。次のように、上書きされた確認関数にコールバック関数を渡す必要があります。

function modalConfirm(message, callback){
  ... 
  $("button.yes").click(function(){
     callback(result);
  });
  ...
}

..関数への呼び出しを次のようにします。

confirm("Are you sure?", function(result){
  alert(result);
});

つまり、ブラウザーがハングする厄介なループを引き起こさずに、デフォルトの window.confirm 関数を完全にオーバーライドすることはできません。上記のように確認呼び出しを変更する必要があると思います。

于 2009-05-27T09:37:46.547 に答える
2

この質問には標準的な答えがないように思われるため、またはdoのように JavaScript の実行をプログラムで一時停止 (および再開) する方法はありalertconfirmません。

そうは言っても、今日この動作に依存することは、通常、javascript のシングル スレッドの性質を考えると悪い習慣と見なされます。前述の関数が実行を一時停止する理由は、おそらく Web がまだ非常に初期の段階にあったときに設計されたためです。互換性を確保するために、後で変更せずに残します。現在はできるだけ多くのノンブロッキング js コードを記述することに重点が置かれているため、プログラムで js を停止する機能が ECMAScript の将来の仕様に組み込まれることはまずありません。警告ダイアログは、バックグラウンドで実行されている他の JavaScript コードと共存できます。

于 2012-10-18T22:47:55.303 に答える
1

デフォルトの window.confirm 関数を置き換えるために使用できるソリューションがあります。完全に可能ではないため、 window.confirm をオーバーライドする必要はありません。

私のソリューションでは、私のような一般的なクラスを持つことができます。たとえば、処理前に確認が必要な要素に配置する「確認アクション」としましょう。スクリプトは非常にシンプルで、jQuery、jQuery UI ダイアログを使用し、他のプラグインは使用しません。

jsFiddle ( http://jsfiddle.net/74NDD/39/ ) で実装の完全なデモを見つけることができます。

使用法:

  • この JavaScript コードを HTML ヘッドに追加するか、JavaScript にある他のクリック バインディングの前に追加します。

    $("#dialog:ui-dialog").dialog("destroy");
    
    $('.confirm-action').live('click', function(e) {
        $self = $(this);
    
        if (e && e.stopImmediatePropagation && $self.data('confirmed') !== true) {
            e.stopImmediatePropagation();
    
            $('#confirm-action-dialog').dialog({
                height: 110,
                modal: true,
                resizable: false,
                draggable: false,
                buttons: {
                    'Yes': function() {
                        $(this).dialog('close');
                        $self.data('confirmed', true);
                        $self.click();
                    },
                    'No': function() {
                        $self.data('confirmed', false);
                        $(this).dialog('close');
                    }
                }
            });
        } else if ($self.data('confirmed') === true) {
            e = window.event;
            e.cancelBubble = false;
            $self.data('confirmed', false);
        }
    
        return false;
    });
    
  • この html を本文のどこかに配置します (デフォルトでは非表示になっています)。

    <div style="display:none;" id="confirm-action-dialog" title="アクションを確認しますか?">
        <p>
            <span class="ui-icon ui-icon-alert"></span>
            続行してもよろしいですか?
        </p>
    </div>
    
  • 確認が必要な要素には、「confirm-action」クラスを配置します。

    確認アクション

このソリューションは、jQuery イベントのバブリングを変更せず、ユーザーが何をしたいかを決定するまで他のすべてのイベントを一時停止 (停止) するだけなので、完璧に機能します。

別のjQueryプラグインをインストールしたり、他のハックを行ったりする必要のない他の解決策を見つけることができなかったので、これが他の誰かに役立つことを願っています.

于 2012-03-04T15:02:55.390 に答える
1

次のように関数内にリダイレクトを配置します。

<script>
    function confirmRedirect(url, desciption) {
       if (confirmWindow(desciption)) {
           window.location = url;
       }
    }
</script>

そして、次のように呼び出します。

<a href="javascript:confirmRedirect('somlink.php','Are you sure?')">Go!</a> 
于 2009-05-18T17:05:27.070 に答える
1

この問題を回避する方法は、オブジェクトに任意のデータを追加し、クリック時にそのデータをチェックすることでした。存在する場合は、通常どおり関数を続行します。それ以外の場合は、はい/いいえで確認します (私の場合は jqtools オーバーレイを使用しています)。ユーザーが [はい] をクリックした場合 - オブジェクトにデータを挿入し、別のクリックをシミュレートしてデータを消去します。いいえをクリックした場合は、オーバーレイを閉じます。

これが私の例です:

$('button').click(function(){
    if ($(this).data('confirmed')) {
        // Do stuff
    } else {
        confirm($(this));
    }
});

そして、これは確認機能をオーバーライドするために行ったことです(jqueryツールのオーバーレイを使用):

window.confirm = function(obj){
    $('#dialog').html('\
        <div>\
            <h2>Confirm</h2>\
            <p>Are you sure?</p>\
            <p>\
                <button name="confirm" value="yes" class="facebox-btn close">Yes</button>\
                <button name="confirm" value="no" class="facebox-btn close">No</button>\
            </p>\
        </div>').overlay().load();
    $('button[name=confirm]').click(function(){
        if ($(this).val() == 'yes') {
            $('#dialog').overlay().close();
            obj.data('confirmed', true).click().removeData('confirmed');
        } else {
            $('#dialog').overlay().close();
        }
    });
}
于 2011-05-11T15:40:11.053 に答える
1

Banu のソリューションの上に構築して (ありがとうございます!)、各ページの上に 1 つのポップ ソリューションを作成します。このコードを内部に貼り付けます。

$(document).ready

そして、確認したいすべてのリンクに「confirmLinkFollow」クラスを追加します。

$(".confirmLinkFollow").click(function(e) {
    e.preventDefault();
    var targetUrl = $(this).attr("href");
var $dialog_link_follow_confirm = $('<div></div>').
        html("<p>Are you sure?</p>").
        dialog({autoOpen: false,
        title: 'Please Confirm',
        buttons : {
            "Confirm" : function() { 
                window.location.href = targetUrl; 
        },
        "Cancel" : function() { 
                $(this).dialog("close"); 
            }
        },

        modal: true,
    minWidth: 250,
    minHeight: 120
    }
    );


    $dialog_link_follow_confirm.dialog("open");
});
于 2011-09-21T03:45:45.060 に答える
0

ほぼ3年後、私は似たようなものを探しています. 受け入れられる「迅速な」解決策が見つからなかったので、OPの基準に非常に近いものを書きました。他の人が将来役立つと思うかもしれません。

JavaScript はイベント ドリブンです。つまり、純粋な JavaScript の確認機能を一時停止するために使用できる「待機」または「スリープ」ループをサポートしていません。オプションには、ブラウザ プラグインまたは AJAX を使用したプロセッサ サイクルの書き込みが含まれます。ますますモバイル化が進み、インターネット接続が不安定になることもあるこの世界では、これらのどれも優れたソリューションではありません. これは、「確認」機能からすぐに戻らなければならないことを意味します。

ただし、上記のコード スニペットには「false」ロジックがないため (つまり、ユーザーが [キャンセル] をクリックしても何も行われない)、ユーザーが [OK] をクリックしたときに、「クリック」または「送信」イベントを再度トリガーできます。 " 「確認」関数内でフラグを設定し、そのフラグに基づいて対応してみませんか?

私のソリューションでは、「モーダル」ダイアログではなく FastConfirm を使用することにしました。必要なものを使用するようにコードを簡単に変更できますが、私の例はこれを使用するように設計されています。

https://github.com/pjparra/Fast-Confirm

これが行うことの性質上、パッケージ化するクリーンな方法はわかりません。荒削りな部分が多すぎると感じた場合は、遠慮なくそれらを滑らかにするか、他の人が推奨する方法でコードを書き直してください。

/* This version of $.fn.hasEvent is slightly modified to provide support for
 * the "onclick" or "onsubmit" tag attributes. I chose this because it was
 * short, even if it is cryptic.
 *
 * Learn more about the code by Sven Eisenschmidt, which is licensed under
 * the MIT and GPL at:
 *     http://github.com/fate/jquery-has-event
 */
(function($) {
    $.fn.hasEvent = function(A, F, E) {
        var L = 0;
        var T = typeof A;
        E = E ? E : this;
        var V = (E.attr('on'+A) != undefined);
        A = (T == 'string') ? $.trim(A) : A;
        if (T == 'function')
            F = A, A = null;
        if (F == E)
            delete(F);
        var S = E.data('events');
        for (e in S)
            if (S.hasOwnProperty(e))
                L++;
        if (L < 1)
            return V; // = false;
        if (A && !F) {
            return V = S.hasOwnProperty(A);
        } else if(A && S.hasOwnProperty(A) && F) {
            $.each(S[A], function(i, r) {
                if(V == false && r.handler == F) V = true;
            });
            return V;
        } else if(!A && F) {
            $.each(S, function(i, s) {
                if (V == false) {
                    $.each(s, function(k, r) {
                        if (V == false && r.handler == F)
                            V = true;
                    });
                }
            });
        }
        return V;
    }
    $.extend($, {hasEvent: $.fn.hasEvent});
}) (jQuery);

/* Nearly a drop-in replacement for JavaScript's confirm() dialog.
 * Syntax:
 *   onclick="return jq_confirm(this, 'Are you sure that you want this?', 'right');"
 *
 * NOTE: Do not implement "false" logic when using this function. Find another way.
 */
var jq_confirm_bypass = false;
function jq_confirm(el, question, pos) {
    var override = false;
    var elem = $(el);

    if ($.fn.fastConfirm == undefined) {
        override = confirm(question);
    } else if (!jq_confirm_bypass) {
        if (pos == undefined) {
            pos = 'right';
        }

        elem.fastConfirm({
            position: pos,
            questionText: question,
            onProceed: function(trigger) {
                var elem = $(trigger);
                elem.fastConfirm('close');

                if (elem.hasEvent('click')) {
                    jq_confirm_bypass = true;
                    elem.click();
                    jq_confirm_bypass = false;
                }
                if (elem.hasEvent('submit')) {
                    jq_confirm_bypass = true;
                    elem.submit();
                    jq_confirm_bypass = false;
                }
                // TODO: ???
            },
            onCancel: function(trigger) {
                $(trigger).fastConfirm('close');
            }
        });
    }

    return override ? override : jq_confirm_bypass;
}

だから... onclick="return confirm('これをテストしますか?');" onclick="return jq_confirm(this, 'これをテストしますか?');" pos/"right" パラメータはオプションであり、Fast-Confirm 専用です。

クリックすると、jq_confirm() 関数が jQuery ダイアログを生成し、「false」を返します。ユーザーが「OK」をクリックすると、jq_confirm() はフラグを設定し、元のクリック (または送信) イベントを呼び出し、「true」を返し、同じページに留まりたい場合にフラグを設定解除します。

于 2012-02-20T04:11:33.767 に答える
0

次のリンクには、JavaScript での confirm("something") のような構築に似た確認ボックス用の jQuery プラグインがあります。

http://labs.abeautifulsite.net/archived/jquery-alerts/demo/

于 2011-04-03T16:05:22.710 に答える