Attribut oder Property?

Eine Falle beim Update von jQuery

In einer bestehende Webanwendung wollte ich die JQuery-Bibliothek von Version 1.4.X auf 1.6.x aktualisieren. Zum größten Teil gab es keine Probleme, nur an folgender Stelle funktionierte es nicht.

In der Webseite gibt es eine Textbox und ein Drop-Down-Menü zur Schnellauswahl häufig benutzter Begriffe. Wenn man aus dem Menü etwas auswählt, soll der gewählte Begriff in die Textbox geschrieben werden. Dazu nutze ich die folgenden Funktionen:

function put_selected_in_textbox(selectbox, textbox){
  var sel = selectbox.attr('selectedIndex')
  if (sel >= 0){
    var txt = selectbox.find('option:selected').text();
    textbox.val(txt);
  }
  else {
    textbox.val("???");
  }
}
function connect_select_to_text(selectbox, textbox)
{
  selectbox.bind('change', function(){
    put_selected_in_textbox(jQuery(this), textbox);
  });
}
jQuery(document).ready(function(){
    connect_select_to_text( jQuery('#id_of_select'), jQuery('#id_of_textinput'));
});

Mit jQuery-1.6 funktioniert das plötzlich nicht mehr. Der Debugger brachte ans Licht, das die Methode selectbox.attr('selectedIndex') jetzt „undefined“ liefert. Nach einigen Suchen fand ich den Grund:

jQuery unterscheidet jetzt genauer zwischen Properties und Attributen. In der Dokumentation zu der Methode prop() findet man dafür auch eine Begründung.

Meine Übersetzung:

Auf die Properties selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked und defaultSelected greift man mit der prop() Methode zu. Vor jQuery 1.6 war es möglich, auf diese Properties mit attr() zugreifen, dies liegt jedoch nicht im Verantwortungsbereich der attr() Methode. Denn diese Properties haben keine dazugehörigen Attribute und sie sind deshalb nur Properties.

Da fragt man sich schon was denn jetzt eigentlich der Unterschied zwischen Attributen und Properties ist.

 Im Java-Beans-Programmiermodell werden die Eigenschaften jeweils Properties genannt, man greift auf sie mit getX() und setX() zu. In Ruby on Rails hingegen heißen die Felder eines ActiveRecords „attributs“. Im „normalen“ Englisch bezeichnet man mit Properties etwas ist, was man besitzt, z.B. Grundstücke oder Häuser(real property), aber auch die „intellectual property“. Das hilft uns aber irgendwie nur wenig weiter.

Offenbar beziehen sich bei jQuery die Attribute auf die in HTML/XML-Tags definierbaren Attribute. Also sind z.B. href und title Attribute des a-tags. Die definierten Attribute des select-Tags findet man in der HMTL 4.01 W3C-Spezifikation.

Alles, was so nicht definierbar ist, ist demnach kein Attribut.

Ende gut, alles gut?

Doch gerade, als es anfing Sinn zu ergeben, bin in der DOM-Spezifikation, die den Zugriff auf HTML-Elemente von Javascript regelt, auf folgenden Satz gestoßen:

1.6.1. Property Attributes

HTML attributes are exposed as properties on the element object.

Als Entwickler bleibt der unbefriedigende Zustand, das die Begriffe Properties und Attribute je nach Kontext etwas anderes bedeuten, und manchmal sogar in verschiedenen Versionen derselben Bibliothek unterschiedlich definiert sind

Beteilige dich an der Unterhaltung

1 Kommentar

Schreibe einen Kommentar