kostenloser Webspace werbefrei: lima-city


Probleme mit Javascript in IE 9

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    tropa-graciosa

    tropa-graciosa hat kostenlosen Webspace.

    Hiho,

    in jedem Browser funktioniert mein Javascript, im IE 9 auch, aber sobald ich die Seite innerhalb eines iframes (die Seite wird eingebettet wegen der .de.ki-Domain) im IE 9 aufrufe, funktioniert das Javascript nicht mehr ...

    Es handelt sich um folgendes Javascript (verkürzt, vollständige Version auf der Website im Quelltext zu sehen):

    function suchecharfilter(){
    var stufe0 = document.getElementsByClassName('stufe0'); var e=0;
    for(i=0;i<stufe0.length;i++) {
    if((e!=0 && e>=document.filtersuche.charfiltera.value && e<=document.filtersuche.charfilterb.value) || (e==0 && document.filtersuche.charfilterc.checked==true)){
    stufe0[i].style.display = '';
    }
    else{
    stufe0[i].style.display = 'none';
    }
    }
    }


    Meine Website: http://www.helden-von-minas-tirith.de.ki

    Sucht mal nach "a o" (ohne Anführungsstriche und mit Leerzeichen dazwischen), dann werdet auch ihr ein paar Charaktere finden, aber im IE 9 (in allen anderen Browsern gehts) nicht filtern können.

    Meine Frage ist nun: Was ist an dem Script falsch bzw. wie bekomme ich es im IE 9 zum Laufen, wenn die Seite in dem iframe (der eigentlich nichts mit dem JS zu tun hat) einbettet ist?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Also kann ich bestätigen im FF funktioniert es nicht. Wie funktioniert deine Suche? Speicherst du den Query in eine Variable in JS und rufst die dann iwie über AJAX auf? Erzähl ein bisschen mehr, wie die Suche genau funktionieren soll, dann können wir dir mit sicherheit helfen :angel:
    Übrigens schönes Design (wenn es selbst gemacht ist) :wave:
  4. Autor dieses Themas

    tropa-graciosa

    tropa-graciosa hat kostenlosen Webspace.

    Jop, das Design ist selbstgemacht.

    Zuerst werden alle Charaktere ausgegeben:

    $chars.="<span class='stufe$stufe'><span class='klasse$row->Klasse'>";
    if($stufe=="0"){
    $stufe="??";
    }
    if($klasse=="0"){
    $klasse="";
    }
    $chars.="<br><a href='?site=profil&amp;id=$row->UserID'>$row->Name</a> - Stufe $stufe $rasse $klasse$rassea$rolle$beruf</span></span>";


    echo $chars;


    Und dann per Javascript jeweils die versteckt (display='none'), die nicht auf die Filtereinstellungen zutreffen. Das javascript habe ich ja bereits gepostet, in voller Länge ist es auch der Website nachzulesen.

    Im Firefox funktioniert es bei mir ....
  5. Hi,

    ich habe deine Seite nur mal kurz überflogen, aber eines ist mir sofoert aufgefallen, warum zur Hölle hast du da eine 762 Zeilen lange funktion drin, in der ein Inhalt steht, den man ganz elegant in 2 for-Schleifen fassen kann?

    Außerdem was ist document.filtersuche? Das ist richtig schlechter Stil, weil man ihn später nicht gut zurückverfolgen kann!
    Verwende stattdessen eindeutige Bezeichner (id="filtersuche") um die Elemente für JS zugänglich zu machen.

    Insgesamt ist dein Code sehr schlecht zu warten, da solltest du dir etwas mehr Gedanken drüber machen.

    Um dir zumindest mal eine Hilfestellung zu geben habe ich mal die Megafunktion zusammengekürzt und Performanceoptimiert, allerdings bin ich mir nicht sicher, dass ich alles richtig umgesetzt habe, da dein code echt komisch zu lesen war (ich hab mir nur die ersten 11 Zeilen, sowie die letzten 10 angesehen und daraus das folgende geschriebn.):
    var sucheCharfilter = function(){
        var d = document,
            e = 65,
            // verwende besser eine ID statt nach dem Namen zu suchen
            a = d.getElementsByName('charfiltera')[0].value,
            b = d.getElementsByName('charfilterb')[0].value,
            stufe, i;
        for(;e--;){
            stufe = d.getElementsByClassName('stufe'+e);
            if((e==0&&!c)||e<a||e>b){
                for(i=stufe.length;i--;){
                    stufe[i].style.display = 'none';
                }
            }
        }
        for(e=9;e--;){
            stufe = d.getElementsByClassName('klasse'+e);
            a = d.getElementsByName('filterklasse'+e)[0];
            if(!a.checked){
                for(i=stufe.length;i--;){
                    stufe[i].style.display = 'none';
                }
            }
        }
    }


    Außerdem, ist dir bewusst das aktuelle IE das hier gar nicht beherschen:
    document.getElementsByClassName('htmlKlasse');?
    Der braucht dafür nähmlich einen Nachbau.

    Ich würde sagen du solltest dir erstmal deinen Code genauer ansehen und vor allem gucken, was der IE davon überhaupt versteht. Weiter ist dein Code so schwer zu warten, das sich dadurch leicht Fehler einschleichen.
    Wenn du diese Punkte abgearbeitet hast, kannst du dich gerne wieder an mich wenden.

    Mit freundlichen Grüßen

    Beitrag zuletzt geändert: 19.1.2011 0:33:48 von nemoinho
  6. Autor dieses Themas

    tropa-graciosa

    tropa-graciosa hat kostenlosen Webspace.

    Das mit der for-Schleife, so wie du es vorgeschlagen hast, habe ich auch zuerst probiert und bin verzweifelt. Also habe ich mir die funktion per php erstellen lassen.

    document.filtersuche ist das entsprechende Formular.

    Außerdem, ist dir bewusst das aktuelle IE das hier gar nicht beherschen:
    document.getElementsByClassName('htmlKlasse');?


    Hmm, hat aber funktioniert ... (siehe erster Post)

    Der braucht dafür nähmlich einen Nachbau.


    Was für einen Nachbau?
  7. Die for-Schleife ist nicht das Problem, nur diese if-Abfrage ist etwas tricky, abgesehen davon ist mir eben noch ein kleiner Performancefehler aufgefallen, den ich jetzt auch beseitigt habe.

    Nun aber zu den anderen Punkten:

    Ich weiß, dass document.filtersuche und so weiter irgendwelche Elemente im HTML sind, aber die Auszeichnung ist trotzdem mist, denn sobald du mehrere Elemente mit dem selben Namen hast wird dasraus eine Domnodelist statt eines Domnode.
    Außerdem ist die andere Variante einfach leserlicher => besserer Stil.

    Im IE 9 funktioniert das, weil die Jungs aus Redmont sich zur Abwechslung wenigstens mal ein wenig Mühe gemacht haben (auch wenn die JS-Engine immernoch scheiße ist). Aber in allen anderen IEs gibts Probleme und die brauchen einen Nachbau, alá
    if(!document.getElementsByTagName){
        document.getElementsByTagName = function(s){
            s = ' '+s+' ';
            var x = document.getElementsByTagName('*'),
                i = x.length,
                ret = [];
            for(;i--;){
                if((' '+x[i].className+' ').indexOf(s)!=-1){
                    ret.push(x[i]);
                }
            }
            ret.reverse();
            return ret;
        }
    }
    Das ist zwar kein besonders gutes Beispiel dafür, aber es sollte funktionieren.

    Mit freundlichen Grüßen
  8. Autor dieses Themas

    tropa-graciosa

    tropa-graciosa hat kostenlosen Webspace.

    Danke, mit deiner Funktion geht es auch im IE 8 (bzw. im IE 9, der im IE 8-Modus ist). Gleiches gilt für den IE 7.

    Da ich diese Modi in den Entwicklertools fand, denke ich mal, dass sich der Browser im jeweiligen Modus so verhält wie das Original, also wie IE 7 bzw. 8.

    ABER:

    Es klappt immer noch nicht, wenn die Seite innerhalb des iframes der .de.ki-Domain aufgerufen wird (also der iframe von der Weiterleitung.) Dann kommt keine Fehlermeldung, das Script wird aber auch nicht ausgeführt.

    Ist das ein Bug von IE 9 oder habe ich irgendwas falsch gemacht?

    Kann das mal bitte jemand testen, der den IE 8 oder 7 noch hat?

    Achja, die Funktion habe ich noch nicht verkürzt, die ist immer noch so lang, aber ich habe das hier bereits eingefügt:

    if(!document.getElementsByTagName){
        document.getElementsByTagName = function(s){
            s = ' '+s+' ';
            var x = document.getElementsByTagName('*'),
                i = x.length,
                ret = [];
            for(;i--;){
                if((' '+x[i].className+' ').indexOf(s)!=-1){
                    ret.push(x[i]);
                }
            }
            ret.reverse();
            return ret;
        }
    }


    Das mit dem Verkürzen hol ich irgendwann nach, wenn ich mit dem Rest fertig bin ^^
  9. als quick fix würde ich empfehlen die frames aufzubrechen, dabei wird halt direkt auf deine Seite weitergeleitet:
    <script type="text/javascript">
    /*<![CDATA[*/if(top!=self)top.location=self.location;/*]]>*/
    </script>


    auch nachzulesen unter http://nemoinho.kilu.de/#show_faq_1

    Allerdings sieht man dann halt die reale Adresse … dass musst du sehen ob das eine Alternative ist.
    Ansonsten kann ich dein Problem nicht so ganz reproduzieren, da ich Linux benutze und dort nur Browser funktionieren. Und keine MS-Internet-Zugriffs-Programme (ein bisschen bashen muss sein :wink:)

    Und die verkürzte Form müsstest du halt mal ausprobieren, die älteren IEs haben nämlich tatsächlich ein paar Probleme damit.
    Als Beispiel will ich da mal die Adressleitse anführen, denn da kann man JS ja auch einfügen (mittels javascript:alert('Hi'); oder javascript:(function(){var hi='hello'; alert(hi);})()) das Funktioniert auch überall problemlos, nur im IE nicht, denn der akzeptiert es nicht, wenn in der Adressleiste mehr als 255 Zeichen stehen.

    Wie gesagt, das erste wäre nen quickfix und für alles weitere bin ich hier "unzureichend" ausgestattet.

    Mit freundlichen Grüßen
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!