Archive for the ‘jQuery’ Category.

kein Rückgabe Wert bei $.ajax im Safari

Wenn $.ajax und $.post NUR im Safari keinen Wert zurückliefern, kann es am Pfad liegen. Ich habe das ganze über http://www.domain.de/pfad/zu/ajax.php aufgerufen - das klappte im Firefox gut, im Safari nicht. Mit /pfad/zu/ajax.php klappte es dann aber!

contentflow – Bilder werden nicht angezeigt

ContentFlow ist ein ganz nettes tool, allerdings ist die Version 1.0.2 offenbar nicht ganz ausgereift. Ich hab festgestellt, dass öfter Bilder "verschwinden", es werden einfach nicht alle Bilder angezeigt sondern ein leeres DIV. Das Bild wird nach dem nächsten refresh wieder nromal geladen, dafür kanns sein dass ein anderes nicht mehr sichtbar ist. Das war für mich natürlich untragbar, aber nach kurzer Recherche habe ich festgestellt, dass eine alte Version gut funktioniert:

ContentFlow 1.0.0

Transparente PNGs haben im IE7/IE8 plötzlich einen schwarzen Rand

Dass der Internet Explorer 6 mit Transparenzen nicht so gut klarkommt, ist mir schon lange klar. Aber heute war ich sehr erstaunt, als meine PNGs im IE8 auf einmal schwarze Ränder hatten.

Offenbar liegt das an jquery... sobald man mit transparenzen oder hide/show arbeitet, kann das passieren. Ich hatte das Problem bisher nur bei Projekten, wo es eh schon stressig war, deshalb hatte ich nie wirklich Zeit, das Problem genauer zu recherchieren und eine praktikable Lösung zu finden. Ich habe mir bisher damit beholfen, die Bilder doch als jpg abzuspeichern oder die PNGs im 8-bit-Modus zu speichern. Oder, wenn das beides nichts gebracht hat, mir Alternativen zu den jquery Funktionen erlaubt.

IE7 und jQuery

Ich weiß ja, dass IE immer gerne rumzickt. Aber das war doch mal wieder ein Highlight. Ich hatte ein Formular erstellt mit diversen Formularfeldern:

  1. <div class="label">Marke:</div>
  2. <select name="marke" id="marke"><option value=""></option><option value="m1">Marke1</option><option value="m2">Marke2</option></select>
  3. <div class="label">Geschäft:</div>
  4. <input type="text" name="geschaeft" id="sf_geschaeft" value="" />
  5. <div class="label">Ort:</div>
  6. <select name="ort" class="sf_ort" id="sf_ort"><option value=""></option><option value='1'>Salzburg</option><option value='2'>Innsbruck</option></select>

Die ausgewählten Werte dieser Felder woltle ich dann mittels jQuery auslesen.

  1. shopname = $('#sf_geschaeft').val();
  2. brand = $('#marke option:selected').val();
  3. ort = $('#sf_ort option:selected').val();

Hat bei "marke" auch geklappt, aber bei Ort wollte IE7 dann plötzlich nicht mehr: "das Objekt unterstützt die Eigenschaft oder Methode nicht". WTF? Es sind zwei Selects, warum liest jQuery eins und das andere nicht? Zuerst hatte ich die Vermutung, dass IE7 irgendwie nicht damit klarkommt, dass Ort den gleichen Klassennamen wie ID hat - aber auch nach dem Ändern dieses Zustands wollte IE7 mir den Ort einfach nicht auslesen.

Nach einer relativ langen Recherche bin ich auf die Seite jQuery Fallen im Internet Explorer gestoßen, die mir zweifellos noch mehr Suche erspart hat. Offenbar ist IE7 eine weitaus launischere Diva als ich dachte. Hin und wieder - und völlig willkürlich, wie es scheint - möchte die Diva, dass man die Variablen vorher definiert. Ich hätt's beinah gar nicht erst probiert, weils mir so absurd erschien. Dann hab ichs glücklicherweise doch versucht und - siehe da! - auf einmal motzt auch der IE7 nicht mehr:

  1. var ort;
  2. shopname = $('#sf_geschaeft').val();
  3. brand = $('#marke option:selected').val();
  4. ort = $('#sf_ort option:selected').val();

Ich bin noch nicht sicher, ob ich lachen oder weinen soll über dieses merkwürdige Verhalten... Aber wer immer noch IE7 nutzt is eigentlich eh selber schuld...

jquery waterwheel carousel

Ich brauchte ein jquery plugin, das mir diverse bilder in rotiert. Das jquery waterwheel carousel war schon ziemlich perfekt für meine Zwecke und ich kann es eigentlich nur jedem empfehlen. Ich musste für meine Zwecke noch zwei kleine Änderungen machen:

1. das carousel verarbeitet nur images, ich brauchte allerdings unbedingt dieselbe Funktionalität für divs (mit Bildern als Hintergrundbild).

Lösung: im Quellcode wird direkt nach Bildern gesucht. Man muss also überall nur nach .find('img') suchen und dies durch .find('div') bzw. find('div.klassenname') ersetzen. Das ganze funktionierte dann zuerst nicht mehr in Chrome, das lag an der preload Funktion. Da es sich um Hintergrundbilder handelt und ich nicht weiß, wie man die vorlädt, habe ich das ganze einfach auskommentiert:

  1. function preload(callback) {
  2.         callback();
  3. }

Das wars schon. Dann spielt auch Chrome das Spiel mit.

2. das carousel kann immer nur um ein item weiterscrollen, ich brauchte aber die Möglichkeit, mit jedem Klick um 3 Items weiterzuscrollen.

Die Pfeile werden mit einer Funktion namens moveOnce belegt. Um nun nicht ein Item weiterzuscrollen sondern drei, habe ich mir eine neue Funktion moveThrice geschrieben:

  1.      function moveThrice(direction) {
  2.         var currentCenterIndex = data.currentCenterItem.data().index;
  3.         if ((currentCenterIndex < 3 && direction === true) || (currentCenterIndex > (data.totalItems-3) && direction === false)) {
  4.           clearTimeout(data.autoPlayTimer);
  5.           if (options.edgeReaction === 'reset') {
  6.             rotateCarousel(!direction,data.totalItems-1);
  7.           } else if (options.edgeReaction === 'reverse' && options.autoPlay !== 0) {
  8.             rotateCarousel(!direction,3);
  9.             options.autoPlay *= -1;
  10.           }else{
  11.                 if(direction == true){
  12.                         new_number = currentCenterIndex;
  13.                 }else{
  14.                         new_number = data.totalItems - currentCenterIndex - 1;
  15.                 }  
  16.                 rotateCarousel(direction, new_number);
  17.           }
  18.         } else {
  19.           rotateCarousel(direction,3);
  20.         }
  21.       }

jquery lightbox – Höhe im IE

So hübsch die jquery lightbox auch ist, bei mir wollte sie mit dem Standard Stylesheet im Internet Explorer nicht die richtige Höhe annehmen. Kleiner CSS Fix für das Problem:

  1. #jquery-overlay {
  2. position: absolute;
  3. top: 0;
  4. left: 0;
  5. z-index: 90;
  6. width: 100%;
  7. height: 500px;
  8. background-color: #000;
  9. filter:alpha(opacity=60);
  10. moz-opacity: 0.6;
  11. opacity: 0.6;
  12. }
  13.  
  14. body >#jquery-overlay {
  15. position: fixed;
  16. top: 0;
  17. left: 0;
  18. }

Zugreifen auf opener mit jquery

Um mit jquery auf das opener Fenster zuzugreifen geht man so vor:

  1. $( '#inhaltsdiv', window.opener.document ).html( 'test');

Damit wird in das div "inhaltsdiv" im opener Fenster der Text "test" reingeschrieben.

Nicht schwer, aber merken werd ichs mir nicht können und wenn man sich das googeln ersparen kann...

Bilder auf die gesamte Seite ausdehnen

Es kam jetzt schon öfter vor, dass ich Bilder auf die gesamte Seite ausdehnen musste. Und nun hab ich ein sehr hilfreiches jquery plugin dazu entdeckt:

supersized

Das Ding ist großartig und damit gehts wirklich schnell:

1. die js und css Dateien einbinden:

  1. <link rel="stylesheet" href="css/supersized.css" type="text/css" media="screen">
  2. <script type="text/javascript" src="js/jquery.js"></script>  
  3. <script type="text/javascript" src="js/effects.core.js"></script>
  4. <script type="text/javascript" src="js/effects.slide.js"></script>
  5. <script type="text/javascript" src="js/supersized.3.0.js"></script>

2. das DIV mit den Bildern im body erstellen:

  1. <div style="width: 1036px; height: 777px; display: block;" id="supersized">
  2. <a style="width: 1683px; height: 1141px; left: 0px; top: -100px;" href="">
  3.   <img src="img/100.jpg">
  4. </a>
  5. <a style="width: 1000px; height: 500px; left: 0px; top: -100px;" href="">
  6.   <img src="img/200.jpg">
  7. </a>
  8. </div>

3. die Funktion aufrufen:

  1. $(function(){
  2.         $.fn.supersized.options = {
  3.                 startwidth: 640,
  4.                 startheight: 480,
  5.                 vertical_center: 1,
  6.                 slideshow: 1,
  7.                 navigation: 1,
  8.                 thumbnail_navigation: 1,
  9.                 transition: 1, //0-None, 1-Fade, 2-slide top, 3-slide right, 4-slide bottom, 5-slide left
  10.                 pause_hover: 0,
  11.                 slide_counter: 1,
  12.                 slide_captions: 1,
  13.                 slide_interval: 3000,
  14.                 slides : [
  15.                         {image : 'img/100.jpg', title : 'Name1', url : 'img/100.jpg'},
  16.                         {image : 'img/200.jpg', title : 'Name2', url : 'img/200.jpg'}
  17.                 ]
  18. };
  19. $('#supersized').supersized();

jsTree – Node öffnen

Nachdem ich letztens open_all benutzt habe, weil ich das mit dem Öffnen einzelner Nodes nicht hinbekommen habe, musste ichs heute nochmal recherchieren und habe jetzt die Lösung um einen Ast meines Trees zu öffnen:

  1. $("#treenav").jstree("open_node", $("#Inhalte"));

Inhalte ist die ID des Listenelements, das ich öffnen möchte.

jsTree die Erste

Aus gegebenem Anlass beschäftige ich mich grade mit jsTree. Ich glaub, das kann ziemlich viel, allerdings find ich die Doku etwas dürftig. Aber da es sich um JavaScript handelt, hab ich damit weit weniger Probleme als mit der Doku von, sagen wir mal, Typo3.

1. Wie erstelle ich einen jsTree ?
Zuerst baue ich mir im HTML eine einfache Liste

  1. <div id="treenav">
  2.  <ul>
  3.   <li id="Inhalte" rel="basis"><a href="">Inhalte</a>
  4.    <ul>
  5.     <li rel="seite"><a href="">Seiten</a></li>
  6.     <li rel="news"><a href="">News</a></li>
  7.    </ul>
  8.   </li>
  9.   <li id="Benutzerverwaltung" rel="basis"><a href="">Benutzerverwaltung</a>
  10.    <ul>
  11.     <li rel="benutzer"><a href="">Benutzer</a></li>
  12.    </ul>
  13.   </li>
  14.  </ul>
  15. </div>

Anschließend initalisiere ich den Tree

  1. $('#treenav').jstree({
  2.         "themes" : {
  3.                 "theme": "classic",
  4.                 "dots" : false
  5.         },
  6.         "types": {
  7.                 "types" : {
  8.                         "basis" : {     "icon" : { "image" : "_drive.png"} },
  9.                         "seite" : {     "icon" : { "image" : "icon_seite.png"} },
  10.                         "news" : {      "icon" : { "image" : "icon_news.png"} }
  11.                 }
  12.         },
  13.         "plugins" : [ "themes", "html_data", "types" ]
  14. });

Mit "types" definiere ich die Node Typen und kann so für einzelne Listeneinträge unterschiedliche Icons definieren.

2. Wie sorge ich dafür, dass gleich alles aufgeklappt ist ?
Nun wollte ich noch, dass der Tree gleich komplett aufgeklappt ist und das geht so:

  1. $("#treenav").jstree("open_all");



Mehr Einträge zu jsTree werden sicher noch folgen.... :)