2015-07-20 36 views
2

我爲我的問題創建了jsFiddlejQuery dataTables自定義排序不適用於中文號碼

$.extend($.fn.dataTableExt.oSort, { 
    "mysort-pre": function (s) { return s.replace(/(<([^>]+)>)/g, ''); }, 
    "mysort-asc": function (a, b) { return a.localeCompare(b); }, 
    "mysort-desc": function (a, b) { return b.localeCompare(a); } 
}); 
$(function(){ 
    $('table').dataTable({ 
     order: [[ 0, "asc" ]], 
     columnDefs: [ { type: "mysort", targets: 0 } ] 
    }); 
}); 

短,在中國,//分別指1/2/3

默認情況下,它排序>>所以我決定寫我自己的排序。

數據字段中可能沒有一些HTML標籤,所以我用正則表達式去除了'-pre'函數中的這些標籤。

至於'-asc''-desc'功能,我使用localCompare()直接應該排序>>

但結果與我腦海中的結果不一樣。

回答

0

原因

下面是從數據表的源代碼的摘錄:

每個排序選項可以由三個屬性來描述添加到
此目的:

  • {type}-pre - 預格式化功能
  • {type}-asc - 升序功能
  • {type}-desc - 降序功能

所有這三個可以一起使用,僅{type}-pre或僅 {type}-asc{type}-desc和一起。一般建議 只使用{type}-pre,因爲這提供了在速度方面的最佳 實現,儘管爲了與現有的Javascript排序功能的兼容性提供了其他的提供 。

這意味着如果存在{type}-pre,則不會調用{type}-asc/{type}-desc

另外,有Chinese (string)排序插件已經可用,但它不會根據需要刪除HTML標籤。

SOLUTION

因此從技術上如下圖所示進行排序和刪除HTML標籤,以及您的排序插件應該寫成。

$.extend($.fn.dataTableExt.oSort, { 
    "mysort-asc": function (a, b) { 
     a = a.replace(/<[^>]+>/g, ''); 
     b = b.replace(/<[^>]+>/g, ''); 
     return a.localeCompare(b, "zh-CN-u-co-stroke"); 
    }, 
    "mysort-desc": function (a, b) { 
     a = a.replace(/<[^>]+>/g, ''); 
     b = b.replace(/<[^>]+>/g, '');  
     return b.localeCompare(a, "zh-CN-u-co-stroke"); 
    } 
}); 

DEMO

this jsFiddle示範。

NOTES

最初localCompare產生意外的結果

  • ('三').localeCompare('二')返回-1這意味着'三' < '二'

當我將其更改爲('三').localeCompare('二', "zh-CN-u-co-stroke")時,它產生了正確的結果。

+0

我使用Chrome穩定版41.''localeCompare()'與'zh-TW'語言環境給出了錯誤的排序[here](http://i.imgur.com/IQBLMZE.png)。但它並不重要!我的關鍵問題已在您提到的「CAUSE」部分中得到解決。謝謝! –

+0

@JackCherng,你是對的。它適用於Firefox,但在Crome中不起作用,奇怪。這是'localCompare'的一個錯誤,或者必須使用不同的語言環境,您怎麼看? –

+0

我只是從[這裏](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)檢查'localCompare()'。 'localeCompare(a,「co」);'在Firefox和Chrome中都可以正常使用! –

相關問題