Freitag, 11. Februar 2011

Bitte warten Seite

Idee... Anzeigen einer Bitte warten Seite - Bis der eigentliche Content geladen wurde.
Dann die Seite ersetzten.- Ja - Das ist möglich....

In dieseem Beispiel wurde ein asynchroner Ajax-Aufruf gemacht.
Die Umsetzung erfolgt mittels jQuerey.
Das Ergebnis des Aufrufs ersetzt den aktuellen Inhalt.
Die 3 zentralen methoden sind:

  • document.open()

  • document.write('neuer Inhalt')

  • document.close





 <script type='text/javascript'>
$(document).ready(
function() {
$.ajax({
url: "test.php",
success: function(data, textStatus, jqXHR) { document.open();
document.write(data); document.close();
},
error: function(jqXHR, textStatus, errorThrown) {alert(textStatus);},
statusCode: {404: function() {
alert('page not found');
}
}
});
}); // Ende Ende ready()
</script>

Dienstag, 25. Januar 2011

html zentriertes Design

Moderne Anwendungen arbeiten oft mit einem zentrierten Layout.
Wie läßt sicht die Komponente in einer html-Seite zentrieren?

Man führt eine Hauptelement ein, und tut dieses zentrieren.
Das Hauptelement kann ein DIV eine TABLE oder ein sonstiges Element sein,
in dem sich unterelmenten einfügen lassen.

Das Zentrieren wird mit der 2 Style-Eingenschaften gemacht: margin-left:auto und margin-right:auto.


 <body>  
<table style="margin-left:auto; margin-right: auto;">
...
</table>
</body>


Bei divs nicht vergessen die Breite mit anzugeben.

 <body>   
<div style="margin-left:auto; margin-right: auto;width: 800px">
...
</div>
</body>

Montag, 24. Januar 2011

Einbau von Firebug-Light in den IE

Um den IE zu debuggen wünscht man sich bisweilen Zugriff auf den Firebug zu haben.
Leider ist dies nicht der Fall.
Außerdem kann man in größren Unternehmen auch kein weiteren Tools zum Debuggen in den Browser einbauen.
Die aktuelle Beschreibung zeigt wie man den Firebug-Light aktiviert.
Hierzu muß der unten beschriebene Code in die URL-Zeile des IE gepasted werden.
Nach betätigen von Enter ist der Firebug aktiviert.
Fertig.




javascript:(function(F,i,r,e,b,u,g,L,I,T,E){if(F.getElementById(b))return;E=F[i+'NS']&&F.documentElement.namespaceURI;E=E?F[i+'NS'](E,'script'):F[i]('script');E[r]('id',b);E[r]('src',I+g+T);E[r](b,u);(F[e]('head')[0]||F[e]('body')[0]).appendChild(E);E=new%20Image;E[r]('src',I+L);})(document,'createElement','setAttribute','getElementsByTagName','FirebugLite','4','firebug-lite.js','releases/lite/latest/skin/xp/sprite.png','https://getfirebug.com/','#startOpened');

Dienstag, 18. Januar 2011

jQuery Validation- und Formplugin






Die 2 jQuery-Plugins lassen sich sehr gut miteinander kombinieren.
Die Anforderung war folgende:
  • Valierung auf dem Client -> Validationplugin
  • Übermittlung des Formulars im Hintergrund (AJAX) -> Formplugin
  • So wenig Code wie möglich selber implementieren.

Beide Plugins sind für sicht genommen schon sehr genial.
Das Validationplugin gehört zu den wirklich guten plugins und läßt sich super schnell in die Seite einbauen.

Das nun Folgende Codeschnipsel wurde für Portlets in Form einer JSP konzipiert.
Eine verwendung innerhalb e
<script type="text/javascript" src="${pageContext.request.contextPath}/img/jquery.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/img/jquery.validate.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/img/jquery.form.js"></script>



function validateGutachtenForm() {
$('#gutachtenFormular').validate({
rules: {
kosteneinsparung: "required",
zeiteinsparung: "required"
}, //Ende Regeln
messages: {
},
errorPlacement: function(error, element) {
if ( element.is(":radio") || element.is(":checkbox")) {
error.appendTo( element.parent());
} else {
error.insertAfter(element);
}
},
submitHandler: function(form) {
var options = {
success: showResponse // post-submit callback
};
$(form).ajaxSubmit(options);
}
}); // Ende validate
}




// post-submit callback
function showResponse(responseText, statusText, xhr, $form) {
alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
'\n\nThe output div should have already been updated with the responseText.');
}



Es gibt verschieden Arten von Buttons in HTML.
An dieser Stelle wir explizit kein Submit-Button verwendet ()
Sondern der button-Tag. Durch betätigen dieses Buttons wird die valierungsMethode aufgerufen.

<button onclick="validateGutachtenForm()">Senden</button>



jQuery erfindet an dieser Stelle das Rad nicht neu, sondern verwendet das class-Attribut
und das title-Attribut.


<input type='radio' name='kosteneinsparung' value='ns'
class='required' title='Wählen Sie eine Option' /> Nicht schätzbar
<input type='radio' name='kosteneinsparung' value='gering' /> Gering
<input type='radio' name='kosteneinsparung' value='mittel' /> Mittel
<input type='radio' name='kosteneinsparung' value='hoch' /> Hoch






Commons Fileupload und Portlet 286

Wir konnten die die Commons-Fileupload lib von Apache nicht in unserer Anwendung verwenden, da die serverRessource-Methode des Porlet286-Standards nicht unterstüzt wird.
Wir haben die Klassen aber fast 1:1 nachgebaut, und um die relevanten Stellen umgeschrieben. Theoretisch könnten wir den Code jetzt contributen, so das Apache Commons-Fileupload dies zukünftig unterstüzten könnte.

Dienstag, 23. November 2010

Ändern von Comboboxen (SELECT-Tag) über innerHTML

In der Ajax-Welt kommt es häufig vor, dass man die Werte von Comboboxen (also die Options innerhalb eines Select-Tags) dynamisch ändern möchte. Z.B. bei einer Fahrzeugsuche. In der Combobox Marke wird VW ausgewählt. Abhängig davon soll die Combobox Typ mit Golf, Polo, Passat usw. gefüllt werden.

Eine Möglichkeit besteht in der Manipulation des DOMs. Diese Möglichkeit ist aber vor allem im Internet Explorer (IE) sehr imperformant. In den meisten Fällen ist es besser, das HTML, das das Ergebnis der DOM-Operationen sein würde, "von Hand" zu erzeugen und per innerHTML dem Element zu verpassen. Das funktioniert auch in Browsern einwandfrei. Im IE dagegen weit gefehlt.

Der IE hat beim Select-Tag einen Bug (zumindest bis zur Version 7). Wird das Innere eines Select-Tags über innerHTML gesetzt, ist der IE davon unbeeindruckt. Er zeigt weiterhin die alten Einträge in der Combobox.

Hier kommt die IE-spezifische Eigenschaft outerHTML ins Spiel. Verwendet man outerHTML, zeigt der IE die Änderungen nach dem Aufruf auch an.

outerHTML hat zwei unangenehme Nebenwirkungen:


  • Der Select-Tag selbst ist auch enthalten. D.h., er muss vollständig im manipulierten String enthalten sein.

  • Nach dem Zuweisen von outerHTML wird im DOM eine neue Instanz erzeugt. Um auf das geänderte Element nochmals zuzugreifen, muss es über document.getElementById() wieder geholt werden.



Hier ein Bsp. für die Befüllung eines Select-Tags:


var select = document.getElementById("mySelect");
var num = select.options.length + 1;
select.innerHTML = "";
var innerHTML = "";
// innerHTML erzeugen
innerHTML = "<option value=\"1\">Golf"</option>"
+ "<option value=\"2\">Polo"</option>"
+ "<option value=\"3\">Passat"</option>";

if (isIe()) {
// nur für IE

var indexOfClosingTag = select.outerHTML.toUpperCase().lastIndexOf("</select>");
var outerHTML = select.outerHTML.substring(0, indexOfClosingTag) + innerHTML + select.outerHTML.substring(indexOfClosingTag);
select.outerHTML = outerHTML;

select = document.getElementById(select.id);
} else {
// nur für Browser
select.innerHTML = innerHTML;
}
select.styles.display = "";




Der grün markierte Code setzt das erzeugte innerHTML in die vorhandenen Select-Tags ein.

Damit die Zeile select.styles.display = ""; ausgeführt werden kann, muss vorher die neu erzeugt Instanz des Select-Tags aus dem DOM zurückgeholt werden (rote Zeile).

Mittwoch, 22. September 2010

Browser Quirk - Deselect Radiobuttons





Wir haben 2 Gruppen von Radiobuttons.
Wenn die erste Gruppe auf Nein gestellt ist, so muss die zweite Gruppe deselectiert werden. Hierzu gibt es gleich mehrer Dinge zu beachten. Da sich der IE und der FF in diesem Punkt voneinander unterschiedlich verhalten

  1. Die Buttons (Gruppe 1) benötigen unbeding onclick="this.blur()" . Damit der Internetexplorer auf die Veränderung reagiert.

  2. Fehlerhafte indexierung der Buttons im IE.





Definition der steuernden Buttons.
<input type="radio" onclick="this.blur()"
onchange="de_wwag_alma_anliegen_versicherungsfallchanged(this.value)"
value="true"
name="editForm:versicherungsfallJaNeinRadio">

<input type="radio" onclick="this.blur()"
onchange="de_wwag_alma_anliegen_versicherungsfallchanged(this.value)"
value="false"
name=":editForm:versicherungsfallJaNeinRadio" >



Deselektieren der abhängigen Buttons.

document.getElementsByName("view<portlet:namespace/>:editForm:versicherungsfallAltNeuRadio")[0].checked = false;
//This is a Browser Quirk - we only have 2 option
//In FF the indexes are 0 and 1
//In IE 0 and 2
document.getElementsByName("editForm:versicherungsfallAltNeuRadio")[0].checked = false;
document.getElementsByName("editForm:versicherungsfallAltNeuRadio")[1].checked = false;
document.getElementsByName("editForm:versicherungsfallAltNeuRadio")[2].checked = false;