twb: Array.indexOf("String") läuft in FF, nicht aber in MSIE

Liebe alle - es scheint, dass ich bei keinem meiner Webspiele ohne Hilfe von Euch Experten auskomme. Selbst das Forumsarchiv hat mir in diesem Fall nicht weitergeholfen.

Diesmal habe ich ein Master Mind geschrieben, das auf www.mah-jongg.ch/mastermind steht. Es enthält ein Skript, das mittels Array.indexOf("irgendwas") das Vorkommen eines Strings prüft. Das Problem ist in Firefox keines, weil der das Skript anstandslos ausführt und die Fehlerkonsole schweigt. Hier läuft mein Spiel anstandslos. Der MSIE will dagegen von dieser Zeile hier nichts wissen (Meldung: "Fehler auf Zeile 113; Das Objekt kennt die Eigenschaft oder Methode nicht"):

if (Array.indexOf(Anderer_Array[index])!=-1&&(...))

Ebenso problematisch ist offenbar die Zeile

Array[Array.indexOf(Anderer_Array[index])]="String";

Das ganze Skript steht auf www.mah-jongg.ch/mastermind/engine.js - was mach' ich falsch? Weshalb gaukelt mir mein Referenzbrowser Firefox vor, alles sei in Ordnung, und MSIE und Opera belehren mich eines Schlechteren?

Mit grossem Dank für kundige Hilfe, twb

  1. Der MSIE will dagegen von dieser Zeile hier nichts wissen (Meldung: "Fehler auf Zeile 113; Das Objekt kennt die Eigenschaft oder Methode nicht"):

    So sieht's aus, die funktion ist relativ neu daher auch nichts im Archiv und wird bisher soweit ich weiss nur vom FF umgesetzt. Du musst dir dazu selber eine Erweiterung schreiben, was aber in dem Fall relativ einfach ist

    if(!Array.indexOf)  
    {  
    Array.prototype.indexOf = function(el)  
    {  
        for(var i = 0; i < this.length; i++) if(el == this[i]) return i;  
    }  
    }
    

    Struppi.

    --
    Javascript ist toll (Perl auch!)
    1. hi,

      if(!Array.indexOf)

      {
      Array.prototype.indexOf = function(el)
      {
          for(var i = 0; i < this.length; i++) if(el == this[i]) return i;

      return -1;

      }
      }

        
      Dieses return sollte man vielleicht noch ergänzen, damit man auch im Nicht-Erfolgsfall einen klar definierten Rückgabewert erhält.  
      (Ich nehme an, beim nativ implementierten Array.indexOf dürfte der auch -1 lauten, analog zu ähnlichen Methoden?)  
        
      gruß,  
      wahsaga  
        
      
      -- 
      /voodoo.css:  
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      
      1. Dieses return sollte man vielleicht noch ergänzen, ...

        natürlich.

        Struppi.

        --
        Javascript ist toll (Perl auch!)
      2. Hallo wahsaga.

        if(!Array.indexOf)

        {
        Array.prototype.indexOf = function(el)
        {
            for(var i = 0; i < this.length; i++) if(el == this[i]) return i;
             return -1;
        }
        }

        
        >   
        > Dieses return sollte man vielleicht noch ergänzen, damit man auch im Nicht-Erfolgsfall einen klar definierten Rückgabewert erhält.  
        > (Ich nehme an, beim nativ implementierten Array.indexOf dürfte der auch -1 lauten, analog zu ähnlichen Methoden?)  
          
        [Exakt](http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf).  
          
          
        Einen schönen Mittwoch noch.  
          
        Gruß, Mathias  
        
        -- 
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)  
          
        debian/rules
        
        1. hi,

          Exakt.

          Und da dort noch ein optionaler fromIndex erwähnt wird, könnte man die Methode auch noch dazu kompatibel erweitern:

          if(!Array.indexOf)  
          {  
            Array.prototype.indexOf = function(el, fromIndex)  
            {  
              // fromIndex  
              // The index at which to begin the search. Defaults to 0, i.e. the whole array will be searched.  
              if(!fromIndex) { var fromIndex = 0; }  
            
              // If negative, it is taken as the offset from the end of the array.  
              // Note that even when the index is negative, the array is still searched from front to back.  
              // If the calculated index is less than 0, the whole array will be searched.  
              else if(fromIndex < 0) {  
                fromIndex += this.length;  
                if(fromIndex < 0) { fromIndex = 0; }  
              }  
            
              // If the index is greater than or equal to the length of the array, -1 is returned, i.e. the array will not be searched.  
              else if(fromIndex >= this.length) { return -1; }  
            
              for(var i = fromIndex; i < this.length; i++) { if(el == this[i]) { return i; } }  
              return -1;  
            }  
          }
          

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. hi,

            Und da in der Mozilla Core JavaScript 1.5 Reference noch gesagt wird,
            "indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator)",
            passen wir den Vergleich auch noch an [1]:

            for(var i = fromIndex; i < this.length; i++) { if(el === this[i]) { return i; } }

            [1] === können aktuelle IE doch auch, oder?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. hi,

              Und da in der Mozilla Core JavaScript 1.5 Reference noch gesagt wird,
              "indexOf compares searchElement to elements of the Array using strict equality (the same method used by the ===, or triple-equals, operator)",
              passen wir den Vergleich auch noch an [1]:

              for(var i = fromIndex; i < this.length; i++) { if(el === this[i]) { return i; } }

              so!
              Dann ist jetzt meine Schusseligkeit komplett behoben ;-)
              Ich hab's übernommen.

              [1] === können aktuelle IE doch auch, oder?

              Meines Wissens auch ältere.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Hi,

                [1] === können aktuelle IE doch auch, oder?
                Meines Wissens auch ältere.

                ja. Ältere IEs (zumindest 5.0, bei 5.5 bin ich gerade nicht sicher) haben allerdings Probleme mit dem 'in'-Operator: Dieser wird zwar bei 'for'-Schleifen unterstützt, nicht aber bei Prüfungen der Art 'if (foo in object)'.

                Das hat zwar nichts mit dem Problem zu tun, ist aber in diesem Zusammenhang vielleicht für jemanden interessant :-)

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. Hallo Cheatah.

                  [1] === können aktuelle IE doch auch, oder?
                  Meines Wissens auch ältere.

                  ja. Ältere IEs (zumindest 5.0, bei 5.5 bin ich gerade nicht sicher) haben allerdings Probleme mit dem 'in'-Operator: Dieser wird zwar bei 'for'-Schleifen unterstützt, nicht aber bei Prüfungen der Art 'if (foo in object)'.

                  Das hat zwar nichts mit dem Problem zu tun, ist aber in diesem Zusammenhang vielleicht für jemanden interessant :-)

                  Ja und zwar insofern, dass mir diese Anwendung des in-Operators bisher gänzlich unbekannt war.

                  Einen schönen Mittwoch noch.

                  Gruß, Mathias

                  --
                  ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
                  debian/rules
          2. Hallo wahsaga.

            Exakt.

            Und da dort noch ein optionaler fromIndex erwähnt wird, könnte man die Methode auch noch dazu kompatibel erweitern:

            … und das Rad neu erfinden.

            Einen schönen Mittwoch noch.

            Gruß, Mathias

            --
            ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
            debian/rules
    2. if(!Array.indexOf)  
      {  
      Array.prototype.indexOf = function(el)  
      {  
          for(var i = 0; i < this.length; i++) if(el == this[i]) return i;  
      }  
      }
      

      Ihr seid ja wirklich unglaublich. Erstens bin ich, trotz mittlerweile dreier DHTML-Webspiele, nach wie vor ein Dummie (wie ich u.a. hier immer wieder zu lesen bekomme, wenn ich statt DOM immer noch mit dem praktischen .innerHTML rumhantiere), zweitens hab' ich von Prototyping nach wie vor nicht die leiseste Ahnung (Nachholbedarf, jaja, ich weiss), und drittens - nun ja, klar: Struppis/wahsagas Lösung läuft auf Anhieb, klaglos und perfekt. War ja eigentlich nicht anders zu erwarten. :-)

      www.mah-jongg.ch/mastermind läuft jetzt reibungslos auf MSIE, und ich denke, auch Opera wird nichts mehr dagegen haben. Mit einem so recht bernischen Riesenmerci, twb

    3. gruss Struppi,

      ich muss mal den korinthenkacker spielen,
      natuerlich nur fuer das archiv, und weil es
      eben doch auf ein paar feinheiten ankommt:

      ... Du musst dir dazu selber eine Erweiterung schreiben,
      was aber in dem Fall relativ einfach ist

      if(!Array.indexOf)

      hier begehst Du zwei unvorsichtigkeiten auf einmal, indem
      Du pruefst, ob ein *objekt* [indexOf] fuer das objekt [[Array]]
      implementiert ist.
      eigentlich willst Du wissen, ob eine gleichnamige *methode*
      fuer das *[prototype]*-objekt von [[Array]] existiert.

      die abfrage auf das generische (statisch im klassenkontext)
      Array.indexOf kollidiert bis jetzt zwar nirgendwo mit der
      gleichlautenden prototypenmethode, da im moment nur
      geckos sowohl die generischen [[Array]]-methoden als
      auch die gleichnamigen prototypischen erweiterungen im
      zuge von JavaScript 1.6 eingepflanzt bekommen haben -
      dennoch gibt es den von mir nicht ganz an den haaren
      herbeigezogenen fall, dass eine auf Deine art geschriebene
      bibliothek im zusammenspiel mit den scripten anderer bei
      einem weniger versierten dritten nicht genau das ergebnis
      liefert, welches sich der letztgenannte vorgestellt haben
      mochte ...

      ... und deswegen dann doch lieber so:

      if (typeof Array.prototype.indexOf != "function") {  
        
        Array.prototype.indexOf = function (obj) {/*  
        
          code;*/  
        };  
      }
      

      so long - peterS. - pseliger@gmx.net

      --
      »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
      Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
      ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
  2. Hallo,

    Das ganze Skript steht auf www.mah-jongg.ch/mastermind/engine.js - was mach' ich falsch? Weshalb gaukelt mir mein Referenzbrowser Firefox vor, alles sei in Ordnung, und MSIE und Opera belehren mich eines Schlechteren?

    Weil Mozilla genauso wie Microsoft proprietäre Objekte einbaut (»JavaScript 1.6«, »JavaScript 1.7«), die nirgendwo standardisiert und von den anderen Browsern nicht unterstützt werden, weil die nicht einfach jede unabgestimmte Bewegung anderer Browserhersteller mitmachen.

    Mathias

  3. gruss twb,

    ... Selbst das Forumsarchiv hat mir in diesem Fall nicht weitergeholfen.

    dann musst Du nur weit genug zurueck und/oder spezifischer suchen?

    +JavaScript +Array.indexOf

    und fuer array-iteratoren gerne auch so:

    +JavaScript +Array +iterator +methode

    zur bekraeftigung dessen, was Mathias schon sagte:
    http://developer.mozilla.org/en/docs/New_in_JavaScript_1.6

    und weil ich ohne eigenwerbung nicht auskomme, vor urzeiten
    das letzte mal for (var i=0; i<arr.length; ++i) {...;} geschrieben
    habe, dies hoechst elegant finde und am liebsten haette, wenn
    alle nur noch mit iteratoren arbeiteten, moechte ich die letzten
    links streuen:

    jsApi.Array.mozExtensions.dev.js
    jsApi.Array.mozExtensions.js

    jsApi.Array.mozGenerics.dev.js
    jsApi.Array.mozGenerics.js

    so long - peterS. - pseliger@gmx.net

    --
    »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
    Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
    ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]