2012-01-22 15 views
16

Używam wtyczki jQuery DataTables w mojej aplikacji, a wiele moich wierszy tabeli i filtrów ma w sobie znaki specjalne, w szczególności znaki ampersands (&). Kiedy próbuję filtrować na tych kolumnach, wszystkie rekordy znikają i wyświetlają się "nie znaleziono pasujących rekordów".Jak filtrować wyniki za pomocą znaków specjalnych za pomocą wtyczki jQuery DataTables?

Próbowałem kodowania (tzn. Htmlspecialchars) i dekodowania (tj. Htmlspecialchars_decode) ciągi przed ich wydrukowaniem na stronie, ale żaden nie wydaje się działać.

Przykład: http://jsfiddle.net/gkdcZ/3/

Wszelkie pomysły, dlaczego to może się zdarzyć, i jak mogę to naprawić?

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

Aktualizacja # 1: Problem pojawia się tylko wtedy, gdy można ograniczyć kolumny. Zobacz DataTables API. Działa dobrze, gdy parametr jest ustawiony na "null". http://jsfiddle.net/gkdcZ/4/

AKTUALIZACJA # 2: Nieco bliżej. Dodanie funkcji do zamiany jednostek HTML działa dla określonych znaków (np. Znaków ampersand), ale nie działa dla innych znaków (tj. Wykrzykników i znaków zapytania). Zobacz 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;'); 
} 
+0

można zastąpić '&' z 'i'? w następujący sposób: str_replace ("&", "and", $ input); – azzy81

+2

Nie rozumiem, co próbujesz zrobić. Czy możesz przesłać swój kod JavaScript? – pomeh

+0

Właśnie dodano w powyższym kodzie JavaScript. Próbuję filtrować wyniki wyszukiwania w oparciu o wybór w polu wyboru. Moje pole rozwijane zawiera niektóre elementy ze znakami specjalnymi, które powodują problem. – Michael

Odpowiedz

1

spróbować tej

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

to zestaw do filtrowania wszystkich kolumn, pracuje teraz ...

+0

Z innych powodów, na pewno trzeba zachować regex w miejscu, a specyficzne filtrowanie kolumn jest dość ważne. – Michael

+0

ok ustawić wyrażenie regex na true, działa ... dunno na temat "dlaczego działa tylko z pustym w polu kolumny ... – Daniel

6

Jest rzeczywiście bug z DataTables, że powoduje problemy z jakichkolwiek znaków specjalnych tak będziesz musiał uciec z nich.

http://jsfiddle.net/cz6Bs/

Uwaga: Dodałem XRegExp jako innego zasobu na ucieczkę. http://xregexp.com/

+0

Odniesienie do błędu: http://www.datatables.net/forums/discussion/5879/ fnfilter-nie-dekoduj-kolumny-dane-zawierające-html-znaki-specjalne/p1 – CashIsClay

+0

To działało tylko dlatego, że zmieniono drugi argument z powrotem na null (zobacz inne odpowiedzi wymienione tutaj i moje zaktualizowane powyżej). zmień swój kod z powrotem na filtr na konkretnej kolumnie (np. 0), który nie działa, nawet przy użyciu XRegExp http://jsfiddle.net/cz6Bs/1/ – Michael

3

Spróbuj tego:

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

to jest coraz bliżej poprawki! :) To nie działa Wydaje się jednak działać, jeśli w menu i wynikach znajdują się inne znaki, takie jak wykrzyknik lub znak zapytania http://jsfiddle.net/cz6Bs/4/ (zobacz teraz opcje C i D) – Michael

Powiązane problemy