Как фильтровать результаты со специальными символами с помощью плагина jQuery DataTables? - программирование
Подтвердить что ты не робот

Как фильтровать результаты со специальными символами с помощью плагина jQuery DataTables?

Я использую плагин 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. Работает нормально, если для параметра установлено значение "null". 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;');
}
4b9b3361

Ответ 1

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

http://jsfiddle.net/cz6Bs/

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

Ответ 2

Попробуйте следующее:

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

Ответ 3

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

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

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