jQuery UI의 DatePicker가 왜 동적 DOM으로 깨지는 이유는 무엇입니까?
-
21-08-2019 - |
문제
여기서 동적 DOM과 함께 일하고 있으며 특정 클래스 이름을 가진 모든 입력에 jQuery UI DatePicker를 불렀습니다. .date
그것은 첫 번째, 정적, 구성과 잘 작동하지만 복제 할 때 이벤트 처리기는 이동하고 싶지 않은 것 같습니다. Firebug 오류가 발생합니다.
Inst는 정의되지 않았습니다
나는 jQuery의 새로운 것을 조사하려고 노력했다 live()
기능이지만 둘을 결합 할 수 없었습니다. 어떤 아이디어?
해결책
아, 얻었다. HTML을 DOM에 추가 한 직후 DatePicker가 팝업하고 싶은 모든 입력에서 이것을 실행합니다. DatePicker는 첨부 된 요소에 클래스를 추가하므로 기존 입력을 필터링하여 새 입력에만 적용 할 수 있습니다.
$('.date').not('.hasDatePicker').datepicker();
며칠 동안 인터넷 검색을하고 아무것도 찾지 못했을 때 이것이 사람들이 도움이되기를 바랍니다.
또한 확인하는 것이 더 빨라질 것임을 주목해야합니다. input.date
새로운 생성 된 HTML에서는 전체 페이지가 아닌 컨텍스트로 설정하여 시간을 절약 할 수 있으므로보다 효율적인 작업이기 때문에 시간을 절약 할 수 있습니다.
다른 팁
비슷한 문제가 있었는데 페이지에 여러 테이블이 있었고 각각 다수의 DatePickers가 있었으며 버튼 "Addline"클릭에 동적 HTML 및 DatePicker가있는 테이블 행을 추가했습니다.
많은 검색 후 입력 날짜 필드가 "ID"가 없다는 것을 깨달았습니다.
<input type="text" class="datepicker" name="mDate1" value="" size=8 >
jQuery는 모든 날짜 필드 값을 페이지에 정의 된 첫 번째 날짜 필드를 가리키고 있었고, 캘린더는 모든 날짜 필드에 팝업되지만 첫 번째 날짜 필드의 값은 변경 될 것이며, 이와 같이 HTML을 변경했습니다.
<input type="text" class="datepicker" id="Date1" name="mDate1" value="" size=8 >
"ID"를 추가하고 작동하기 시작하여 동적 날짜 필드를 위해 ID를 다음과 같이 변경합니다.
var allColumns = $("#"+$tableId+" tr:last td");
$(allColumns).each(function (i,val) {
if($(val).find(":input").hasClass("datepicker")){
$(val).find(":input").attr("id",newId+$(val).find(":input").attr("id"));
}
});
'라이브'이벤트를 사용하여 Dynamic Dom과 함께 작동하도록해야합니다. 따라서 DatePicker 입력에 대한 클래스가 '날짜 입력'인 경우 다음 코드가 작동합니다.
$(document).ready(function() {
$('.date-input').live('click', function() {
$(this).datepicker('destroy').datepicker({showOn:'focus'}).focus();
});
});
이것은 조금 늦었을 수도 있지만, 위의 모든 제안은 나에게 효과가 없었습니다. 나는 이것을위한 쉬운 해결책을 생각해 냈습니다.
첫째, 문제를 일으키는 원인 : jQuery는 datePicker를 요소 ID에 할당합니다. 복제 요소 인 경우 동일한 ID도 복제 될 수 있습니다. 어떤 jQuery가 마음에 들지 않습니다. 클릭 한 입력 필드에 관계없이 NULL 참조 오류를 수신하거나 첫 번째 입력 필드에 할당 된 날짜로 끝날 수 있습니다.
해결책:
1) DATED DATEDPICKER 2) 모든 입력 필드에 새 고유 ID를 지정 3) 각 입력에 대해 datePicker를 지정
입력이 이와 같은 것인지 확인하십시오
<input type="text" name="ndate[]" id="date1" class="n1datepicker">
복제하기 전에 DatePicker를 파괴하십시오
$('.n1datepicker').datepicker('destroy');
복제 후이 라인도 추가하십시오
var i = 0;
$('.n1datepicker').each(function () {
$(this).attr("id",'date' + i).datepicker();
i++;
});
그리고 마법이 일어납니다
사용
$j(id or class).removeClass('hasDatepicker').datepicker();
작동합니다
JQuery Selectors 사용 :
$(".mydatepicker:not(.hasDatepicker)").datepicker()
페이지의 jQuery-UI 라이브러리의 여러 인스턴스로 인해이 오류가 발생합니다. 중복 인스턴스를 제거하면 내 사례가 작동합니다
입력과 동일한 ID 속성을 갖는 TD 포함 요소를 갖는 것과 같은 증상이 동일한 증상을 경험했습니다.
<td id="fld_xyz"><input id="fld_xyz" class="date" /></td>
어쨌든 이것이 이상적이지 않다는 것을 알고 있지만 DatePicker 구성 요소가 ID의 독창성에 의존하는 것 같습니다.
나는이 문제가 있었다. 내 상황은 DatePicker와의 입력과 동일한 ID를 가진 다른 요소를 가지고 있다는 것입니다.
오늘 나는 같은 문제에 직면했다 ... 나는 DateTimePicker 내 응용 프로그램에 플러그인.
또한 jQuery의 기본 날짜 피커도 사용합니다. 문서 준비로 둘 다 호출 할 때마다 오류가 발생하고 있습니다. inst is undefined
.
$(document).ready(function(){
$(".datepickerCustom").datetimepicker();
$(".datepicker").datepicker();
$("#MainForm").validationEngine('attach');
....
});
그래서 아래와 같이 문서가 준비되기 전에 코드를 호출하도록 코드를 변경했습니다.
$(".datepickerCustom").datetimepicker();
$(".datepicker").datepicker();
$(document).ready(function(){
$("#MainForm").validationEngine('attach');
....
});
이제 모든 것이 잘 작동합니다. 아무 문제 없습니다.
첫 번째 호출 후 데이터 피커가 작동하지 않는 것과 비슷한 문제가있었습니다. 여기에서 내 문제에 대한 답을 찾았습니다.
http://www.stemkoski.com/problem-with-jquery-ui-datepicker-dynamic-dom/
나는 템플릿에서 동적으로 섹션을 복제했으며 DatePicker가 다음에 추가하는 클래스를 포함하여 실수로 다음을 포함했습니다.
hasDatepicker
템플릿을 복제 한 후 첫 데이트 피커 전화를 배치했습니다. 그런 다음 클론의 각 인스턴스 후 DatePicker 호출을 추가했습니다.
$(source).clone().appendTo(destination).find(".datepicker").datepicker();
여기에서 많은 답변을 시도한 후, 이것은 저에게 효과가 있었고 첫 번째 클릭/포커스에서 보여지는 것입니다.
function vincularDatePickers() {
$('.mostrar_calendario').live('click', function () {
$(this).datepicker({ showButtonPanel: true, changeMonth: true, changeYear: true, showOn: 'focus' }).focus();
});
}
이것은 당신의 입력에 클래스 'mostrar_calendario'가 있어야합니다.
Live는 jQuery 1.3+ 용입니다. 최신 버전의 경우 "ON"에 적응해야합니다.
차이점에 대한 자세한 내용은 여기를 참조하십시오 http://api.jquery.com/live/
여전히 작동하지 않으면 복제 된 ID 때문입니다. 다음과 같이 DatePicker를 완전히 제거 할 수 있습니다.
$(selector).removeClass('hasDatepicker').removeAttr('id').datepicker();