4

このコードは完全に機能しますが、例外として、ダイアログ ウィンドウは期待どおりに X ミリ秒後に閉じません...

setTimeout関数が実行されます(私はそこにアラート()を置いて動作しました...)、問題があると$("#alert div").dialog('close');思いますが、何が悪いのかわかりません...

if ($("#alert").length) {
    var title;
    if ($("#alert span").length) {
        title = $("#alert span").text();
    }
    $("#alert div").dialog({
        title: title,
        modal: true,
        open: function() {
            setTimeout(function() {
                $("#alert div").dialog('close');
            }, 2000);
        }
    });
}

編集:それが役立つ場合は、ここに HTML があります:

<div id="alert">
    <span>Password change</span>
    <div>Password was successfully changed.</div>
</div>

解決しました!なぜ私のコードが機能しないのか、誰かが考えを持っていれば素晴らしいでしょう...

4

2 に答える 2

12

スコーピングの問題があります。このjsFiddleの例を試してください:

if ($("#alert").length) {
    var title;
    if ($("#alert span").length) {
        title = $("#alert span").text();
    }
    $("#alert div").dialog({
        title: title,
        modal: true,
        open: function() {
            var foo = $(this);
            setTimeout(function() {
               foo.dialog('close');
            }, 2000);
        }
    });
}​

これが発生し、期待どおりに機能しない理由は、ダイアログになるターゲット div を参照する方法と、jQuery UI がダイアログを作成する方法が原因です。開発者コンソールを確認すると、jQuery が div を DOM 内の元の位置から引き出しており、その div が#alert divの子ではないため、によって参照できなくなっていることがわかります#alert。その div に独自の ID を指定した場合、それは期待どおりに機能し、それを参照するために一時変数は必要ありません。

于 2012-08-12T20:22:11.133 に答える
0

テスト済みで動作中のライブデモ:

http://jsfiddle.net/oscarj24/q6tD9/2/

私はこの方法が良いと思います:

jQuery.fn.exists = function(){return this.length>0;}

$(function() {
    if($('#alert').exists()){
        var modal = $('#alert div');
        modal.dialog({ title: $('#alert span').text(), modal: true });
        var opened = modal.dialog('isOpen');
        if(opened){
            setTimeout(function(){ 
               modal.dialog('close'); 
            }, 2000);
        }
    }
});​
于 2012-08-12T20:26:17.463 に答える