ChatGPT解决这个技术问题 Extra ChatGPT

Safari 上不显示 HTML5 日期选择器

以前使用过 jQuery 日期选择器,现在我已经将我网站上表单中的一些日期字段转换为 HTML5 日期选择器。

在文档中,它说支持 Safari:但是,它目前只显示一个文本字段(而 Chrome 和其他浏览器正确显示日期选择器)。

echo "<input type='date' name='Date' min='$todaymin'>";

(同样适用于没有 min 属性)

这是我的代码行 - 我做错了什么还是我只是阅读了错误的文档并且 Safari 不支持它?

谢谢!

也许日期选择器不是直接的问题?您是否检查过 Safari 控制台是否有错误?
@SidneyLiebrand 好电话 - 我确实检查了控制台,但出现了错误(由 jQuery 选择器给出)。我删除了引用,错误消息消失了,但日期选择器仍然不起作用。
有谁知道 Big Sur 更新是否会支持它。 Safari 将获得 webP 支持,所以现在如果它获得日期选择器支持,那么它可能不再被视为下一个 IE :)
Yes 现在适用于 BugSur (11.4) 和 Safari 14.1.1

C
Chuck Le Butt

Safari 的桌面版本不包含本机日期选择器(尽管它适用于 iOS)。顺便说一句,IE 也没有。这非常令人沮丧,因为如果他们这样做了,它可以为开发人员节省大量时间。

这是跟踪对它的支持的有用链接:http://caniuse.com/#feat=input-datetime


根据该页面,Safari 似乎并不完全支持它,所以可能就是这种情况。感谢您的链接 - 这是一个有用的资源,我已将其添加到书签以供将来参考!
我知道的唯一解决方法是在输入标签上提供一个 placeholder="yyyy-mm-dd" 属性,Safari / IE 应该使用该属性,但其他支持 html5 日期选择器的浏览器将忽略,而是使用操作系统推荐的格式(例如,美国用户,将改为“mm/dd/yyyy”)。您选择的占位符格式应该与您在服务器端处理字段数据的方式一致。
四年后,仍然不支持 input[type=date]。浏览器开个玩笑。 Safari 实际上是“新”IE。
5年后做那个。
6年后做到这一点。
F
Finlay Percy

尽管 Safari(或 IE)没有本机日期选择器,但一个很好的解决方法是在日期输入中添加 placeholder 属性。这会通知 Safari 和 IE 用户应采用哪种格式的后备文本输入(即 yyyy-mm-dd)。

占位符不会显示在支持 type="date" 的浏览器上,因此此解决方法不会影响其他浏览器。

例如<input type="date" placeholder="yyyy-mm-dd" />


在 iOS Safari 页面上尝试过这个似乎没有给出正确的结果,日期仍然以“错误”的顺序显示为 1960-11-21
你能具体说明“错误的顺序”是什么意思吗?对我来说,基于占位符值“yyyy-mm-dd”,“1960-11-21”看起来是正确的。如果您想使用其他占位符模式,您可以自由编辑它(例如 dd-mm-yyyy 或 mm-dd-yyyy)。
A
Aaron Mason

取自 http://www.javascriptkit.com/javatutors/createelementcheck2.shtml

使用 jQuery 和 jQuery UI,您可以创建一个跨浏览器日期选择器,仅当浏览器本身不支持它时才会弹出。如果您的项目中已经有 jQuery,只需执行以下操作:

var dateClass='.dateck'; $(document).ready(function () { if (document.querySelector(dateClass).type !== 'date') { var oCSS = document.createElement('link'); oCSS.type='text/css' ; oCSS.rel='stylesheet'; oCSS.href='//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/base/jquery-ui.css'; oCSS.onload=function() { var oJS = document.createElement('script'); oJS.type='text/javascript'; oJS.src='//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui. min.js'; oJS.onload=function() { $(dateClass).datepicker(); } document.body.appendChild(oJS); } document.body.appendChild(oCSS); } });


这看起来是一个很好的解决方案,但它似乎不起作用。我将上面的内容放在脚本标签之间的头部,并将“您的日期”更改为表单中我的日期输入字段的 ID(和名称),但这对 safari 没有任何影响 - 仍然只是一个空白文本框。控制台输出上没有任何内容
为我工作!他们应该使用那个丑陋的 jquery-ui 小部件吗,我根本不会设计它!
建议不要使用 CDN,但这是另一回事。
t
tanguy_k

2021/04/29 更新:Safari 14.1 已添加支持 \o/

https://webkit.org/blog/11648/new-webkit-features-in-safari-14-1/

老答案:

Safari 15(截至 2021 年 2 月 22 日尚未发布)将提供原生日期选择器:

“从 2020 年 10 月 22 日发布的 Safari TP [TP = Technology Preview] 115 开始,macOS 和 iOS 支持 datedatetime-localtime 的 UI。月份输入类型在 macOS 上不受支持macOS,但适用于 iOS。macOS 和 iOS 不支持星期输入类型。"

https://bugs.webkit.org/show_bug.cgi?id=119175#c20

https://webkit.org/status/#feature-date-and-time-input-types

截图:

https://twitter.com/stefanjudis/status/1320259247750381568

https://twitter.com/foolip/status/1319559899358089216


不那么过时:它仍然是向后兼容性的问题。但最后还是!你带来的好消息:)
哇……终于!苹果还需要数年时间才能实现。之前有人评论过——Safari 是新的 IE。不能再同意了。
c
conordarcy

您可以使用正则表达式模式来验证占位符中的格式,如上例所示。这里是一个很好的起点,但您可能想创建自己的。

在 Safari 中尝试下面的代码,而不添加像文本字符串这样的有效格式化值。

不正确的格式显示验证错误,正确的格式(dd/mm/yyyy 或 dd-mm-yyyy)将提交表单,然后消失。


阅读本文以获取有关正则表达式的信息。 stackoverflow.com/questions/15491894/…
问题是关于 Safari 中的日期输入
@MichaelDoye 是的,Finlay Percy 示例的下一步是使用模式属性中的正则表达式向输入添加 HTML 验证,以确保用户正确格式化输入。例如,在 Chrome 上,您将获得本机日期选择器,但 Safari 会回退到带有占位符文本的文本输入。模式属性将检查值是否格式正确。
我添加了一个按钮来检查该值是否有效。如果没有,你会得到一个错误,如果它很好,表单提交并消失。
M
Mostafa Esmaeili

对于使用 WordPress 的用户,可以使用此插件进行快速修复date and time picker

您只需在插件设置中传递 CSS 选择器,或者只需传递 input[type=date]


H
Hooman Bahreini

我使用了@drjorgepolanco 给出的建议并进行了一些修改:

函数 displayDatePickerIfBrowserDoesNotSupportDateType() { var datePicker = document.querySelector('.date-pick'); if (datePicker && datePicker.type !== 'date') { $('.date-pick').datepicker(); } } $(document).ready(function($) { displayDatePickerIfBrowserDoesNotSupportDateType(); });


N
Nico Serrano

我遇到了这个问题,因为我在 iOS(移动 Safari)中的 <input id="dateId" type="date"> 给出了错误的字符串格式。它与 Chrome 浏览器的格式不同:

Chrome: document.getElementById('dateId').value // "2022-04-22" Safari: document.getElementById('dateId').value // "22 abr. 2022"

我相信,正如先前的答案所述,输入正在回退到输入文本或其他内容。所以我用:

<input id="dateId" type="date" placeholder="yyyy-mm-dd" pattern="\d{4}-\d{2}-\d{2}"> 

签出此MDN reference