2012-01-22 54 views
16

Estoy usando el complemento jQuery DataTables en mi aplicación, y muchas de las filas y filtros de mi tabla tienen caracteres especiales, específicamente símbolos y símbolos (&) en ellos. Cuando intento filtrar en estas columnas, todos los registros desaparecen y muestra "no se encontraron registros coincidentes".Cómo filtrar resultados con caracteres especiales usando el plugin jQuery DataTables?

He intentado codificar (es decir, htmlspecialchars) y descodificar (es decir, htmlspecialchars_decode) las cadenas antes de que se impriman en la página, pero ninguna parece estar funcionando.

Ejemplo: http://jsfiddle.net/gkdcZ/3/

Cualquier idea por qué esto podría estar sucediendo, y cómo puedo solucionarlo?

HTML:

<select id="filter_col_1" name="filter_col_1"> 
    <option value="">Select</option> 
    <option value="A&B">A&B</option> 
    <option value="C">C</option> 
    <option value="D">D</option> 
</select> 

<tr> 
    <td>A&B</td> 
    <td>Jones, Brandon</td> 
    <td>01/02/2003</td> 
</tr> 

JavaScript:

$("#filter_col_1").change(function() { 
    $('#results').dataTable().fnFilter(
     '\\b' + $("#filter_col_1").val() + '\\b', 
     1, 
     true, 
     false 
    ); 
});  

ACTUALIZACIÓN # 1: problema parece ocurrir sólo cuando se limita la columna. Ver DataTables API. Funciona bien cuando el parámetro se establece en "nulo". http://jsfiddle.net/gkdcZ/4/

ACTUALIZACIÓN # 2: Un poco más cerca. Agregar una función para reemplazar entidades HTML funciona para ciertos caracteres (es decir, signos y signos), pero no funciona para otros caracteres (es decir, signos de exclamación y signos de interrogación). Ver http://jsfiddle.net/cz6Bs/4/

'\\b' + htmlEntities($('#filter_col_1').val()) + '\\b' 

function htmlEntities(str) { 
return String(str).replace(/&/g, '&amp;') 
        .replace(/</g, '&lt;') 
        .replace(/>/g,  '&gt;') 
        .replace(/"/g, '&quot;'); 
} 
+0

puede sustituir a la 'Y' con 'y'? así: str_replace ("&", "and", $ input); – azzy81

+2

No entiendo lo que intentas hacer. ¿Puedes publicar tu código Javascript por favor? – pomeh

+0

Acaba de agregarse en JavaScript arriba. Intento filtrar los resultados de búsqueda en función de una selección de cuadro desplegable. Mi cuadro desplegable tiene algunos elementos con caracteres especiales, lo que está causando el problema. – Michael

Respuesta

1

tratar este conjunto

$('#results').dataTable().fnFilter(
     $("#filter_col_1").val(), 
     null, 
     true 
    ); 

que va a filtrar en todas las columnas, trabaja ahora ...

+0

Por otras razones, con seguridad debo mantener la expresión regular en su lugar, y el filtrado específico de la columna también es bastante importante. – Michael

+0

bien, establezca la expresión regular de nuevo en true, funciona ... no sé sobre el "por qué funciona solo con nulo en el campo de la columna ... – Daniel

6

En efecto, existe un error con tablas de datos que causa problemas con cualquier caracteres especiales por lo tendrás que escapar de ellos.

http://jsfiddle.net/cz6Bs/

Nota: he añadido XRegExp como un recurso para el escape. http://xregexp.com/

+0

Referencia sobre el error: http://www.datatables.net/forums/discussion/5879/ fnfilter-does-not-decode-column-data-containing-html-special-characters/p1 – CashIsClay

+0

Esto solo funcionaba porque cambió el segundo argumento a nulo (consulte la otra respuesta que figura aquí y la que se actualizó anteriormente). cambie su código para filtrar en la columna específica (es decir, 0) no funciona incluso con XRegExp http://jsfiddle.net/cz6Bs/1/ – Michael

3

prueba este:

$(document).ready(function() {  
$('#results').dataTable(); 
$("#filter_col_1").change(function() { 
    $('#results').dataTable().fnFilter( 
'\\b' + htmlEntities($('#filter_col_1').val()) + '\\b', 
0, 
true, 
false 
); 
});   


});     
function htmlEntities(str) { 
return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g,  '&gt;').replace(/"/g, '&quot;'); 
} 
+0

¡Esto se está acercando a una solución! :) No lo hace parecen funcionar, sin embargo, si hay otros caracteres como un signo de exclamación o un signo de interrogación en el menú desplegable y los resultados. http://jsfiddle.net/cz6Bs/4/ (ver opciones C y D ahora) – Michael

Cuestiones relacionadas