đưa datepicker () vào các phần tử được tạo động - JQuery / JQueryUI


115

Tôi đã tự động tạo các hộp văn bản và tôi muốn mỗi hộp có thể hiển thị lịch khi nhấp. Mã tôi đang sử dụng là:

$(".datepicker_recurring_start" ).datepicker();

Cái này sẽ chỉ hoạt động trên hộp văn bản đầu tiên, mặc dù tất cả các hộp văn bản của tôi có một lớp được gọi là datepicker_recurring_start.

Sự giúp đỡ của bạn được đánh giá rất cao!


Khi bạn nói "được tạo động", bạn có nghĩa là có mã phía sau trước khi tải trang hoặc với javascript sau khi tải trang? Bởi vì nếu các yếu tố được thêm vào sau khi tải trang, bạn sẽ cần buộc lại lịch mỗi lần thêm một hộp văn bản mới.
DangerMonkey

Tôi đang tải nó trong đoạn mã phía sau với PHP.
dốc

Tôi nghĩ rằng bạn có thể đang bị nhầm lẫn, nhưng sau đó thật khó để nói với thông tin bạn đã cung cấp. Vì vậy, chỉ để xác nhận, bạn có thể xác nhận những gì bạn có nghĩa là 'hộp văn bản được tạo động' không.
Tr1stan

Nếu tôi đang tải 'trang một', php nhìn vào db để xem có bao nhiêu hộp văn bản ngày trong 'trang một' và hiển thị nó. Vì vậy, khi 'trang một' tải, sẽ có 4 hộp văn bản cần tải bộ đo ngày (). 'trang hai' có 7 hộp văn bản cần tải hàm datepicker ().
dốc

Nếu bạn gặp vấn đề với trình chọn dữ liệu không hoạt động sau cuộc gọi đầu tiên, hãy xem câu trả lời sau: stackoverflow.com/a/16283547/1329910 Vấn đề của bạn có thể phải thực hiện với datepicker thêm lớp riêng của mình: hasDatepicker
Vlad

Câu trả lời:


267

Đây là mẹo:

$('body').on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});​

BẢN GIỚI THIỆU

Các $('...selector..').on('..event..', '...another-selector...', ...callback...);phương tiện cú pháp:
Thêm một người biết lắng nghe để ...selector..(các bodytrong ví dụ của chúng tôi) cho sự kiện ..event..( 'tập trung' trong ví dụ của chúng tôi). Đối với tất cả hậu duệ của các nút phù hợp khớp với bộ chọn ...another-selector...( .datepicker_recurring_starttrong ví dụ của chúng tôi), hãy áp dụng trình xử lý sự kiện ...callback...(hàm nội tuyến trong ví dụ của chúng tôi)

Xem http://api.jquery.com/on/ và đặc biệt là phần về "sự kiện được ủy quyền"


4
Đây là một giải pháp sẽ hoạt động trong bất kỳ loại bổ sung động nào. +1 cho bạn.
DangerMonkey

5
Mặc dù có vẻ lạ đối với tôi rằng bạn muốn gọi .datapicker()mỗi khi hộp văn bản lấy nét - vì vậy bạn muốn cẩn thận với phương pháp này (giả sử tôi đang đọc đúng). Tuy nhiên, tôi nghĩ rằng bạn sẽ ổn với .datapicker()điều đó bởi vì nó có thể sẽ kiểm tra xem một người hẹn hò có được tạo trước khi thử tạo lại không. Với mã khác, bạn có thể không có ân sủng này. Ngoài ra, .on (chỉ được giới thiệu trong JQuery 1.7 - vì vậy hãy đảm bảo bạn đang sử dụng phiên bản chính xác.
Tr1stan

3
datepicker đủ thông minh để kiểm tra xem nó đã được tạo hay chưa (tất cả các thành phần jQueryUI) nếu phiên bản jQuery dưới 1.7, bạn có thể chỉ cần sử dụng trực tiếp
ilyes kooli

7
Bạn có thể muốn thêm bộ lọc:not(.hasDatepicker)
Salman A

1
Cảnh giác với việc sử dụng jQuery.clone () trong một khu vực bao gồm một máy đo ngày. Nếu bạn làm như vậy, hãy thêm cái này để xóa lớp hasDatepicker VÀ id datepicker thêm vào đầu vào của bạn: .... find ('input.hasDatepicker'). RemoveClass ('hasDatepicker'). RemoveAttr ('id');
yahermann

44

Đối với tôi dưới đây jquery làm việc:

thay đổi "cơ thể" thành tài liệu

$(document).on('focus',".datepicker_recurring_start", function(){
    $(this).datepicker();
});

Cảm ơn skafandri

Lưu ý: đảm bảo id của bạn khác nhau cho từng trường


Đúng - đối với tôi, tôi phải sử dụng $ (tài liệu) chứ không phải $ ('cơ thể') - Sắp xếp vấn đề với các đoạn mã nhỏ. Tôi có thể lấy ví dụ để làm việc không có vấn đề gì, nhưng ngay sau khi tôi thêm một loạt javascript của mình vào một câu đố, mã này không còn hoạt động với tôi nữa. Cảm ơn cả hai.
Tom Stickel 6/07/2015

16

Câu trả lời tuyệt vời của skafandri +1

Đây chỉ là cập nhật để kiểm tra lớp hasDatepicker.

$('body').on('focus',".datepicker", function(){

    if( $(this).hasClass('hasDatepicker') === false )  {
        $(this).datepicker();
    }

});

1
Điều đó có thể được rút ngắn lại $('body').on('focus',".datepicker:not(.hasDatepicker)", function(){$(this).datepicker();});?
Luke Stevenson

11

Hãy chắc chắn rằng phần tử của bạn với .date-pickerlớp KHÔNG có một hasDatepickerlớp. Nếu có, ngay cả một nỗ lực để khởi tạo lại với $myDatepicker.datepicker();sẽ thất bại! Thay vào đó bạn cần phải làm ...

$myDatepicker.removeClass('hasDatepicker').datepicker();

Hoàn toàn chính xác! Các yếu tố được tải động đã kết thúc không phải là vấn đề đối với tôi, vì vậy giải pháp này đã hoạt động.
Sterling Bory

6

Bạn cần chạy .datepicker();lại sau khi bạn tự động tạo các thành phần hộp văn bản khác.

Tôi khuyên bạn nên làm như vậy trong phương thức gọi lại của cuộc gọi đang thêm các phần tử vào DOM.

Vì vậy, giả sử bạn đang sử dụng phương thức Tải JQuery để kéo các phần tử từ nguồn và tải chúng vào DOM, bạn sẽ làm một cái gì đó như thế này:

$('#id_of_div_youre_dynamically_adding_to').load('ajax/get_textbox', function() {
  $(".datepicker_recurring_start" ).datepicker();
});

1
Điều này không phải lúc nào cũng hoạt động trong thực tế từ kinh nghiệm của tôi. Trường hợp tốt nhất là thêm ID duy nhất vào các thành phần của bạn và sử dụng các ID đó để tham chiếu chúng và áp dụng công cụ hẹn hò. Có vẻ như bên trong các plugin sử dụng các bộ chọn.
Wes Johnson

1

Phương thức mới cho các phần tử động là MutationsObserver .. Ví dụ sau sử dụng hàm underscore.js để sử dụng hàm (_.each).

MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;    

var observerjQueryPlugins = new MutationObserver(function (repeaterWrapper) {

    _.each(repeaterWrapper, function (repeaterItem, index) {

        var jq_nodes = $(repeaterItem.addedNodes);

        jq_nodes.each(function () {

            // Date Picker
            $(this).parents('.current-repeateritem-container').find('.element-datepicker').datepicker({
                dateFormat: "dd MM, yy",
                showAnim: "slideDown",
                changeMonth: true,
                numberOfMonths: 1
            });

        });

    });

});

observerjQueryPlugins.observe(document, {
    childList: true,
    subtree: true,
    attributes: false,
    characterData: false
});

1

Đây là những gì làm việc cho tôi (sử dụng jquery datepicker):

$('body').on('focus', '.datepicker', function() {
 $(this).removeClass('hasDatepicker').datepicker();
});

0

Không có giải pháp nào khác làm việc cho tôi. Trong ứng dụng của tôi, tôi đang thêm các yếu tố phạm vi ngày vào tài liệu bằng cách sử dụng jquery và sau đó áp dụng công cụ hẹn hò với chúng. Vì vậy, không có giải pháp sự kiện nào hoạt động vì một số lý do.

Đây là những gì cuối cùng đã làm việc:

$(document).on('changeDate',"#elementid", function(){
    alert('event fired');
});

Hy vọng điều này sẽ giúp ai đó bởi vì điều này đặt tôi trở lại một chút.


0

bạn có thể thêm lớp .datepicker trong hàm javascript, để có thể tự động thay đổi kiểu nhập

 $("#ddlDefault").addClass("datepicker");
 $(".datepicker").datetimepicker({ timepicker: false, format: 'd/m/Y', });

0

Tôi đã sửa đổi câu trả lời @skafandri để tránh áp dụng lại hàm datepickertạo cho tất cả các đầu vào với .datepicker_recurring_startlớp.

Đây là HTML:

<div id="content"></div>
<button id="cmd">add a datepicker</button>

Đây là JS:

$('#cmd').click(function() {
  var new_datepicker = $('<input type="text">').datepicker();
  $('#content').append('<br>a datepicker ').append(new_datepicker);
});

đây là bản demo


0

Đây là những gì hoạt động với tôi trên JQuery 1.3 và đang hiển thị ở lần nhấp / tập trung đầu tiên

function vincularDatePickers() {
    $('.mostrar_calendario').live('click', function () {
        $(this).datepicker({ showButtonPanel: true, changeMonth: true, changeYear: true, showOn: 'focus' }).focus();
    });
}

điều này cần rằng đầu vào của bạn có lớp 'mostrar_calWikiio'

Live là dành cho JQuery 1.3+ cho các phiên bản mới hơn, bạn cần điều chỉnh tính năng này thành "bật"

Xem thêm về sự khác biệt ở đây http://api.jquery.com/live/


0
$( ".datepicker_recurring_start" ).each(function(){
    $(this).datepicker({
        dateFormat:"dd/mm/yy",
        yearRange: '2000:2012',
        changeYear: true,
        changeMonth: true
    });
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.