为什么我的jQuery UI datepicker在初始页面加载时工作正常时不能用于回发?

我一直在尝试将jQuery UI Datepicker集成到我们的ASP.NET WebForms应用程序中。 应用程序使用母版页为所有页面提供通用外观,所有内容页面都构建在UpdatePanel的ContentTemplate中。 我创建了一个用户控件来包装datepicker的function,并允许在运行时为代码隐藏中的每个日期设置minDate,maxDate,validators等。 我还需要处理ASP.NET生成客户端元素ID的方式。

在过去的一周里,我一直在高低搜索,并找到了很多让它工作的技巧。 这是我现在所处位置的简化版本。

  // This function enables the datepicker behavior for this textbox by its ClientID. function () { $("#").datepicker({ changeMonth: true, changeYear: true, showOn: 'button', buttonImage: "/images/calendarIcon.gif", buttonImageOnly: true, buttonText: '', duration: '', onSelect: function() { } }); }; // Register the above function to execute on initial page load... $(document).ready(function(){ (); }) ; // ...and also after any update panel it's on has been refreshed. Sys.WebForms.PageRequestManager.getInstance().add_endRequest();  

我遗漏了validation器和其他一些我认为与问题无关的标记,但这是用户控件的核心 – 文本框和启用日期选择器function的jQuery脚本。 基本思想是利用ASP.NET的客户端ID:

  1. 为此特定控件的JavaScript函数提供唯一的函数名称
  2. 使用jQuery注册该函数以在初始页面加载后启用datepicker
  3. 在ASP.NET的PageRequestManager中注册相同的function,以便在回发后保持启用datepickers

第1项和第2项工作得很好。 但是,在回发后,datepickerfunction丢失了,我只剩下一个文本框。

可是等等! 那不是全部。 给定页面由多个面板组成,一次只能看到其中一个面板。 仅通过将当前面板的Visible属性设为true来选择它们。 所有其他面板的Visible属性都设置为false。

现在得到这个:第一个面板上的日期选择器,即初始页面加载时显示的日期选择器,按预期工作。 第二个面板上的那些没有显示出来。 回到第一页,datepickers再次出现。

有没有人有任何想法我错了?

虽然$(document).ready()是一次性初始化例程的理想选择,但如果你有代码需要在每次部分回发后重新运行,它会让你挂起。 jQuery v1.3 +中添加的LiveQueryfunction有助于此,但仅适用于一组有限的function。

例如,如果我们想在上一个示例中向TextBox添加jQueryUI datepicker,该怎么办? 在$(document).ready()中添加它会很有效, 直到发生部分回发。 然后,UpdatePanel的新TextBox元素将不再具有连接到它的datepicker。

         

以上答案取自以下链接。 我已经在我的一个项目中测试并实现了它。

http://encosia.com/2009/03/25/document-ready-and-pageload-are-not-the-same/

我认为更简洁的方法是使用ClientScriptManager.RegisterStartupScript

使用Javascript:

 function initCalendar(controlId) { $("#" + controlId).blahblah(.... } 

在你的代码背后(也许是OnPreRender ):

 Page.ClientScript.RegisterStartupScript(this.GetType(), "SomeName", string.Format("", txtBox.ClientID)); 

这么晚才回复很抱歉。

为什么不试试这个:

  

然后使用以下触发器将文本框放在更新面板中:

         

好,

这是这个问题的解决方案。 下面的链接解释了为什么datejicker在ajax回发之后不起作用以及使其在ajax中工作的解决方案。

http://jquerybyexample.blogspot.com/2010/08/jquery-datepicker-does-not-work-after.html

将控件的Visible属性设置为false ,它根本不会呈现。

这意味着首次加载页面时,不可见面板中的Javascript 不存在

要解决此问题,您可以使用CSS( display: none )而不是Visible属性隐藏面板。

在更新面板中尝试此操作

    

只需在Page_Load代码后面使用下面的代码即可。

 string DOB = Request.Form[TextBoxDOB.UniqueID]; TextBoxDOB.Text = DOB; 

我实现了它,就像一个魅力

如果您使用更新面板,请不要惊慌只需单击此处放松。 详细说明答案

解决方案帮助了我。 picher值的日期必须在pageLoad()函数中,以便在回发时显示日期选择器。 这是我的工作代码