jQuery datatablejs土耳其字符搜索问题

4xrmg8kj  于 2023-11-17  发布在  jQuery
关注(0)|答案(5)|浏览(126)

我有一个jquery datatablejs。我列出项目。我想在search中搜索一些东西。但是当我输入时,它只找到chars。**我还想找到i chars。**就像I--ü。
我搜索了很多网站/文档,但没有找到任何东西。
下面的链接定义了用于排序的土耳其字符。我们可以用它来搜索吗?另一个问题是,或者我们可以说我的约束是我不能改变datatable的原始数据。我不能将İ替换为i或i替换为İ。
https://datatables.net/plug-ins/sorting/turkish-string
注意:我是从mvc控制器中使用aplog获取数据的。我没有获取json数据。我获取的是模型对象。

42fyovps

42fyovps1#

将文件的编码改为UTF-8,重新输入字符并保存。测试它。
[ {“Numara”:“ükrüyac ",“Ad”:“5505”},{“Numara”:“amil öndü",“Ad”:“6655”},{“Numara”:“”,“Ad”:“6655”},{

yc0p9oo0

yc0p9oo02#

您可以使用DataTables提供的以下插件:
Diacritics Neutralize
这可以包含在您的HTML页面中,如下所示:

https://cdn.datatables.net/plug-ins/1.10.21/filtering/type-based/diacritics-neutralise.js

字符串
然而,为了有效地使用这个插件来满足您的需求,还需要一些额外的步骤,这样数据的变化对用户来说是不可见的。

概述

1.向数据表中添加隐藏但可搜索的额外列。此列将包含表中其他列中所有文本的“规范化”版本(如下所述)。只有当单词的规范化形式不同于原始的非规范化形式时,才需要在此列中存储该单词。
1.添加自定义搜索功能,对用户输入的搜索词执行相同的规范化过程。
这意味着用户可以对iIİ进行任何搜索-并且它将成功找到包含这些字符中任何一个的任何行。
这里的关键部分是我们对表数据和搜索数据应用完全相同的规范化过程。

处理表数据

如果您完全控制要在表中显示的数据,则可以在将数据发送到数据表之前执行步骤(1)。您只需将列定义为隐藏:

"columnDefs": [
  {
    "targets": [ -1 ], // -1 refers to the final column in the table
    "visible": false,
    "searchable": true
  }
]


这需要你有一个与我们将要使用的“diacritics-neutralize”函数等效的服务器端函数。如果这不是一个选项,你可能更喜欢使用一个函数来处理表本身中的数据:

"columnDefs": [
  {
    "targets": [ -1 ], // -1 refers to the final column in the table
    "visible": false,
    "searchable": true,
    "data": function ( row, type, val, meta ) {
      return normalizeTableData( row ); // see below!
    }
  }
]

处理搜索词

为了规范化搜索项,我们可以使用以下DataTables搜索函数:

$('#example_filter input').off().keyup(function () {
  var normString = normalizeString( this.value ); // see below!
  table.search(normString).draw();
});


这假设我们的HTML表的ID为“example”。

执行标准化

该函数的用法如下:

var normString = jQuery.fn.DataTable.ext.type.search.string(inputString);


如果你看一下这个函数的JavaScript,你会发现它包含很多Map-例如:

{'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g}


I的土耳其大写字母是İ,其Unicode值为u0130。您可以看到这是在提供的Map中Map到I的字符之一。
所以,我们的normalizeString函数很简单:

function normalizeString(inputString) {
  return jQuery.fn.DataTable.ext.type.search.string(inputString);
}


对于表数据,处理取决于数据是以对象{...}还是数组[...]的形式提供的。我将假设数组-但当然,对象的迭代会有所不同:

function normalizeTableData( row ) {
    var normalizedData = '';
    row.forEach(function (item) {
      var new = normalizeString( item );
      if ( new !== item ) {
        normalizedData = normalizedData + ' ' + new;
      }
    });
    return normalizedData;
}


您可能需要增强上述迭代,这取决于表中数据的类型(例如,无法规范化的数字数据值)。

y53ybaqx

y53ybaqx3#

我找到了一个解决方案,它没有任何问题。
解决方案如下:
我把这个函数叫做:
https://jsfiddle.net/s39o8pdu/1/

jQuery.extend( jQuery.fn.dataTableExt.oSort, {
  'locale-compare-asc': function ( a, b ) {
     return a.localeCompare(b, 'cs', { sensitivity: 'case' })
  },
  'locale-compare-desc': function ( a, b ) {
     return b.localeCompare(a, 'cs', { sensitivity: 'case' })
  }
})

jQuery.fn.dataTable.ext.type.search['locale-compare'] = function (data) {
    return NeutralizeAccent(data);
}

function NeutralizeAccent(data)
{
  return !data
      ? ''
        : typeof data === 'string'
        ? data
        .replace(/\n/g, ' ')
        .replace(/[éÉěĚèêëÈÊË]/g, 'e')
        .replace(/[šŠ]/g, 's')
        .replace(/[čČçÇ]/g, 'c')
        .replace(/[řŘ]/g, 'r')
        .replace(/[žŽ]/g, 'z')
        .replace(/[ýÝ]/g, 'y')
        .replace(/[áÁâàÂÀ]/g, 'a')
        .replace(/[íÍîïÎİÏ]/g, 'i')
        .replace(/[ťŤ]/g, 't')
        .replace(/[ďĎ]/g, 'd')
        .replace(/[ňŇ]/g, 'n')
        .replace(/[óÓ]/g, 'o')
        .replace(/[úÚůŮ]/g, 'u')
        : data
}

var table = $('#example').DataTable({
    columnDefs : [
     { targets: 0, type: 'locale-compare' },
  ]
})

 $('#example_filter input').keyup(function () {
    table
    .search(
      jQuery.fn.dataTable.ext.type.search.string(NeutralizeAccent(this.value))
    )
    .draw()
 })

字符串
所以祝有这个问题的人好运。如果你有任何问题问我。我现在知道如何解决这个问题了。
就像andrewjames在回答中说的,我们用Accent Neutrise解决这个问题。

vnjpjtjt

vnjpjtjt4#

你可以尝试用这段代码来替换

$("input[type='search']").keyup(function () {
            var charMap = {
                Ç: 'C',
                Ö: 'O',
                Ş: 'S',
                İ: 'I',
                I: 'i',
                Ü: 'U',
                Ğ: 'G',
                ç: 'c',
                ö: 'o',
                ş: 's',
                ı: 'i',
                ü: 'u',
                ğ: 'g'
            };

            var str = $("input[type='search']").val();
            str_array = str.split('');

            for (var i = 0, len = str_array.length; i < len; i++) {
                str_array[i] = charMap[str_array[i]] || str_array[i];
            }

            str = str_array.join('');

            var clearStr = str.replace(" ", "").replace("-", "").replace(/[^a-z0-9-.çöşüğı]/gi, "");

            $("input[type='search']").val(clearStr);

        });

字符串

dfddblmv

dfddblmv5#

试试这个。它甚至在Vue 3中也解决了这个问题。

jQuery.fn.DataTable.ext.type.search.string = function (sVal) {
var letters = { "İ": "i", "I": "ı","i": "İ", "ı": "I" };
return sVal.replace(/(([İI]))/g, function (letter) { return letters[letter]; });};

字符串

相关问题