Dojo’s Stolpersteine

Das Dojo Toolkit enthält jede Menge interessanter und nützlicher Funktionen, z.B. dojo.fieldToObject(). Die Funktion ist sehr praktisch, da sie die Inhalte eines beliebigen Feldes in einen String bzw. einen Array konvertiert, ohne daß man sich um den Feldtyp kümmern muß.

Es gibt nur eine Besonderheit zu beachten: Zwar wird das jeweilige HTML-Element über die id referenziert, doch aus mir unerklärlichen Gründen (siehe unten) muß bei dem jeweiligen Feld das name-Attribut gesetzt sein, sonst liefert die Funktion null zurück.

<input type="text" id="ID" value="VALUE" name="NAME" />

<script type="text/javascript">
 dojo.addOnLoad( function(){
 var f = dojo.fieldToObject("ID");
 alert( f );
 });
</script>

[Fett hervorgehoben: id über die referenziert wird, und das nötige name-Attribut in rot.]

Dieses Verhalten ist bei allen Dojo-Varianten gleich (aktuelle Version 1.6).

 

Warum ist das so?

Wirft man einem Blick auf die Implementierung der Funktion, so wird das name-Attribut vorausgesetzt, sonst wird das Item nicht vearbeitet:

dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){
 // summary:
 //        Serialize a form field to a JavaScript object.
 //
 // description:
 //        Returns the value encoded in a form field as
 //        as a string or an array of strings. Disabled form
 //        elements and unchecked radio and checkboxes are skipped. 
 //        Multi-select elements are returned as an array of string
 //        values.
 var ret = null;
 var item = _d.byId(inputNode);
 if(item){
 var _in = item.name;
 var type = (item.type||"").toLowerCase();
 if(_in && type && !item.disabled){
 if(type == "radio" || type == "checkbox"){
 if(item.checked){ ret = item.value }
 }else if(item.multiple){
 ret = [];
 _d.query("option", item).forEach(function(opt){
 if(opt.selected){
 ret.push(opt.value);
 }
 });
 }else{
 ret = item.value;
 }
 }
 }
 return ret; // Object
 }

[Fett hervorgehoben: Die Referenzierung erfolgt die Dojo-interne Funktion dojo.byId. In Rot die Überprüfung des name-Attributes.]

In meinen Augen gibt es keinen Grund für diese Überprüfung bzw. das Abbrechen, wenn kein name-Attribut vorhanden ist. Ändert man die Funktion ab und wirft diese Überprüfung raus, bereitet das keinerlei Probleme.

Was auch immer sich die Entwickler hierbei gedacht haben, der Sinn erschließt sich mir leider nicht. Aber ich lassen mich gerne eines besseren belehren…

Dieser Beitrag wurde unter Allgemein, Dojo Toolkit, Java Script abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert