2016-07-26 25 views
1

Ich habe Probleme beim Initialisieren eines Datatables-Suchfilters, um Sonderzeichen zu ignorieren. Ich verwende die Technik aus den Daten accent neutralise plugin.Datatables-Filter ignorieren Sonderzeichen mit HTML-Daten

Es funktioniert ordnungsgemäß mit Zeichenfolge Daten, aber nicht mit HTML-Daten in der Tabelle. Mein Testfall verwendet Namen mit Variationen des Buchstabens u (mit oder ohne Umlaut) ... u, ü, U, Ü Ich möchte, dass der Filter Ergebnisse für den Namen "tuv" anzeigt, unabhängig von der Großschreibung oder dem Umlaut auf u.

STRING Beispiel:
Suche nach „TUV“ findet alle Fälle, und zwar unabhängig von Akzenten ... aber Spalte „Name“ Art nicht ordnungsgemäß funktioniert.
http://jsfiddle.net/lbriquet/hdq8bLqn/

HTML Beispiel:
Suche nach "TUV" findet nur unbetonten Matches .. aber Spalte "Name" Art korrekt funktioniert. Hier http://jsfiddle.net/lbriquet/cj2s501L/

ist der Initialisierungscode:

jQuery.fn.dataTable.ext.type.search.string = function(data) { 
    return !data ? 
    '' : 
    typeof data === 'string' ? 
    data 
    .replace(/έ/g, 'ε') 
    .replace(/ύ/g, 'υ') 
    .replace(/ό/g, 'ο') 
    .replace(/ώ/g, 'ω') 
    .replace(/ά/g, 'α') 
    .replace(/ί/g, 'ι') 
    .replace(/ή/g, 'η') 
    .replace(/\n/g, ' ') 
    .replace(/[áÁ]/g, 'a') 
    .replace(/[éÉ]/g, 'e') 
    .replace(/[íÍ]/g, 'i') 
    .replace(/[óÓ]/g, 'o') 
    .replace(/[úÚ]/g, 'u') 
    .replace(/[üÜ]/g, 'u') 
    .replace(/ê/g, 'e') 
    .replace(/î/g, 'i') 
    .replace(/ô/g, 'o') 
    .replace(/è/g, 'e') 
    .replace(/ï/g, 'i') 
    .replace(/ã/g, 'a') 
    .replace(/õ/g, 'o') 
    .replace(/ç/g, 'c') 
    .replace(/ì/g, 'i') : 
    data; 
}; 

$(document).ready(function() { 
    var oTable = $('#example').DataTable(); 
    // Remove accented character from search input as well 
    $('#example_filter input').keyup(function() { 
    oTable 
     .search(
     jQuery.fn.dataTable.ext.type.search.string(this.value) 
    ) 
     .draw(); 
    }); 
}); 

ich denke, die strip html plugin angepasst werden könnte, dieses Problem zu lösen. Ich habe es geschafft, ein Sonderzeichen zu ersetzen, aber ich muss in der Lage sein, mehrere zu ersetzen. Die Spaltensortierung funktioniert auch mit dieser Methode korrekt.

https://jsfiddle.net/lbriquet/ueo8x7up/

(function() { 
var _div = document.createElement('div'); 
jQuery.fn.dataTable.ext.type.search.html = function(data) { 
    _div.innerHTML = data; 
    return _div.textContent ? 
    _div.textContent.replace(/[üÜ]/g, 'u') : 
    _div.innerText.replace(/[üÜ]/g, 'u'); 
}; 
})(); 

$(document).ready(function() { 
    var oTable = $('#example').DataTable({ 
    "columnDefs": [{ 
     "type": "html", 
     "targets": '_all' 
    }] 
    }); 
}); 

Kann mir jemand eine Hand mit diesem geben?

+0

Nun, habe ich einen kleinen Einblick in das Problem, aber noch nicht eine Lösung. Wenn Sie 'alert (typeof data +' '+ data); 'als erste Zeile Ihrer Funktion eingeben, werden Sie feststellen, dass keine der Daten in der Spalte Name an die Funktion übergeben wird, wenn Sie einen Link darin haben. Ich werde sagen, dass dies daran liegt, dass die Funktion nur String-Eingaben akzeptiert und Ihr Link-Typ keine Zeichenfolge ist. Ich verstehe nicht ganz, was Allan Jardine mit 'jQuery.fn.dataTable.ext.type.search.string' gemacht hat, aber ich vermute, dass das eine Änderung erfordert, so dass es Links im Funktionsaufruf enthält. – BobRodes

Antwort

1

Ich fand die Lösung, indem Sie die Datatables strip html plugin anpassen, um eine Kette von Sonderzeichen im HTML zu ersetzen.

Die Datei jQuery.fn.dataTable.ext.type.search. html Methode gelöst die Probleme konfrontiert, wenn Tabellen HTML-Daten enthalten, die nicht mit der jQuery.fn.dataTable.ext.type.search gelöst werden konnte. string methode in der Datatables accent neutralise plugin verwendet.

https://jsfiddle.net/lbriquet/xjzuahrt/1/

(function() { 
    var _div = document.createElement('div'); 
    jQuery.fn.dataTable.ext.type.search.html = function(data) { 
    _div.innerHTML = data; 
    return _div.textContent ? 
     _div.textContent 
     .replace(/[áÁàÀâÂäÄãÃåÅæÆ]/g, 'a') 
     .replace(/[çÇ]/g, 'c') 
     .replace(/[éÉèÈêÊëË]/g, 'e') 
     .replace(/[íÍìÌîÎïÏîĩĨĬĭ]/g, 'i') 
     .replace(/[ñÑ]/g, 'n') 
     .replace(/[óÓòÒôÔöÖœŒ]/g, 'o') 
     .replace(/[ß]/g, 's') 
     .replace(/[úÚùÙûÛüÜ]/g, 'u') 
     .replace(/[ýÝŷŶŸÿ]/g, 'n') : 
     _div.innerText 
     .replace(/[áÁàÀâÂäÄãÃåÅæÆ]/g, 'a') 
     .replace(/[çÇ]/g, 'c') 
     .replace(/[éÉèÈêÊëË]/g, 'e') 
     .replace(/[íÍìÌîÎïÏîĩĨĬĭ]/g, 'i') 
     .replace(/[ñÑ]/g, 'n') 
     .replace(/[óÓòÒôÔöÖœŒ]/g, 'o') 
     .replace(/[ß]/g, 's') 
     .replace(/[úÚùÙûÛüÜ]/g, 'u') 
     .replace(/[ýÝŷŶŸÿ]/g, 'n'); 
    }; 
})(); 

$(document).ready(function() { 
    var oTable = $('#example').DataTable({ 
    "columnDefs": [{ 
     "type": "html", 
     "targets": '_all' 
    }] 
    }); 
// Remove accented character from search input as well 
    $('#example_filter input[type=search]').keyup(function() { 
     var table = $('#example').DataTable(); 
     table.search(
      jQuery.fn.DataTable.ext.type.search.html(this.value) 
     ).draw(); 
    }); 
});