【问题标题】:JQuery datatablejs turkish character search problemJQuery数据表土耳其字符搜索问题
【发布时间】:2020-12-13 23:16:46
【问题描述】:

我有一个 jquery datatablejs。我列出项目。我想在搜索中搜索一些东西。但是当我输入 İ 时,它只会找到 İ 字符。 我也想找到 i 字符。 喜欢 I-ı Ü-ü。

我搜索了很多网站/文档,但都找不到任何东西。

下面的这个链接定义了用于排序的土耳其字符。我们可以用它来搜索吗? 其他问题是或者我们可以说我的限制是我无法更改数据表的原始数据。我无法将 İ 替换为 i 或将 i 替换为 İ。

https://datatables.net/plug-ins/sorting/turkish-string

注意:我使用 ajax 从 mvc 控制器获取数据。我没有得到 json 数据。我得到模型对象。

【问题讨论】:

    标签: javascript html jquery model-view-controller datatables


    【解决方案1】:

    我找到了一个解决方案,并且没有任何问题。

    解决办法如下:

    我调用这个函数:

    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 中和化解决了这个问题。

    【讨论】:

      【解决方案2】:

      您可以使用DataTables提供的以下插件:

      Diacritics Neutralize

      这可以包含在您的 HTML 页面中,如下所示:

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

      但是,要有效地使用此插件来满足您的需求,还需要一些额外的步骤,以便用户实际上看不到数据更改。

      概述

      1. 在您的数据表中添加一个隐藏但可搜索的额外列。此列将包含表中其他列中所有文本的“规范化”版本(如下所述)。如果它的规范化形式与原始的非规范化形式不同,您只需要在此列中存储一个单词。

      2. 添加自定义搜索功能,对用户输入的搜索词执行相同的规范化过程。

      这意味着用户可以对 i 或 I 或 İ 进行任何搜索 - 并且它将成功找到包含这些字符中的任何一个的任何行。

      这里的关键部分是我们对表数据和搜索数据应用完全相同的规范化过程。

      处理表格数据

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

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

      这要求您具有与我们将使用的“变音符号中和”功能提供的等效的服务器端功能。如果这不是一个选项,您可能更喜欢使用函数来处理表本身中的数据:

      "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,您会发现它包含许多映射 - 例如:

      {'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。您可以看到这被列为在提供的映射中映射到 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;
      }
      

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

      【讨论】:

      • 我喜欢你的解决方案。我会测试它。
      【解决方案3】:

      你可以试试这个代码来替换

         $("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);
      
              });
      

      【讨论】:

      • 但如果我不想替换值。因为它们是独一无二的。我无法更改数据表上的数据。反正我会做的。用于测试。
      • Op 声明他不能更改数据或替换值。
      【解决方案4】:

      将文件的编码更改为 UTF-8 并重新输入字符并保存。测试一下。
      [ { “Numara”:“şükrü yağcı”, “广告”:“5505” }, { “Numara”:“şamil öndüş”, “广告”:“6655” }, {

      【讨论】:

      • 用notepad++打开,对json文件也做菜单编码utf8。
      • contentType: "application/json; charset=utf-8", .. 我将此代码插入到 ajax get。我没有工作。
      • $.ajax({ "url": "URLTOGO", "method": "GET", contentType: "application/json; charset=utf-8", ....});
      • 问题是我的数据不是json。它是一个对象。
      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2014-08-09
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多