2016-07-29 8 views
0

Ich arbeite mit einer Mischung aus Legacy-Code, der das jQuery DataTables-Plugin (Version 1.10. Einige der alten Code geht um jQuery-Objekt, und einige der alten Code geht um DataTables API objects. Ich würde gerne alle neuen Code akzeptieren entweder ein jQuery-Objekt oder ein DataTables-API-Objekt, aber ich konnte nicht feststellen, wenn eine Variable verweist auf ein DataTables-API-ObjektTest für jQuery-DataTables API-Objekt

Die einzige Erkennungsmethode, die ich finden konnte in der API, isDataTable, ist nicht geeignet - es nimmt einen String-Selektor für eine Tabelle und gibt zurück, ob die Auswahl in eine DataTable umgewandelt wurde

Die "Klassenerkennung" Methoden in this answer nicht funktionieren; typeof gibt "object", constructor.name zurück "Object", und ich kenne keinen Konstruktor für instanceof oder isPrototypeOf zu verwenden.

Wie in this answer vorgeschlagen (auf gleiche Frage), Object.prototype.toString.call(var) kehrt "[object Object]"

In Chrome console.log(var) erzeugt eine Zusammenfassung, die wie er Informationen hat eine andere Klasse aussieht:

▶ _Api {context: Array[1], selector: Object, ajax: Object} 

ich, dass es sich vorstellen, bedeutet etwas, das ich irgendwo verwenden könnte, aber this question über wo Chrome bekommt diesen Namen hat keine sinnvollen Antworten.

Wie kann ich erkennen, wenn eine Variable auf ein jQuery-DataTables-API-Objekt verweist?

Antwort

1

Sie können mit einem Haltepunkt in Chrome weiter navigieren. Wenn Sie einen Haltepunkt unmittelbar nach einer DataTable-Variablen festlegen und die Variable auswerten, erhalten Sie eine vollständige Map. Ich tat das und fand das:

var myDataTable = $('#myTable').DataTable(myOptions); 
alert(myDataTable.$.__dt_wrapper); 

Die Warnung gibt True zurück. (myOptions ist ein Objekt, das alle Optionen für die DataTable enthält.) Also schaute ich auf ein Objekt (ich habe myOptions), um zu sehen, was ich testen könnte. Sie können nicht direkt testen, ob myOptions.$.__dt_wrapper) falsch ist, weil myOptions.$ zu undefined ausgewertet wird. Also:

if(undefined != myObjectVariable.$ && myObjectVariable.$.__dt_wrapper) { 
    alert('A DataTable Object') 
} else { 
    alert('Not a DataTable Object') 
} 

googeln „__dt_wrapper“ keine Links zeigen, die Datentabellen nicht verwandt sind. Wenn Sie auf datatables.js zugreifen, tritt es zweimal auf. In beiden Fällen wird davon ausgegangen, dass es sich um ein internes Attribut handelt, mit dem ein DataTable-Objekt bezeichnet wird, oder genauer, ob es sich bei einem Objekt um einen DataTable-Wrapper handelt.

Da dies nicht dokumentiert ist, gibt es keine Garantie, dass es in allen zukünftigen Versionen von DataTables funktioniert. Aber das funktioniert in DataTables 1.10.11.

Edit: Ich fragte dazu auf dem Tables Forum (link), und es ist in der Tat ein sauberer Weg, dies zu tun:

myObjectVariable instanceof $.fn.DataTable.Api 

Ist true, wenn das Objekt eine Datentabelle ist. (Dies funktioniert auch für den Kleinbuchstaben dataTable Objekt.)

+0

"! +" Ist ein Syntaxfehler, ich nehme an, das ist ein Tippfehler für "! =" – ShadSterling

+0

Stellt sich heraus, ich verwende DataTables 1.10.3, und dies Lösung funktioniert. Vielen Dank! – ShadSterling

+0

Gern geschehen.Freut mich, es zu hören, aber ich werde diese Frage im DataTables-Forum veröffentlichen und sehen, ob Allan Jardine einen besseren Weg hat, damit umzugehen. Ich bin besorgt, dass dies irgendwo auf der ganzen Linie brechen könnte. Ja, das ist ein Syntaxfehler, mein Fehler. Ich werde es reparieren, danke. Dumme Umschalttaste. – BobRodes