Как отфильтровать результаты по специальным символам с помощью плагина jQuery DataTables? - PullRequest
16 голосов
/ 22 января 2012

Я использую плагин jQuery DataTables в своем приложении, и многие строки и фильтры моей таблицы содержат специальные символы, в частности, амперсанды (&). Когда я пытаюсь отфильтровать эти столбцы, все записи исчезают, и отображается сообщение «не найдено подходящих записей».

Я пытался кодировать (то есть htmlspecialchars) и декодировать (то есть htmlspecialchars_decode) строки до того, как они будут напечатаны на странице, но ни одна из них, похоже, не работает.

Пример: http://jsfiddle.net/gkdcZ/3/

Есть идеи, почему это может происходить, и как я могу это исправить?

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
    );
} );    

ОБНОВЛЕНИЕ № 1: Проблема возникает только тогда, когда вы ограничиваете столбец. См. API DataTables . Работает нормально, когда параметр установлен на «ноль». http://jsfiddle.net/gkdcZ/4/

ОБНОВЛЕНИЕ № 2: Немного ближе Добавление в функцию замены HTML-сущностей работает для определенных символов (то есть амперсандов), но не работает для других символов (то есть восклицательных знаков и вопросительных знаков). См 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;');
}

Ответы [ 3 ]

6 голосов
/ 23 апреля 2012

Действительно, в dataTables есть ошибка, которая вызывает проблемы с любыми специальными символами, поэтому вам придется их избегать.

http://jsfiddle.net/cz6Bs/

Примечание. Я добавил XRegExp в качестве другого ресурса дляпобег.http://xregexp.com/

3 голосов
/ 28 апреля 2012

Попробуйте это:

$(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;');
}
1 голос
/ 23 апреля 2012

попробуйте

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

установить его для фильтрации по всем столбцам, работает сейчас ...

...