jquery UIダイアログ:初期化前にダイアログのメソッドを呼び出すことはできません


101

ダイアログが正常に機能するjquery 1.5のアプリがあります。.liveハンドラーはたくさんありますが、これを.onに変更しました。そのために、jqueryを更新する必要があります(現在は1.8.3 jquerui 1.9.1)。

今、私は得ました: Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

コードは次のとおりです。

Javascript

var opt = {
        autoOpen: false,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

$(document).ready(function() {
$("#divDialog").dialog(opt);
    $("#divDialog").dialog("open");
...    

HTMLコード

<div id="divDialog">
<div id="divInDialog"></div>
</div>

なぜこれが起こっているのでしょうか?

回答:


136

代わりにこれを試してください

$(document).ready(function() {
  $("#divDialog").dialog(opt).dialog("open");
});

次のこともできます:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

これは、ダイアログがに保存されているの$('#divDialog')ではなく、その場で作成されて.dialog(opt)関数によって返される新しいdivに保存されているためです。


5
これでうまくいきました。このようにダイアログを開くたびに、または初めてのみダイアログを初期化する必要がありますか?多くのダイアログがあります。オプションを初期設定し、ボタンでダイアログを開く方法はありませんか?
core-chain.io

6
この解決策では、ダイアログが正常に開かれ、閉じられ、ユーザーがもう一度ダイアログを開こうとしたときに発生する「初期化前にダイアログでメソッドを呼び出せません。メソッド 'open'を呼び出そうとしました」エラーも解決されました。ありがとう@ZOD
spadelives

+1してくれたので、問題も解決しましたが、なぜ機能するのか説明していただけますか
Igor L.

2
@IgorLacik連鎖を実行できるように、.dialog()はそれ自体のインスタンスを返すと想定しています。したがって、.dialog(opt).dialog( 'open')はダイアログオブジェクト(最初の呼び出し)をインスタンス化してから、それに対して 'open'を実行します。次に、$(obj).dialog(opt)を呼び出し、その後$(obj).dialog( 'open')を呼び出すと、jqueryオブジェクトで個別のダイアログオブジェクトがインスタンス化されるため、2番目は最初のダイアログオブジェクトを表示できません。構成オプション。ダイアログコードをさらに掘り下げることなく、確かに言うのは難しいです、そして私はそのための時間を持っていません:D
nealio82

あなたが説明しようとしたことを説明する質問を更新しました。
JotaBe 2013年

22

jQueryをアップグレードできず、次のような場合:

Uncaught Error: cannot call methods on dialog prior to initialization; attempted to call method 'close'

あなたはそのようにそれを回避することができます:

$(selector).closest('.ui-dialog-content').dialog('close');

または、ビューを制御していて、ページ全体で他のダイアログがまったく使用されていないことがわかっている場合は、次のようにすることができます。

$('.ui-dialog-content').dialog('close');

使用closestするとパフォーマンスの問題が発生する場合にのみ、これを行うことをお勧めします。すべてのダイアログでグローバルクローズを行わずに回避する他の方法が考えられます。


10

jqueryuiライブラリを並行して更新せずにjqueryライブラリのみを更新したときに、このエラーが発生しました。私はjqueryui 1.9.0でjquery 1.8.3を使用していました。しかし、jquery 1.8.3を1.9.1に更新すると、上記のエラーが発生しました。問題のある.closeメソッド行をコメント化すると、見つからないというエラーが発生しました.browserjquery 1.8.3で非推奨になり、jquery 1.9.1から削除されたjqueryライブラリ。したがって、基本的に、jquery 1.9.1ライブラリはjquery ui 1.9.0ライブラリと互換性がありませんでした。基本的に、2つの異なるバージョンを使用しようとすると、報告されていないバグがあります。jqueryuiのダウンロードにバンドルされているjqueryバージョンを使用している場合は、問題ないはずですが、別のバージョンを使い始めたときに、このようなエラーが発生します。つまり、要約すると、このエラーは一致しないバージョンからのものです(とにかく私の場合)。


4
jquery uiのバージョンを1.9.2にアップグレードしてこの問題を解決したところ、問題なく動作しました。したがって、jquery 1.9.1とjquery ui 1.9.2は上記のエラーを取り除きます。
johntrepreneur 2013年

4

だからあなたはこれを使う:

var theDialog = $("#divDialog").dialog(opt);
theDialog.dialog("open");

ダイアログでMVCパーシャルビューを開くと、非表示のボタンとJQUERYクリックイベントをインデックスに作成できます。

$("#YourButton").click(function()
{
   theDialog.dialog("open");
   OR
   theDialog.dialog("close");
});

次に、パーシャルビューhtml内で、ボタントリガークリックを呼び出します:

$("#YouButton").trigger("click")

じゃあ。


2

ダイアログが初期化されたとき、またはページの準備ができたときにダイアログをすぐに開きたい場合は、ダイアログのオプションオブジェクトでパラメーターautoOpentrueに設定することもできます。

var opt = {
        autoOpen: true,
        modal: true,
        width: 550,
        height:650,
        title: 'Details'
};

したがって、 `$("#divDialog ")。dialog(" open ");を呼び出す必要はありません。

ダイアログオブジェクトが初期化されると、ダイアログが自動的に開かれます。


2

新しいjQuery UIバージョンでは、初期化されていないダイアログでUIメソッドを呼び出すことができません。回避策として、以下のチェックを使用して、ダイアログが有効かどうかを確認できます。

if (modalDialogObj.hasClass('ui-dialog-content')) {
    // call UI methods like modalDialogObj.dialog('isOpen')
} else {
    // it is not initialized yet
}

0

これもいくつかの回避策です:

$("div[aria-describedby='divDialog'] .ui-button.ui-widget.ui-state-default.ui-corner-all.ui-button-icon-only.ui-dialog-titlebar-close").click();


0

私の場合の問題は$("#divDialog").removeData();、ダイアログ内でフォームデータをリセットする一環として呼び出していたことです。

これにより、という名前のデータ構造uiDialogが消去され、ダイアログを再初期化する必要がありました。

.removeData()はより具体的な削除に置き換え、すべてが再び機能し始めました。


0

私の場合は異なりますが、「this」のスコープが原因で失敗します。

//this fails:
$("#My-Dialog").dialog({
  ...
  close: ()=>{
    $(this).dialog("close");
  }
});

//this works:
$("#My-Dialog").dialog({
  ...
  close: function(){
    $(this).dialog("close");
  }
});

-1

親ビューではなく部分ビューにdivタグがあるため、このエラーメッセージが表示されました


1
そして、これは正確にはどういう意味ですか?
AaA

1
これは十分に説明されていませんが、有効です。MVCでは、部分ビューのダイアログに含まれるdivタグがありました。含まれているdivタグを親ページに移動すると、ダイアログが正しく機能しました。
Paulj 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.