【问题标题】:datepicker not working after loading page via ajax通过ajax加载页面后datepicker不工作
【发布时间】:2014-05-15 09:33:02
【问题描述】:

我正在使用带有 jquery 1.10.1 和 jquery ui 1.10.3 的 asp.net mvc 2。

当我使用 $.ajax 加载页面时,日期选择器有点不对劲。它会像往常一样弹出并返回,但与它的交互已中断。

例如:我点击输入 => 弹出日期选择器 => 选择一个日期 => 错误当前日期未定义

一个页面可以有多个带有日期选择器的输入,这就是我在代码中使用 .each 的原因。

我有 2 个页面:Index.aspx 和 PatchDef.aspx。 Index 使用 $.ajax 调用动态加载 PatchDef.aspx。

在 PatchDef.aspx 中,我使用带有 $(document).ready 代码的标签,它将日期选择器绑定到我的输入。

这是我现在使用的代码:

$(document).ready(function () {
    $(".datePickerPatchDef").each(function () {
                    var dateFormat = $(this).attr("dateFormatPatchDef").toLowerCase();
                    $(this).datepicker({
                        dateFormat: dateFormat,
                        changeMonth: true,
                        changeYear: true
                    });
   });
});

我还尝试了以下代码,发现 here

注意:这里的类类似于 dpCount1; dpCount2, ...

$(".datePickerPatchDef").each(function () {
                var dateFormat = $(this).attr("dateFormatPatchDef").toLowerCase();
                $(this).datepicker({
                var dpCountClass;
                var allClasses = $(this).attr("class").split(' ');

                for (var i = 0; i < allClasses.length; ++i) {
                    var singleClass = allClasses[i];
                    if (singleClass.match("^dpCount")) {
                        dpCountClass = "." + singleClass;
                    }
                }

                $("#switchUser").text(dpCountClass);
                $("body").on("focusin", dpCountClass, function () {
                    $(this).datepicker({
                        dateFormat: dateFormat,
                        changeMonth: true,
                        changeYear: true
                    });
                });
            });
        }

我以为第二次尝试可以解决动态加载问题,但事实并非如此。

我得到的确切错误是:

Microsoft JScript 运行时错误:无法设置属性值 'currentDay': 对象为空或未定义

然后进入代码

o.selectedDay=o.currentDay=t("a",n).html()

其中 o = 未定义

因此,如果您有任何建议,我可以随时使用。 如果您需要更多信息,请询问!

【问题讨论】:

  • 感谢您在没有任何解释的情况下神秘地投反对票。它完全可以帮助有问题的人获得答案。
  • 你试过把代码放在 ajax.success 函数里面吗?
  • @dops 是的,我试过了。它给出了完全相同的问题。
  • 这段代码在哪里?在 index.apsx 或 PatchDef.aspx 中?我们还能看到完整的 ajax 请求吗?
  • Index.aspx 包含带有成功函数的 $.ajax。它返回 PatchDef.aspx 页面,其中包括我在问题中提供的 jquery 代码。正如你所建议的,我也尝试将我的日期选择器代码从 PatchDef.aspx 移动到索引 ajax.success,但这产生了同样的错误。

标签: jquery jquery-ui-datepicker


【解决方案1】:

我遇到了同样的问题,这对我有用。 希望这会有所帮助

在 Ajax 调用之前禁用所有日期选择器

$(".datePicker").datepicker("destroy"); 
$(".datePicker").removeClass("hasDatePicker"); 
$(".datePicker").removeAttr("Disabled");

以及在可以添加或删除 DOM 元素的 Ajax 调用之后 然后重新初始化 Datepicker

$(".datePicker").datepicker({ dateFormat: "dd/mm/yy", showOn: "focus" });

而且你还必须调用它......这非常重要,因为这将重新绑定 JQuery DOM

jQuery.datepicker.dpDiv.appendTo(jQuery('body'));

  var RemoveJQUIDatepicker = function () {
	
   
   
	$(".datePicker").datepicker("destroy");
	$(".datePicker").removeClass("hasDatePicker");
	$(".datePicker").removeAttr("Disabled");
   
};


var SetJQUIDatePicker = function () {
   
	$(".datePicker").datepicker({
		dateFormat: "dd/mm/yy",
		showOn: "focus"
		
	});

   
	
	jQuery.datepicker.dpDiv.appendTo(jQuery('body'));
   
}

//example Ajax Call Sequence
RemoveJQUIDatepicker();
	$.ajax({

		url: initURL,
		type: "Get",
		success: function (data) {
			
			SetJQUIDatePicker();
		  //Do Something
			

		},
		error: function () {
			//Do Something
			SetJQUIDatePicker();

		}


	});

【讨论】:

  • 这对我来说就像一个魅力。我从类中销毁了 datepicker,创建了新的 datepicker 函数并在成功响应中调用它。它奏效了。非常感谢。
【解决方案2】:

我只是愚蠢,愚蠢,愚蠢。我刚刚做了几乎相同的事情。

这是一个范围/上下文问题。一旦你进入每个函数,你就会失去该函数的 $(this) 上下文,即 $(this) 现在指的是函数而不是选择器返回的对象。

幸运的是,'.each()' 能够帮助您将各个对象传递给函数。

$.ajax({
    url:        'patchdef.php',
    type:       "GET",
    dataType:   "html",
    beforeSend: function()
    {
        // LOADING
    },
    success:    function( data ) {
        area.html(data);
        $(".datePickerPatchDef").each(function (key, PatchDef) {
            var dateFormat = $(PatchDef).attr("dateFormatPatchDef").toLowerCase();
            $(PatchDef).datepicker({
                dateFormat: dateFormat,
                changeMonth: true,
                changeYear: true
            });
        });
    }
});

我 95% 确信这对您有用。我也赞成你的问题,让它洗一下:)

编辑:我认为您可以将其保留在 index.aspx 中

【讨论】:

  • 感谢您的回答,但它仍然给出了同样的错误。另请注意:我必须使用 $(PatchDef) 才能使用 .attr 和 .datepicker。正如您在编辑中建议的那样,我也在我的 Index.aspx 中尝试过,它仍然产生相同的结果。
  • @ThomasSchellekens - 当然是 $(PatchDef)。我又傻了。但现在我不知道为什么它不起作用。如果我试图在我的项目中解决这个问题,那么我将在所有内容上使用 console.log。很抱歉,我无法提供更多帮助。
  • 无需道歉。我已经很高兴你试图帮助我。我猜我错过了一些具体案例。现在我只是希望这不会以一堆未解决的错误告终。 :)
  • @ThomasSchellekens 我只是在我的服务器上模拟了它并让它工作!使用我上面的函数(使用您的 $(PatchDef) 编辑)并将其粘贴在 ajax 查询的成功回调中。为我工作:)
  • @ThomasSchellekens 我在上面编辑了我的答案,向您展示了我的完整代码。请注意我使用 php,所以很明显文件名是错误的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多