jquery datepicker不能动态创建html

时间:2012-03-09 20:25:08

标签: javascript jquery jquery-plugins jquery-ui-datepicker

我正在用内部控件动态创建几个div。其中两个控件应该是datepickers。但由于某种原因,他们没有显示(只显示输入文本)    如果我创建静态html,它会起作用,但是当我使用动态html时则不行。

这是我用来生成HTML的代码(我可以看到div)

var ShowContainerDiv = document.createElement('DIV');

var btnShowDiv = document.createElement('DIV');
btnShowDiv.id = 'btnShowDiv ';
btnShowDiv.title = 'Change';
btnShowDiv.index = 120;

var lblShow = document.createElement('label')
lblShow.htmlFor = "btnShowDiv";
lblShow.appendChild(document.createTextNode('Show'));
btnShowDiv.appendChild(lblShow );
btnShowDiv.onclick = function () {
    dropdown.style.visibility = "visible";
};

var dropdown = document.createElement('DIV');
dropdown.style.backgroundColor = 'white';
dropdown.style.borderStyle = 'solid';
dropdown.style.borderWidth = '2px';
dropdown.style.cursor = 'pointer';
dropdown.style.textAlign = 'left';
dropdown.style.width = '150px';

var chkRed = document.createElement("input");
chkRed.type = "checkbox";
chkRed.id = "chkRed";
chkRed.value = "Red";
chkRed.checked = false;
var lblRed = document.createElement('label')
lblRed.htmlFor = "chkRed";
lblRed.style.color = "#F00";
lblRed.appendChild(document.createTextNode('Red'));

var chkYellow = document.createElement("input");
chkYellow.type = "checkbox";
chkYellow.id = "chkYellow";
chkYellow.value = "Yellow";
chkYellow.checked = false;
var lblYellow = document.createElement('label')
lblYellow.htmlFor = "chkYellow";
lblYellow.style.color = "#FF0";
lblYellow.appendChild(document.createTextNode('Yellow'));

var chkGreen = document.createElement("input");
chkGreen.type = "checkbox";
chkGreen.id = "chkGreen";
chkGreen.value = "Green";
chkGreen.checked = false;
var lblGreen = document.createElement('label')
lblGreen.htmlFor = "chkGreen";
lblGreen.style.color = "#0F0";
lblGreen.appendChild(document.createTextNode('Green'));

var dateFrom = document.createElement("input");
dateFrom.id = "txtDateFrom";
dateFrom.type = "text";
dateFrom.className = "datepicker";
dateFrom.style.width = "70px";
dateFrom.readonly = "readonly";
var lblDateFrom = document.createElement('label')
lblDateFrom.htmlFor = "txtDateFrom";
lblDateFrom.appendChild(document.createTextNode('From'));

var dateTo = document.createElement("input");
dateTo.id = "txtDateTo";
dateTo.type = "text";
dateTo.className = "datepicker";
dateTo.style.width = "70px";
dateTo.readonly = "readonly";
var lblDateTo = document.createElement('label')
lblDateTo.htmlFor = "txtDateTo";
lblDateTo.appendChild(document.createTextNode('To'));

var btnDone = document.createElement("input");
btnDone.type = "button";
btnDone.name = "btnDone";
btnDone.value = "Done";
btnDone.onclick = function () {
    dropdown.style.visibility = "hidden";
};

dropdown.appendChild(chkRed);
dropdown.appendChild(lblRed);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(chkYellow);
dropdown.appendChild(lblYellow);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(chkGreen);
dropdown.appendChild(lblGreen);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(dateFrom);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(dateTo);
dropdown.appendChild(document.createElement("BR"));
dropdown.appendChild(btnDone);

ShowContainerDiv.appendChild(btnShowDiv);
ShowContainerDiv.appendChild(dropdown);

g.event.addDomListener(btnShowDiv, 'click', function () {
    dropdown.visible = true;
    dropdown.style.visibility = "visible";
});

g.event.addDomListener(btnDone, 'click', function () {
    dropdown.visible = false;
    dropdown.style.visibility = "hidden";
});

map.controls[g.ControlPosition.TOP_RIGHT].push(ShowContainerDiv);

然后在.js文件中我有这个(我检查过,我包含了文件)

$(document).ready(function () {
    $(".datepicker").datepicker({
        dateFormat: 'yy/m/d',
        firstDay: 1,
        changeMonth: true,
        changeYear: true,
        showOn: 'both',
        autosize: true,
        buttonText: "Select date",
        buttonImage: '../Content/images/calendar.png',
        buttonImageOnly: true
    });
});

为什么日期选择器没有出现? 谢谢!吉列尔莫。

11 个答案:

答案 0 :(得分:26)

写作时

$(document).ready(function () {
    $(".datepicker").datepicker({...});
});

此片段在页面加载后立即执行。因此,您的动态日期选择器还没有。您需要在每个新插入的元素上调用$(aSuitableSelector).datepicker(...)。首先,使用var来保存您的选项:

var datePickerOptions = {
    dateFormat: 'yy/m/d',
    firstDay: 1,
    changeMonth: true,
    changeYear: true,
    // ...
}

这允许你写

 $(document).ready(function () {
    $(".datepicker").datepicker(datePickerOptions);
 });

并写

 // right after appending dateFrom to the document ...
 $(dateFrom).datepicker(datePickerOptions);

 //...

 // right after appending dateTo ...
 $(dateTo).datepicker(datePickerOptions);

您还可以使用JQuery的listen to DOM changes功能来避免将JS魔法应用于新插入的元素 - 但我认为这不值得。

答案 1 :(得分:2)

我发现解决此问题的最简单方法是使用livequery插件:

http://docs.jquery.com/Plugins/livequery

您可以告诉LiveQuery将其应用于这些对象,而不是将日期选择器应用于特定类的所有对象。 LiveQuery将依次继续应用日期选择器,即使稍后更改了DOM。

我发现在使用此功能时没有性能下降,代码更改实际上很少(您需要将插件添加到页面中,只需更改一行代码)。

你会像这样使用它:

$(".datepicker").livequery(
        function(){ 
            // This function is called when a new object is found. 
            $(this).datepicker({ ...}});
        }, 
        function() { 
            // This function is called when an existing item is being removed. I don't think you need this one so just leave it as an empty function.
        }
); 

从那时起,每次使用datepicker类添加对象时,都会自动将datepicker插件应用于它。

答案 2 :(得分:2)

我发现为动态添加多个输入字段添加datepicker的最简单方法:

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

答案 3 :(得分:1)

您可以简单地使用它。

$('body').on('focus',".date-picker", function(){
  $(this).datepicker();
});

答案 4 :(得分:0)

绑定datepickers的代码最好在你的html被动态创建后立即执行。如果你想将datepicker初始化的代码保存在一个单独的文件中,我建议采用以下方法: 在您完成生成html之后(我认为它是在文档就绪时生成的),请使用

$(document).trigger("customHtmlGenerated");

在datepicker文件中,而不是$(document).ready(function(){...})使用$(document).bind("customHtmlGenerated", function(){...});

答案 5 :(得分:0)

我把

$( "#InstallDate" ).datepicker({
  showOn: "button",
    minDate: 0, // no past dates
  buttonImage: "../images/Date.png",
  buttonImageOnly: true,
  buttonText: "Select date",
  dateFormat: 'yy-mm-dd',
}); 

进入脚本文件DatePicker.js,然后在我生成的Ajax Html表单末尾添加以下行

<script type='text/javascript' src='/inc/DatePicker.js'></script> 

答案 6 :(得分:0)

$( ".datepicker" ).datepicker({inline: true,dateFormat: "dd-mm-yy"});

答案 7 :(得分:0)

请在添加元素后添加以下代码。

$(".datepicker").datepicker({
        dateFormat: 'yy/m/d',
        firstDay: 1,
        changeMonth: true,
        changeYear: true,
        showOn: 'both',
        autosize: true,
        buttonText: "Select date",
        buttonImage: '../Content/images/calendar.png',
        buttonImageOnly: true
    });

答案 8 :(得分:0)

我用以下方法解决了动态创建的输入元素:-

id

答案 9 :(得分:-1)

jQuery代码在文档准备就绪时执行:这意味着页面的初始标记准备就绪,而不是在javascript文件运行之后。

我认为初始化datepickers的代码在创建元素的脚本之前运行,所以没有任何反应。


尝试使用.load()而不是.ready()加载页面时执行jquery代码。当所有资产(js,image ...)都已加载时会触发load事件。

$(window).load(function () {
    $(".datepicker").datepicker({
        ...
    });
});

你也可以简单地使用javascript的执行方式。脚本按照它们在页面中发生的顺序执行。所以你可以:

  • 在关闭正文标记```
  • 之前移动你的脚本
  • 确保您的第一个脚本(创建元素)位于datepicker代码
  • 之前
  • 删除日期选择器的.ready()处理程序。当您将脚本放在最后时,它们会在DOM准备就绪时隐式运行...

答案 10 :(得分:-1)

这可能是javascript被解雇的顺序问题。试试

$(".datepicker").datepicker({
    dateFormat: 'yy/m/d',
    firstDay: 1,
    changeMonth: true,
    changeYear: true,
    showOn: 'both',
    autosize: true,
    buttonText: "Select date",
    buttonImage: '../Content/images/calendar.png',
    buttonImageOnly: true
});

创建html的javascript之后。