JS: onclick war die Frage, HTML5 die Antwort?
Gestern hatte ich ja die Frage aufgeworfen, ob das gute alte onclick eigentlich noch verwendet werden soll und/oder ob man auf Biegen und Brechen auf unobstrusive bestehen sollte. Mein größtes Problem bei der ganzen unobstrusive Geschichte war dabei, dass ich mir Information wie, an welche Action und mit welchen Parametern, irgendwo im HTML merken muss, um das ganze möglichst generisch zu behandeln.
Nach einigen Diskussionen und Recherche ist mir eine Lösung untergekommen, die ich zu diesem Zeitpunkt zwar warscheinlich nicht implementieren werde, ich aber trotzdem irgendwie großartig finde (zugegeben, ich habe mich mit HTML 5 bisher noch nicht sonderlich auseinandergesetzt, weil “Never trust a draft”). Deswegen hier dann mal der Ansatz für alle, die wie ich vielleicht noch ein wenig hinterher sind:
1. Man definiere ein Element und füge die in HTML5 vorgesehen data-attribute hinzu:
<ul>
<li class="listeelement" data-action="login" data-id="1" data-params="a=b">
<div>contentzeug</div>
</li>
</ul>
2. Man hole sich die gesetzten data-attribute im Javascript
2.1 Einmal für die doofen Browser statisch:
jQuery('.listeelement').live( "click", function() {
var action = this.getAttribute('data-action');
var id = this.getAttribute('data-id');
var params = this.getAttribute('data-params');
}
Statisch deswegen, weil ich hier beim im Javascript auch immer genau wissen muss, welche data-attributes gesetzt sind
2.2 Für die doofen Browser mit jQuery-Plugin und nicht ganz so statisch, da es eine Methode gibt, die alle data-attribute holt
jQuery('.listeelement').live( "click", function() {
var mydataset = jQuery(this).dataset();
var myaction = mydataset.action;
delete mydataset.action //damit die action nicht nochmal ans GET/POST als Param dran gehangen wird
doSendRequest(myaction, mydataset);
});
2.3 Oder ganz einfach wie in der HTML5-Spec beschrieben, was im Endeffekt wohl dasselbe ist, wie 2.2. Da ich das Plugin nicht ausprobiert habe, kann ich derweil nicht sagen, was es mit den data-attributen in den doofen Browsern macht. Gilt noch zu recherchieren!
jQuery('.listeelement').live( "click", function() {
var mydataset = this.dataset;
var myaction = mydataset.action;
delete mydataset.action //damit die action nicht nochmal ans GET/POST als Param dran gehangen wird
doSendRequest(myaction, mydataset);
});
3. Man schicke den ganzen Kram an die Action. Aber ACHTUNG, nicht funktionierend mit der Variante 1, da müßt ich dann nochmal bißchen Hirnschmalz für opfern, um das praktikable zu gestalten:
function doSendRequest(pAction, pParams) {
jQuery.ajax({
type: "GET",
url: pAction,
data: pParams,
success: doSomething
});
}
Na? Was meint Ihr? Ich finds insgesamt ner sehr gelungend Lösung und bin nahezu begeistert, mal abgesehn von der statischen Variante für die doofen Browser, aber sicherlich ließe sich auch hier noch was geeignetes finden.
Mein herzlicher Dank geht an den Input von der großartigen Community von Stackoverflow. Klickt ihr hier und hier um die entsprechenden Diskussionen anzuschauen.
