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'

다음은 코드입니다.

자바 스크립트

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
이 솔루션은 대화 상자를 성공적으로 열고 닫은 다음 사용자가 대화 상자를 두 번째로 열려고 할 때 발생하는 "초기화 전에 대화 상자에서 메서드를 호출 할 수 없습니다."열기 "메서드를 호출하려고했습니다."오류를 해결했습니다. . 감사 @ZOD은
spadelives

+1을했는데 내 문제도 해결되었지만 작동하는 이유를 설명해 주시겠습니까?
Igor L.

2
@IgorLacik .dialog ()가 자신의 인스턴스를 반환하므로 체인을 수행 할 수 있다고 가정합니다. 따라서 .dialog (opt) .dialog ( 'open')은 대화 개체 (첫 번째 호출)를 인스턴스화 한 다음 '열기'를 수행합니다. 그런 다음 $ (obj) .dialog (opt) 및 $ (obj) .dialog ( 'open')을 호출하면 나중에 jquery 개체에서 별도의 대화 개체를 인스턴스화하므로 두 번째는 첫 번째 대화 상자를 볼 수 없다고 가정합니다. 구성 옵션. 대화 코드를 더 자세히 살펴 보지 않고는 확실히 말하기 어렵습니다. 그럴 시간이 없습니다. : D
nealio82

설명하려고 한 내용을 설명하기 위해 질문을 업데이트했습니다.
JotaBe 2013-06-19

23

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 다운로드 페이지에서 jquery 1.6 이상에서 작동한다고 말 했음에도 불구하고 jquery ui 1.9.0 라이브러리와 호환되지 않았습니다. 기본적으로 두 버전의 다른 버전을 사용하려고 할 때보고되지 않은 버그가 있습니다. jqueryui 다운로드와 함께 제공되는 jquery 버전을 사용하는 경우 괜찮을 것이라고 확신하지만 다른 버전을 사용하기 시작하면 구타 경로에서 벗어나 이와 같은 오류가 발생합니다. 요약하면이 오류는 일치하지 않는 버전에서 발생합니다 (내 경우에는 어쨌든).


4
jquery ui 버전을 1.9.2로 업그레이드 하여이 문제를 해결 한 다음 작동했습니다. 따라서 jquery ui 1.9.2를 사용하는 jquery 1.9.1은 위의 오류를 제거합니다.
johntrepreneur 2013 년

4

그래서 이것을 사용합니다.

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

Dialog에서 MVC Partial View를 열면 숨겨진 버튼과 JQUERY 클릭 이벤트를 색인에 만들 수 있습니다.

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

그런 다음 부분보기 HTML 내부에서 다음과 같이 버튼 트리거 클릭을 호출합니다.

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

안녕.


2

Dialog가 초기화되거나 페이지가 준비되었을 때 즉시 Dialog를 열려면 대화 상자 의 옵션 개체에서 매개 변수 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

단순히 ScriptManager를 페이지에 추가하기 만하면됩니다. 문제가 해결되었습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.