在Shaun的精彩回答的基础上,至少有两种方法可以测试是否需要为dd-MMM-yyyy格式进行shim。在与JSLint(我发誓它讨厌我写的每一行ECMA代码)进行深入磋商后,我修改了Shaun的代码。
使用IE条件语句
如果您已经使用IE条件语句(<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
),那么您只需测试HTML.lt-ie9
并有条件地定义新的排序算法,然后调用dataTables即可:
if ($('html.lt-ie9').length) {
var customDateDDMMMYYYYToOrd = function (date) {
"use strict";
var dateParts = date.split(/-/);
return (dateParts[2] * 10000) + ($.inArray(dateParts[1].toUpperCase(), ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"]) * 100) + dateParts[0];
};
jQuery.fn.dataTableExt.aTypes.unshift(
function (sData) {
"use strict";
if (/^([0-2]?\d|3[0-1])-(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)-\d{4}/i.test(sData)) {
return 'custom-date-dd-mmm-yyyy';
}
return null;
}
);
jQuery.fn.dataTableExt.oSort['custom-date-dd-mmm-yyyy-asc'] = function (a, b) {
"use strict";
var ordA = customDateDDMMMYYYYToOrd(a),
ordB = customDateDDMMMYYYYToOrd(b);
return (ordA < ordB) ? -1 : ((ordA > ordB) ? 1 : 0);
};
jQuery.fn.dataTableExt.oSort['custom-date-dd-mmm-yyyy-desc'] = function (a, b) {
"use strict";
var ordA = customDateDDMMMYYYYToOrd(a),
ordB = customDateDDMMMYYYYToOrd(b);
return (ordA < ordB) ? 1 : ((ordA > ordB) ? -1 : 0);
};
};
$('table.datatable').dataTable();
请查看在http://jsfiddle.net/jhfrench/nEsCt/的IE条件示例
使用Modernizr进行测试
另一方面,如果你倾向于使用Modernizr来测试能力,我们可以定义Modernizr测试,然后使用Modernizr执行测试并有条件地加载shim魔法(从.js文件),然后调用dataTables:
Modernizr.addTest('valid_date_dd_mmm_yyyy', function() {
return !isNaN(Date.parse("17-MAY-2013"));
});
Modernizr.load([
{
test: Modernizr.valid_date_dd_mmm_yyyy,
nope: 'http://appliedinter.net/Workstream/common_files/js/dataTable_shim_dd-MMM-yyyy.js',
complete: function () {
$(document).ready(function () {
$('table.datatable').dataTable();
});
}
}
]);
请查看Modernizr方法,网址http://jsfiddle.net/jhfrench/tNkGC/