Как да филтрирате резултати със специални знаци с помощта на плъгина 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(&, and, $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
добре, задайте regex обратно на true, работи... не знам защо работи само с нула в полето на колона... - person Daniel; 23.04.2012