JavaScript sort方法在iOS及Safari浏览器中无法正常工作的问题
日期排序在Safari/iOS失效的解决办法
问题根源
Safari(包括iOS端)对Date构造函数的日期字符串解析规则远不如Chrome宽松。如果你的data-date属性用了非标准格式(比如DD/MM/YYYY),Chrome能自动识别解析,但Safari会返回Invalid Date,调用getTime()得到NaN,直接导致排序逻辑完全失效。
修复方案
1. 统一日期解析逻辑
先把非标准格式的日期字符串转换为所有浏览器都支持的ISO 8601格式(YYYY-MM-DD),再进行日期对象的创建。
2. 调整后的完整代码
function sortDates(b, a) { // 自定义日期解析函数,适配你的data-date格式 function parseDate(dateStr) { // 示例:处理DD/MM/YYYY格式,转为YYYY-MM-DD if (dateStr.includes('/')) { const [day, month, year] = dateStr.split('/'); return new Date(`${year}-${month}-${day}`); } // 标准格式直接返回Date对象 return new Date(dateStr); } const dateB = parseDate(b); const dateA = parseDate(a); // 处理解析失败的异常情况,避免NaN干扰排序 if (isNaN(dateB.getTime()) || isNaN(dateA.getTime())) { return 0; // 解析失败的日期默认保持原顺序,可按需调整 } return dateB.getTime() - dateA.getTime(); } var dates = []; var _old; $('.sort').each(function(){ _old = $(this).parent(); dates.push($(this).data('date')); }); var sorted = dates.sort(sortDates); var _new = $('<div class="row" id="sort">').insertBefore(_old); $.each(sorted,function(i,val){ $('.sort[data-date="' + val + '"]').appendTo(_new); }); _old.remove();
关键注意点
- 如果你
data-date的格式是MM/DD/YYYY,只需修改parseDate里的拆分顺序为[month, day, year]即可。 - 新增的
isNaN检查能避免因个别日期格式错误导致整个排序崩溃。
内容的提问来源于stack exchange,提问作者CrystalPrice
相关产品推荐
相关产品推荐

