Как отфильтровать результаты со специальными символами с помощью плагина 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;');
}

person Michael    schedule 22.01.2012    source источник
comment
можно ли заменить "&" на "и"? вот так: str_replace(&, и, $input);   -  person azzy81    schedule 02.03.2012
comment
Я не понимаю, что ты пытаешься сделать. Можете ли вы опубликовать свой код Javascript, пожалуйста?   -  person pomeh    schedule 21.04.2012
comment
Просто добавлено в JavaScript выше. Я пытаюсь отфильтровать результаты поиска на основе выбора раскрывающегося списка. В моем раскрывающемся списке есть элементы со специальными символами, что вызывает проблему.   -  person Michael    schedule 21.04.2012
comment
Только что добавил рабочий пример: jsfiddle.net/gkdcZ/3 (попробуйте фильтровать по A и B).   -  person Michael    schedule 23.04.2012
comment
У меня A&B работает просто отлично... FF11 и в Chrome... какой браузер вы используете? попробуй в другом...   -  person Daniel    schedule 23.04.2012
comment
Привет @Daniel, я тоже использую FF11, и вот что он мне показывает: snag.gy/iNlFh.jpg Я пробовал это в Chrome 18 и IE9. То же самое.   -  person Michael    schedule 23.04.2012
comment
извините, мой плохой я проверил поиск...   -  person Daniel    schedule 23.04.2012
comment
Я тоже это заметил, странно работает в глобальном поиске, а не в выпадающем.   -  person Michael    schedule 23.04.2012
comment
$('#results').dataTable().fnFilter($(#filter_col_1).val(), null, false );   -  person Daniel    schedule 23.04.2012


Ответы (3)


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

http://jsfiddle.net/cz6Bs/

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

person CashIsClay    schedule 23.04.2012
comment
Ссылка на ошибку: datatables.net/forums/discussion/5879/ - person CashIsClay; 23.04.2012
comment
Это работало только потому, что вы изменили второй аргумент обратно на нуль (см. другой ответ, указанный здесь, и мое обновление, опубликованное выше). Если вы вернете свой код для фильтрации по определенному столбцу (например, 0), он не будет работать даже при использовании XRegExp jsfiddle.net/cz6Bs/1 - person Michael; 27.04.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;');
}
person sm13294    schedule 27.04.2012
comment
это все ближе к исправлению! :) Однако это не работает, если в раскрывающемся списке и результатах есть другие символы, такие как восклицательный или вопросительный знак. jsfiddle.net/cz6Bs/4 (сейчас см. варианты C и D) - person Michael; 29.04.2012

попробуй это

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

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

person Daniel    schedule 22.04.2012
comment
По другим причинам мне обязательно нужно сохранить регулярное выражение, и фильтрация конкретных столбцов также довольно важна. - person Michael; 23.04.2012
comment
хорошо, верните регулярному выражению значение true, работает... не знаю, почему работает только с нулевым значением в поле столбца... - person Daniel; 23.04.2012