動的に作成された要素にdatepicker()を配置する-JQuery / JQueryUI


115

テキストボックスを動的に作成しましたが、それぞれにクリックでカレンダーを表示できるようにしたいと考えています。私が使用しているコードは:

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

すべてのテキストボックスにdatepicker_recurring_startというクラスがあるにもかかわらず、これは最初のテキストボックスでのみ機能します。

あなたの助けは大歓迎です!


「動的に作成された」とは、ページがロードされる前のコードビハインド、またはページのロード後のJavaScriptを意味しますか?要素がページのロード後に追加された場合、新しいテキストボックスが追加されるたびにカレンダーを再バインドする必要があるためです。
DangerMonkey、2012年

私はそれをPHPの分離コードにロードしています。
染み込ん

私はあなたが混乱しているかもしれないと思うが、それからあなたが提供した情報で伝えるのは難しい。確認のために、「動的に作成されたテキストボックス」の意味を確認してください。
Tr1stan

「ページ1」をロードしている場合、phpはdbを調べて、「ページ1」にある日付テキストボックスの数を確認して表示します。したがって、「ページ1」がロードされると、datepicker()をロードする必要のある4つのテキストボックスがあります。「ページ2」には、datepicker()関数をロードする必要がある7つのテキストボックスがあります。
染み込んで

あなたが最初の呼び出しの後に動作していないデータピッカーに問題がある場合は、この答えをチェックアウト:stackoverflow.com/a/16283547/1329910あなたの問題は、日付ピッカーは、独自のクラスを追加することとしなければならないことがあります。hasDatepickerを
ヴラド

回答:


269

ここにトリックがあります:

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

デモ

$('...selector..').on('..event..', '...another-selector...', ...callback...);構文手段が:
にリスナーを追加します...selector..bodyイベントのために私たちの例では)..event..(私たちの例では「フォーカス」)。セレクター...another-selector....datepicker_recurring_startこの例では)に一致する一致するノードのすべての子孫に対して、イベントハンドラー...callback...(この例ではインライン関数)を適用します。

見る http://api.jquery.com/on/、特に「委任されたイベント」に関するセクションをください


4
これは、あらゆる種類の動的追加で機能するソリューションです。あなたに+1します。
DangerMonkey

5
.datapicker()テキストボックスがフォーカスを取得するたびに呼び出すのは不思議に思えますが、このアプローチには注意が必要です(私がこれを正しく読んでいると仮定します)。ただし、.datapicker()再作成を試みる前に日付ピッカーが作成されているかどうかを確認するため、問題はないと思います。他のコードでは、この恵みがない場合があります。また、.on(のみjQueryの1.7で導入されました-ので、必ず正しいバージョンを使用している作る。
Tr1stan

3
datepickerは、jQueryのバージョンが1.7より前の場合、作成済みかどうかを確認するのに十分なほど賢い(ちなみにすべてのjQueryUIコンポーネント)。ライブを
ilyes kooli

7
フィルターを追加することをお勧めします:not(.hasDatepicker)
Salman A

1
日付ピッカーを含む領域内でjQuery.clone()を使用することに注意してください。もしそうなら、これを追加してhasDatepickerクラスを削除し、id datepickerが入力に追加します:.... find( 'input.hasDatepicker')。removeClass( 'hasDatepicker')。removeAttr( 'id');
yahermann 2017年

44

以下の私にとってjqueryはうまくいきました:

「ボディ」をドキュメントに変更

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

おかげskafandri

注:各フィールドでIDが異なることを確認してください


正解-私は$( 'body')ではなく$(document)を使用する必要があります-コードの小さなスニペットに関する問題の一種。サンプルを問題なく動作させることができますが、JavaScriptの束をフィドルに追加するとすぐに、このコードは機能しなくなります。両方に感謝します。
トムスティッケル2015

16

スカファンドリ+1によるすばらしい回答

これはhasDatepickerクラスをチェックするために更新されました。

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

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

});

1
それを短くすることはでき$('body').on('focus',".datepicker:not(.hasDatepicker)", function(){$(this).datepicker();});ますか?
ルークスティーブンソン

11

.date-pickerクラスを持つ要素にまだクラスがないことを確認してくださいhasDatepicker。その場合、で再初期化しようとしても$myDatepicker.datepicker();失敗します!代わりに、あなたがする必要があります...

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

正解です。動的に読み込まれる要素は私にとって問題ではなかったので、このソリューションは機能しました。
スターリングビーソン、

6

あなたは実行する必要があります .datepicker();他のテキストボックス要素を動的に作成した後でもう一度ます。

DOMに要素を追加する呼び出しのコールバックメソッドでそうすることをお勧めします。

したがって、JQuery Loadメソッドを使用してソースから要素をプルし、それらをDOMにロードするとします。次のようにします。

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

1
これは私の経験から常に実際に機能するとは限りません。最良のケースは、要素に一意のIDを追加し、それらのIDを使用してそれらを参照し、日付ピッカーを適用することです。内部的には、プラグインはこれらのセレクターを使用しているようです。
Wes Johnson

1

動的要素の新しいメソッドはMutationsObserverです。次の例では、underscore.jsを使用して(_.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
});


0

他の解決策はどれも私にとってはうまくいきませんでした。私のアプリでは、jqueryを使用して日付範囲要素をドキュメントに追加し、それらに日付ピッカーを適用しています。そのため、何らかの理由でイベントソリューションが機能しませんでした。

これが最終的に機能したものです:

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

これが私を少し後退させたので、これが誰かを助けることを願っています。


0

クラス.datepickerをJavaScript関数に追加して、入力タイプを動的に変更できるようにすることができます

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

0

@skafandriの回答を変更datepickerして、.datepicker_recurring_startクラスを持つすべての入力にコンストラクターを再適用しないようにしました。

HTMLは次のとおりです。

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

ここにJSがあります:

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

これが実用的なデモです


0

これは私にとってJQuery 1.3で機能したものであり、最初のクリック/フォーカスで表示されています

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

これには、入力にクラス 'mostrar_calendario'が必要です

Liveは、これを「オン」に適合させる必要がある新しいバージョンのJQuery 1.3以降用です。

違いの詳細については、http://api.jquery.com/live/をご覧ください。


0
$( ".datepicker_recurring_start" ).each(function(){
    $(this).datepicker({
        dateFormat:"dd/mm/yy",
        yearRange: '2000:2012',
        changeYear: true,
        changeMonth: true
    });
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.