Използвам плъгина 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, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
}