如何修复 jQuery datepicker 的区域设置,使其适用于 Firefox 和 IE7?

Posted

技术标签:

【中文标题】如何修复 jQuery datepicker 的区域设置,使其适用于 Firefox 和 IE7?【英文标题】:How to fix regional settings for jQuery datepicker so it works in Firefox and IE7? 【发布时间】:2012-04-04 03:35:12 【问题描述】:

我正在使用 jQuery 的 datepicker 和 asp.net MVC4。 datepicker 在 Firefox 中工作,但在 IE7 中,我通过 asp.net 的验证获得该字段不是日期的消息。

这是日期选择器的代码

if (!Modernizr.inputtypes.date) 
        $(function() 
            $.datepicker.setDefaults($.datepicker.regional['en-GB']);
            $(".datefield").datepicker();
        );
    

这是我在 Web.config 中的全球化设置

<globalization uiCulture="en-GB" culture="en-GB" />

例如在 Firefox 中,日期显示为“19/03/2012”字符串,并被 asp.net 的验证设置(客户端和服务器端)接受。在 IE7 中,客户端不接受相同的日期字符串。如果我将其更改为“2012 年 3 月 19 日”,则客户端接受日期,但服务器会抛出异常 - “InvalidOperationException。可空对象必须有一个值。”

我的 viewModel 使用了一个可以为空的 DateTime,我在控制器发布操作中将它转换为一个不可为空的 DateTime。这在 Firefox 中有效,但在 IE7 中 viewModel 中的日期值为空。有什么问题?

【问题讨论】:

Darin Dimitrov 有正确答案,但也请看我的教程asp.net/mvc/tutorials/javascript/… 谢谢你,我已经使用你的优秀教程来完成日期选择器。但它不处理全球化问题。 【参考方案1】:

下面这行什么都不做:

$.datepicker.setDefaults($.datepicker.regional['en-GB']);

如果您不包含默认情况下未包含在 ASP.NET MVC 4 模板中的 corresponding language file。

您可以尝试明确设置格式:

$.datepicker.setDefaults( dateFormat: 'dd/mm/yy' );

但这仅涉及在日期选择器中选择日期后应如何格式化日期。它与验证无关。

客户端验证由jquery.validate 插件执行,该插件又使用浏览器当前配置的文化(这可能解释了您在 FF 和 IE 之间观察到的差异,例如,可能配置为使用 en-GB和其他 en-US) 或 ISO 日期。

您可以覆盖此自定义验证并使其使用您的自定义格式以确保这将跨浏览器工作:

if (!Modernizr.inputtypes.date) 
    $(function () 
        $.datepicker.setDefaults( dateFormat: 'dd/mm/yy' );
        $('.datefield').datepicker();
    );

    jQuery.validator.addMethod(
        'date',
        function (value, element, params) 
            if (this.optional(element)) 
                return true;
            ;
            var result = false;
            try 
                $.datepicker.parseDate('dd/mm/yy', value);
                result = true;
             catch (err) 
                result = false;
            
            return result;
        ,
        ''
    );

【讨论】:

如何在代码中包含正确的日期选择器语言文件?语言文件已经在我的 Scripts 目录的子目录 (i18n) 中。 @mrt181,抱歉,我以为你没有这些文件。包含它们的方式与包含任何 javascript 文件的方式相同:使用 script 标记。 我的代码中有这个<script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Scripts/js")" type="text/javascript"></script> <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/Scripts/i18n/js")" type="text/javascript"></script></script> <script src="@Url.Content("~/Scripts/jquery.ui.datepicker.min.js")" type="text/javascript"></script> @mrt181,实际上它不是特定于浏览器的,而是特定于文化的。您是否尝试按照我的答案定义自定义适配器? 您的相应语言文件 i18n 链接现已损坏。【参考方案2】:

Jquery 本地化文件位于:

http://nuget.org/packages/jQuery.UI.i18n

只需运行:

Install-Package jQuery.UI.i18n 并添加对“Scripts/jquery-ui-i18n.js”的脚本引用

从包管理器控制台,然后这将工作: $.datepicker.setDefaults($.datepicker.regional['en-GB']);

【讨论】:

以上是关于如何修复 jQuery datepicker 的区域设置,使其适用于 Firefox 和 IE7?的主要内容,如果未能解决你的问题,请参考以下文章

css 用于IE的jQuery UI Datepicker CSS修复程序

jQuery 日期选择器。我如何从 Jquery datepicker 中获取年份

默认将 PHP 变量解析为 Jquery UI Datepicker

DatePicker 验证 Jquery 如何验证

jQuery:如何从与 datepicker 插入日期的输入字段不同的元素中激活 datepicker?

如何触发 jQuery UI DatePicker onclick?