Erweiterung auf Shaun's fine answer, gibt es mindestens zwei Möglichkeiten, um die Prüfung der Notwendigkeit zu gehen für dd-MMM-yyyy Format Shim. Ich habe Shauns Code nach intensiver Rücksprache mit JSLint geändert (ich schwöre, es hasst jede ECMA-Zeile, die ich schreibe).
IE Mit conditionals
Wenn Sie bereits IE conditionals mit (<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]-->
), dann können Sie nur für HTML.lt-ie9
testen und bedingt den neuen Sortieralgorithmus definieren, dann rufen Tables:
//test for html.lt-ie9
if ($('html.lt-ie9').length) {
//create the new magic sorting
var customDateDDMMMYYYYToOrd = function (date) {
"use strict"; //let's avoid tom-foolery in this function
// Convert to a number YYYYMMDD which we can use to order
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];
};
// This will help DataTables magic detect the "dd-MMM-yyyy" format; Unshift so that it's the first data type (so it takes priority over existing)
jQuery.fn.dataTableExt.aTypes.unshift(
function (sData) {
"use strict"; //let's avoid tom-foolery in this function
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;
}
);
// define the sorts
jQuery.fn.dataTableExt.oSort['custom-date-dd-mmm-yyyy-asc'] = function (a, b) {
"use strict"; //let's avoid tom-foolery in this function
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"; //let's avoid tom-foolery in this function
var ordA = customDateDDMMMYYYYToOrd(a),
ordB = customDateDDMMMYYYYToOrd(b);
return (ordA < ordB) ? 1 : ((ordA > ordB) ? -1 : 0);
};
};
//now call the dataTable plugin against the target tables (in this case, any table with `class="dataTable"`)
$('table.datatable').dataTable();
Siehe IE conditionals example at http://jsfiddle.net/jhfrench/nEsCt/
Testen mit Modernizr
Auf der anderen Seite, wenn Sie mit Modernizr auf die Fähigkeit testen möchten, können wir den Modernizr-Test definieren, dann verwenden Sie Modernizr, um den Test auszuführen und die Shim-Magie (von a.js-Datei), dann Tables nennen:
//define the Modernizr test
Modernizr.addTest('valid_date_dd_mmm_yyyy', function() {
return !isNaN(Date.parse("17-MAY-2013"));
});
//if Modernizr determines "dd-mmm-yyyy" dates are not supported, load the following JavaScript resources
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() {
//now call the dataTable plugin against the target tables (in this case, any table with `class="dataTable"`)
$('table.datatable').dataTable();
});
}
}
]);
Siehe Modernizr approach at http://jsfiddle.net/jhfrench/tNkGC/
IE wird dieses Format erkennen, ohne die Bindestriche. Sind sie auch erforderlich? –
Oh! BTW - Gehen Sie Sox! –
[diese Frage] (http://stackoverflow.com/questions/12003222/datatable-date-sorting-dd-mm-yyyy-issue) scheint sehr ähnlich zu sein. Hast du diesen Ansatz versucht? FWIW, dd-MON-yyyy ist in Kulturen wie Japan, in denen Monatszahlen (keine Namen) verwendet werden, immer noch nicht eindeutig. – explunit