2016-08-04 10 views
1
Suche

https://datatables.net/reference/api/search()#Examplevon Datatable

Im den Link oben als Beispiel für meine Suche verwenden, aber mein Setup ist ganz anders.

<td> 
    <div class="plCell_desktop"> 
     <input type="radio" class="" data-lnk_id="414107671" data-group="RUTH"> 
     <label for="414107671">RUTH</label> 
    </div> 
</td> 

Hier ist ein Auszug aus meiner Tabelle.

Das einzige sichtbare Datenbit ist "Ruth".
aber wenn ich nach sage '76' suche, wird es immer noch "Ruth" zurück bringen.
Der Grund ist wahrscheinlich die Tatsache, dass ich viel mehr Informationen in der Tabellenzelle als "Ruth" habe.

Okay, also meine Frage ist. Können Sie DataTables zwingen, am Anfang eines Wortes zu suchen? z.B. ("Uth" eingeben wird nicht "Ruth" zurückbringen, aber "Ru" wird hoffen, dass es Sinn macht).

Können Sie eine Art "innerHTML.val()" Suche mit DataTables durchführen?

Antwort

1

Okay, so my question is. Can you force DataTables to search from the beginning of a word. e.g. (enter "uth" will not bring back "Ruth", but "Ru" will, hope it makes sense).

Ja. Erstellen Sie einen benutzerdefinierten Filter im Voraus, der diese Filterung durchführt. Der Standard „Smart Search“ wird von der benutzerdefinierten Filter und jede zukünftige Filterung wird dieser durch außer Kraft gesetzt werden:

$.fn.dataTable.ext.search.push(function(settings, data, dataIndex) { 
    var term = $('.dataTables_filter input').val().toLowerCase() 
    for (var i=0, l=data.length; i<l; i++) { 
    if (data[i].toLowerCase().indexOf(term) == 0) return true 
    } 
    return false 
}) 

Demo ->http://jsfiddle.net/qxcjzuxa/

Wie Sie feststellen, kann es sehr leicht sein würde, machen Die DataTables Filterung Groß- und Kleinschreibung (nur ein Beispiel). Das Filter-Array ist eine LIFO-Struktur, in der Sie mehrere Filter übereinander haben können. Sie entfernen einen Filter einfach durch $.fn.dataTable.ext.search.pop(), wenn Sie aus irgendeinem Grund "Anfang des Wortes" Filterung dynamisch deaktivieren.

+0

Wenn ich fragen darf. Ich bekomme und error "* TypeError: Kann die Eigenschaft 'push' von undefined * nicht lesen". Kannst du vielleicht helfen? – morne

+0

@morne, Sie scheinen dies zu nennen, bevor die DataTables js voll geladen ist? Die einzige Erklärung, die logisch erscheint. Sie können benutzerdefinierte Filter jederzeit hinzufügen, auch nachdem die Tabelle initialisiert wurde. Ich schätze, das wäre für dich in Ordnung. Außerdem habe ich nicht vollständig darauf abgezielt, dass Sie den Textteil von Etiketten extrahieren möchten. Wenn ja, sollte der Code natürlich 'if ($ (data [i], 'label') sein. Text(). ToLowerCase(). IndexOf (term) == 0) return true' ... – davidkonrad

+0

Bit der Verzögerung sorry . Beim Debuggen von JS bekomme ich eine "Undefined for" -Suche. "Dies könnte die Version von DataTables sein. Es gibt ein anderes Beispiel, das' $ .fn.dataTableExt.afnFiltering.push (function (oSettings, aData, iDataIndex) 'verwendet.) Arbeit? – morne

1

Könnten Sie einfach jQuery verwenden?

$(".plCell_desktop label").each(function() { 
    // Using RexExp matching 
    RexExp regex = new RegExp(); // Your regex obj 
    if ($(this).val().match(regex)) { 
    // Do stuff if it matches 
    } 

    // Or if you just want to do something if it has a value: 
    if ($(this).val()) { 
    // ... 
    } 
}); 
1

Wenn Sie häufig auf die übereinstimmenden Beschriftungen in Ihrem Code zugreifen müssen, sollten Sie vermeiden, den regulären Ausdruck jedes Mal zu berechnen. Eine Lösung wäre eine einmalige Vorverarbeitung, die ein benutzerdefiniertes Attribut hinzufügen würde. Nennen wir es isOk.

dann die Etiketten mit einem Standard-jQuery-Selektor Sie können wählen:

$('label[isOk=Y]') 

Nachfolgend finden Sie einige Code-Demo.

var regex = /^RU/; 
 

 
$('label').each(function() { 
 
    $(this).attr('isOk', $(this).html().match(regex) !== null ? 'Y' : 'N'); 
 
}); 
 

 
var res = $('label[isOk=Y]'); 
 

 
// check whether we've selected the correct labels 
 
res.each(function() { console.log($(this).attr('for')); });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<td> 
 
    <div class="plCell_desktop"> 
 
     <input type="radio" class="" data-lnk_id="414107671" data-group="RUTH"> 
 
     <label for="414107671">RUTH</label> 
 
     <input type="radio" class="" data-lnk_id="414107672" data-group="RUTH"> 
 
     <label for="414107672">RUTH TOO</label> 
 
     <input type="radio" class="" data-lnk_id="414107673" data-group="RUTH"> 
 
     <label for="414107673">NOT REALLY RUTH</label> 
 
    </div> 
 
</td>