2

jquery ダイアログは Firefox で正しく動作しませんが、Firebug ではエラーは表示されません。私のダイアログは Chrome で問題なく動作します。

状況: 私のページには、さまざまなイベントで開く複数の jquery ダイアログがあります。1 つの [新しい要素の追加] ダイアログで問題が発生しています。ダイアログが最初に開いたときはうまくいきました。その後、テキスト入力ボックスをクリックしたり、入力したりできませんでした。毎回ダイアログを破棄することで問題を解決したと思いました。その後、開くたびに機能しました。しかし、他のダイアログが開いていて、この「新しい要素の追加」ダイアログが開いている場合、同じことが再び起こります。ボックスに入力できません。

私は困惑しています!!!! どうか、どんな助けでも大歓迎です...私はこのコードを何日も見つめてきました。

jquery ダイアログ コードは次のとおりです。

$(function() {

    $( "#dialog-new-osc-el" ).dialog({
        resizable: false,
        autoOpen: false,
        height:300,
        width:400,
        modal: true,
        buttons: {
            "Create": function() {

*create button function stuff here* then:

            $(this).dialog("destroy");
        $( this ).dialog( "close" );
                    create_new_osc_el_dialog();
            },
            Cancel: function() {
            $(this).dialog("destroy");
                $( this ).dialog( "close" );
                create_new_osc_el_dialog();
            }
        },
            close: function() {
            $(this).dialog("destroy");
                $( this ).dialog( "close" );
                create_new_osc_el_dialog();
            }
    });
});

そして、「新しい要素を追加」divをクリックするとダイアログが開きます - divにはonclick関数があります:

<div class="addnewbox" onclick="addneweltoosc();">

この onclick 関数は次のようになります (簡潔にするために一部のコードを削除しています)。

    function addneweltoosc(){
                $( "#dialog-new-osc-el" ).dialog( "open" );
}

ダイアログの実際の HTML はかなり長いですが、重要な点は次のとおりです。

<div id="dialog-new-osc-el" title="Create Element">

<div id="new_osc_el_type" class="pointer">
<ul>
<li onclick="new_osc_el_type_chosen('Branch');">Branch</li>
<li onclick="new_osc_el_type_chosen('Group');">Group</li>
<li onclick="new_osc_el_type_chosen('Division');">Division</li>
<li onclick="new_osc_el_type_chosen('Unit');">Unit</li>
<li onclick="new_osc_el_type_chosen('Strike Team');">Strike Team</li>
<li onclick="new_osc_el_type_chosen('Task Force');">Task Force</li>
<li onclick="new_osc_el_type_chosen('Individual Resource');">Individual Resource</li>
</ul>
</div>
<p><input class="hide" type="text" id="new_osc_el_pos_name" />
</div>

ダイアログは最初にユーザーに選択するリストを提供します。ユーザーがリスト項目をクリックすると、new_osc_el_type_chosen 関数が呼び出されます。この関数はそのリストを非表示にして、「new_osc_el_pos_name」テキスト入力を表示します。これは、ダイアログが最初に開いたときに機能する入力ボックスですが、その後は機能しません。これはコードです:

function new_osc_el_type_chosen(a)

{
$("#new_osc_el_type").addClass("hide");
$("#new_osc_el_pos_name").removeClass("hide");
if (a=="Branch")
{
$("#new_osc_el_pos_name").val("NAME of Branch Director");
}
document.getElementById("new_osc_el_pos_name").setSelectionRange(0,7);
$("#new_osc_el_pos_name").focus();
}

解決しました!

どうやら、モーダルであるすべてのダイアログがそれらの間で競合を引き起こしていた...または何か。実際、理由は100%わかりませんが、 modal:true を modal:false に変更すると問題が解決しました。

4

3 に答える 3

2

Firefoxでも同じ厄介な問題がありました。他のすべてのブラウザはうまく機能しました。

複数のダイアログが定義されているページで問題に気付きました (すべてが で定義されているautoOpen: falseため、ユーザーがトリガーするボタンをクリックするまで開かれません)。dialog("open")

input type="text"それぞれに 1つのボタンと 2 つのボタン ( input type="button"「キャンセル」と「OK」を表す ) を持つ 2 つの単純なダイアログがありました。

どちらのダイアログでも再現できましたが、簡単なテストでは 1 つのダイアログで動作しました。

  1. ダイアログを開きます。最初は入力ボックスにテキストをうまく入力できました。
  2. 右上の X をクリックしてダイアログを閉じます。
  3. #1と同じダイアログを開きます。Firefox を除くすべてのブラウザで、ボックスに問題なく入力できました。Firefox では、すべて問題ないように見えました (モーダル レイヤーはダイアログの背後にありましたが、他のすべてのレイヤーの前にありました) が、単に機能しませんでした。

入力とそのダイアログ div の z-index を増やしてみました。モーダルレイヤーのz-indexを下げてみました。モーダル div 要素も削除しました。これらは効果がありませんでした。次に、jquery-ui.js (jQuery UI - v1.9.2 を使用) 内で「モーダル」を検索したところ、このセクションが問題であることがわかりました (コメントアウトすることで、入力の問題が解消されたことを確認しました)。

問題の原因、jquery-ui.js (1.9.2) から:

// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
if ( this.options.modal ) {
    maxZ = 0;
    $( ".ui-dialog" ).each(function() {
        if ( this !== that.uiDialog[0] ) {
            thisZ = $( this ).css( "z-index" );
            if ( !isNaN( thisZ ) ) {
                maxZ = Math.max( maxZ, thisZ );
            }
        }
    });
    $.ui.dialog.maxZ = maxZ;
}

jQuery UI バグ トラッカーで #4309 を見つけました: http://bugs.jqueryui.com/ticket/4309

問題はすべてのブラウザで修正されたようですが、問題は Firefox に残っていました (少なくとも私が使用しているバージョンでは) - ダイアログの 1 つだけを開いたり、閉じたり、再度開いたりしても発生します (したがって、他のダイアログはそこにはありますが、「open」が呼び出されたことはありません)。

私にとってうまくいったハック修正は、jquery-ui.jsをロードした後にこれを行うことでした:

if ($.browser.mozilla)
{
    // fix firefox z-index bug with modal jquery UI dialog that prevents user from typing after initial modal dialog opened
    $.fn.dialogOriginal = $.fn.dialog; // save original dialog() function
    $.fn.dialog = function ()
    {
        if (!$(this).data("fixModalZIndex"))
        {
            // bind events only once
            $(this).data("fixModalZIndex", true).bind("dialogbeforeclose", function (event, ui)
            {
                // unhook modal behavior to fix firefox bug
                $(this).dialog("option", "modal", false);
            }).bind("dialogclose", function (event, ui)
            {
                var ref = $(this); // save reference for later
                setTimeout(function ()
                {
                    ref.dialog("option", "modal", true); // set back to modal, but in a timeout to avoid the z-index input bug
                    ref = null;
                }, 0);
            });
        }
        return $.fn.dialogOriginal.apply(this, arguments); // call original dialog function
    };
}

これはよくわかりません。おそらく maxZ ロジックを介してデバッグするのに役立つでしょうが、私は Firefox のファンではなく、ハックの修正が機能したので、このチケットを閉じて、jQuery の修正ではなく自分のバグの修正に戻る準備ができていました。この情報が誰かの役に立てば幸いです。すでに modal:false ルートに進むことにしたようです (これも私にとってはうまくいきましたが、クライアントは本当にモーダルにしたかったのです...)

于 2013-04-26T18:06:40.887 に答える
0
  • 破棄してから閉じるという操作の順序は奇妙に思えます。
  • 機能はcreate_new_osc_el_dialog()適切なようです
  • 「Create」を引用符で囲み、Cancel を引用符で囲んでいないという事実は奇妙に思えます。インデントがそのままでは、あなた{}の s が適切な場所にあるかどうかはわかりません。

別のダイアログを開き、[新しい要素の追加] を初めて開いた場合にエラーが発生しますか? それとも、[新しい要素の追加] を開いて閉じ、別のダイアログも開いている場合にのみ発生しますか?

Jquery ダイアログと Firefox には、何年にもわたって多くの問題があったようです。JQuery と Firefox のどのバージョンを使用していますか?

ダイアログ div を に設定しようとする同様の問題の提案を聞いたことがありますがstyle="position:fixed"、それがこの問題の特定の具体化を解決するかどうかはわかりません。

于 2012-07-27T14:29:51.577 に答える