ASP.NET MVC3 / jQuery 1.9.1 / jQuery UI 1.10.2
I've got a page on which I open a modal dialog after clicking on an Ajax.ActionLink
. Inside this dialog I have an input field and a datepicker
associated with it. When I open the dialog for the first time, I can click on the datepicker button (or inside the associated input field so it receives focus, showOn
is set to both
), and the datepicker shows as expected. I can, while the modal dialog is open, do it as often as I want to, the datepicker shows every time. When I close the modal dialog (via an attached $("ui-widget-overlay").click(function(){...});
and then open it again, the datepicker no longer works, no matter whether I try to click on the button or into the associated input field.
I tried to debug the jQuery code, and both times the lines of code being run are the same (and even though the datepicker doesn't show up the second time the dialog is opened, the jQuery methods are triggered) from what I can see in the debugger. I'm completely stumped, and the methods described in this post only helped in terms of being to show the datepicker the first time the dialog opens. Another post only seems to be related to a misunderstanding how the showOn
setting works.
I also tried to destroy the datepicker via $("#datepicker").datepicker("destroy");
when closing the dialog - to no avail. Any ideas?
Update
On the "calling page":
$(document).ready(function () {
$("#popupDialog").dialog(
{
autoOpen: false,
modal: true,
open: function()
{
$("ui-widget-overlay").click(function()
{
$("#popupDialog").dialog("close");
}
}
});
});
[...]
@Ajax.ActionLink( "Some text", "Action", "Controller", new AjaxOptions {
HttpMethod = "GET",
UpdateTargetId = "popupDialog",
InsertionMode = InsertionMode.Replace,
OnSuccess = "openPopup()"
})
[...]
function openPopup()
{
$("popupDialog").dialog("open");
}
[...]
<div id="popupDialog" style="display: none;"></div>
The controller action is very simple and as follows:
public ActionResult Action()
{
MyActionModel myActionModel = new MyActionModel();
return PartialView( myActionModel );
}
What worked for me was -
Inside the dialog, if I have multiple inputs with class datepicker
, then
$(".datepicker").removeClass('hasDatepicker').datepicker();
Basically, to remove the class hasDatepicker
before initializing datepicker
again.
I was on version 1.8.18 of jquery.ui.datepicker
I had the same problem, and I solved with
$("#ui-datepicker-div").remove();
after closing and destroying the popup.
After more debugging and attempts to trace jQuery events, I tested whether the problem existed with jQuery UI 1.9.2, which it didn't. Then I compared the relevant datepicker
code lines which did not involved too many actual changes.
To put a long story short, the problem described in my question above could be fixed by changing a single line of code back from 1.10.2 to what it was in 1.9.2:
1.10.2 causing problems
/* Initialise the date picker */
if (!$.datepicker.initialized) {
$(document).mousedown($.datepicker._checkExternalClick);
$.datepicker.initialized = true;
}
1.9.2. version, working as expected
/* Initialise the date picker */
if (!$.datepicker.initialized) {
$(document).mousedown($.datepicker._checkExternalClick)
// !!!!!!!!!!
// The next code line has to be added again so that the date picker
// shows up when the popup is opened more than once without reloading
// the "base" page.
// !!!!!!!!!!
.find(document.body).append($.datepicker.dpDiv);
$.datepicker.initialized = true;
}
I'm still not sure why this behaviour exists, but it seems to be a relatively rare constellation. As a note: I didn't "reinitialize" the datepicker
after opening the popup dialog (or requesting the PartialView
via AJAX), so having a single script source as part of the _Layout.cshtml
is sufficient. Hope this helps someone else.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With