christian: JavaScript für die neusten Browser (NS7 und FF1)

hi,

ich hatte schon mal kurz gefragt, warum das js in den browsern nicht geht -> weil die scripte zu alt sind.

ich habe das problem, dass gerne ein javascript menue von dreamweaver erstellen lassen wollte, aber das script schein zu alt für die neusten browser zu sein. geht wohl nur bis NS6. ich schreibe euch hier mal den code für ein einfaches "drag layer", das der dreamweaver erstellt. könnt ihr da evtl. ersehen, was ich da ändern muss, damit er auch NS7 und FF berücksichtigt? das würde mir dann um einiges weiterhelfen. bin nicht mehr so frisch mit JS ;-) wenn es im NS7 funktiniert, dann sollte ja auch im FF gehen. danke schon mal für alle hinweise.

cu christian


<script language="JavaScript" type="text/JavaScript"> <!-- function MM_reloadPage(init) {  //reloads the window if Nav4 resized   if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {     document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}   else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload(); } MM_reloadPage(true);

function MM_findObj(n, d) { //v4.01   var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {     d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}   if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];   for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);   if(!x && d.getElementById) x=d.getElementById(n); return x; }

function MM_dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL,cR,targL,targT,tol,dropJS,et,dragJS) { //v4.01   //Copyright 1998 Macromedia, Inc. All rights reserved.   var i,j,aLayer,retVal,curDrag=null,curLeft,curTop,IE=document.all,NS4=document.layers;   var NS6=(!IE&&document.getElementById), NS=(NS4||NS6); if (!IE && !NS) return false;   retVal = true; if(IE && event) event.returnValue = true;   if (MM_dragLayer.arguments.length > 1) {     curDrag = MM_findObj(objName); if (!curDrag) return false;     if (!document.allLayers) { document.allLayers = new Array();       with (document) if (NS4) { for (i=0; i<layers.length; i++) allLayers[i]=layers[i];         for (i=0; i<allLayers.length; i++) if (allLayers[i].document && allLayers[i].document.layers)           with (allLayers[i].document) for (j=0; j<layers.length; j++) allLayers[allLayers.length]=layers[j];       } else {         if (NS6) { var spns = getElementsByTagName("span"); var all = getElementsByTagName("div");           for (i=0;i<spns.length;i++) if (spns[i].style&&spns[i].style.position) allLayers[allLayers.length]=spns[i];}         for (i=0;i<all.length;i++) if (all[i].style&&all[i].style.position) allLayers[allLayers.length]=all[i];     } }     curDrag.MM_dragOk=true; curDrag.MM_targL=targL; curDrag.MM_targT=targT;     curDrag.MM_tol=Math.pow(tol,2); curDrag.MM_hLeft=hL; curDrag.MM_hTop=hT;     curDrag.MM_hWidth=hW; curDrag.MM_hHeight=hH; curDrag.MM_toFront=toFront;     curDrag.MM_dropBack=dropBack; curDrag.MM_dropJS=dropJS;     curDrag.MM_everyTime=et; curDrag.MM_dragJS=dragJS;     curDrag.MM_oldZ = (NS4)?curDrag.zIndex:curDrag.style.zIndex;     curLeft= (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;     if (String(curLeft)=="NaN") curLeft=0; curDrag.MM_startL = curLeft;     curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;     if (String(curTop)=="NaN") curTop=0; curDrag.MM_startT = curTop;     curDrag.MM_bL=(cL<0)?null:curLeft-cL; curDrag.MM_bT=(cU<0)?null:curTop-cU;     curDrag.MM_bR=(cR<0)?null:curLeft+cR; curDrag.MM_bB=(cD<0)?null:curTop+cD;     curDrag.MM_LEFTRIGHT=0; curDrag.MM_UPDOWN=0; curDrag.MM_SNAPPED=false; //use in your JS!     document.onmousedown = MM_dragLayer; document.onmouseup = MM_dragLayer;     if (NS) document.captureEvents(Event.MOUSEDOWN|Event.MOUSEUP);   } else {     var theEvent = ((NS)?objName.type:event.type);     if (theEvent == 'mousedown') {       var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;       var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;       var maxDragZ=null; document.MM_maxZ = 0;       for (i=0; i<document.allLayers.length; i++) { aLayer = document.allLayers[i];         var aLayerZ = (NS4)?aLayer.zIndex:parseInt(aLayer.style.zIndex);         if (aLayerZ > document.MM_maxZ) document.MM_maxZ = aLayerZ;         var isVisible = (((NS4)?aLayer.visibility:aLayer.style.visibility).indexOf('hid') == -1);         if (aLayer.MM_dragOk != null && isVisible) with (aLayer) {           var parentL=0; var parentT=0;           if (NS6) { parentLayer = aLayer.parentNode;             while (parentLayer != null && parentLayer.style.position) {               parentL += parseInt(parentLayer.offsetLeft); parentT += parseInt(parentLayer.offsetTop);               parentLayer = parentLayer.parentNode;           } } else if (IE) { parentLayer = aLayer.parentElement;             while (parentLayer != null && parentLayer.style.position) {               parentL += parentLayer.offsetLeft; parentT += parentLayer.offsetTop;               parentLayer = parentLayer.parentElement; } }           var tmpX=mouseX-(((NS4)?pageX:((NS6)?parseInt(style.left):style.pixelLeft)+parentL)+MM_hLeft);           var tmpY=mouseY-(((NS4)?pageY:((NS6)?parseInt(style.top):style.pixelTop) +parentT)+MM_hTop);           if (String(tmpX)=="NaN") tmpX=0; if (String(tmpY)=="NaN") tmpY=0;           var tmpW = MM_hWidth;  if (tmpW <= 0) tmpW += ((NS4)?clip.width :offsetWidth);           var tmpH = MM_hHeight; if (tmpH <= 0) tmpH += ((NS4)?clip.height:offsetHeight);           if ((0 <= tmpX && tmpX < tmpW && 0 <= tmpY && tmpY < tmpH) && (maxDragZ == null               || maxDragZ <= aLayerZ)) { curDrag = aLayer; maxDragZ = aLayerZ; } } }       if (curDrag) {         document.onmousemove = MM_dragLayer; if (NS4) document.captureEvents(Event.MOUSEMOVE);         curLeft = (NS4)?curDrag.left:(NS6)?parseInt(curDrag.style.left):curDrag.style.pixelLeft;         curTop = (NS4)?curDrag.top:(NS6)?parseInt(curDrag.style.top):curDrag.style.pixelTop;         if (String(curLeft)=="NaN") curLeft=0; if (String(curTop)=="NaN") curTop=0;         MM_oldX = mouseX - curLeft; MM_oldY = mouseY - curTop;         document.MM_curDrag = curDrag;  curDrag.MM_SNAPPED=false;         if(curDrag.MM_toFront) {           eval('curDrag.'+((NS4)?'':'style.')+'zIndex=document.MM_maxZ+1');           if (!curDrag.MM_dropBack) document.MM_maxZ++; }         retVal = false; if(!NS4&&!NS6) event.returnValue = false;     } } else if (theEvent == 'mousemove') {       if (document.MM_curDrag) with (document.MM_curDrag) {         var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft;         var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop;         newLeft = mouseX-MM_oldX; newTop  = mouseY-MM_oldY;         if (MM_bL!=null) newLeft = Math.max(newLeft,MM_bL);         if (MM_bR!=null) newLeft = Math.min(newLeft,MM_bR);         if (MM_bT!=null) newTop  = Math.max(newTop ,MM_bT);         if (MM_bB!=null) newTop  = Math.min(newTop ,MM_bB);         MM_LEFTRIGHT = newLeft-MM_startL; MM_UPDOWN = newTop-MM_startT;         if (NS4) {left = newLeft; top = newTop;}         else if (NS6){style.left = newLeft; style.top = newTop;}         else {style.pixelLeft = newLeft; style.pixelTop = newTop;}         if (MM_dragJS) eval(MM_dragJS);         retVal = false; if(!NS) event.returnValue = false;     } } else if (theEvent == 'mouseup') {       document.onmousemove = null;       if (NS) document.releaseEvents(Event.MOUSEMOVE);       if (NS) document.captureEvents(Event.MOUSEDOWN); //for mac NS       if (document.MM_curDrag) with (document.MM_curDrag) {         if (typeof MM_targL =='number' && typeof MM_targT == 'number' &&             (Math.pow(MM_targL-((NS4)?left:(NS6)?parseInt(style.left):style.pixelLeft),2)+              Math.pow(MM_targT-((NS4)?top:(NS6)?parseInt(style.top):style.pixelTop),2))<=MM_tol) {           if (NS4) {left = MM_targL; top = MM_targT;}           else if (NS6) {style.left = MM_targL; style.top = MM_targT;}           else {style.pixelLeft = MM_targL; style.pixelTop = MM_targT;}           MM_SNAPPED = true; MM_LEFTRIGHT = MM_startL-MM_targL; MM_UPDOWN = MM_startT-MM_targT; }         if (MM_everyTime || MM_SNAPPED) eval(MM_dropJS);         if(MM_dropBack) {if (NS4) zIndex = MM_oldZ; else style.zIndex = MM_oldZ;}         retVal = false; if(!NS) event.returnValue = false; }       document.MM_curDrag = null;     }     if (NS) document.routeEvent(objName);   } return retVal; } //--> </script>

  1. Hallo christian,

    ich hatte schon mal kurz gefragt, warum das js in den browsern nicht geht -> weil die scripte zu alt sind.

    Bitte tu den Lesern dieses Forums den Gefallen und poste nicht derart riesigen Code, damit schafft man sich keine Freunde.
    Niemand findet daran Gefallen ellenlange Codes durchzugehen.

    Dass die Scripte in den neueren Browsern nicht funktionieren kann daran liegen dass sie nicht Standard-konform sind, sondern sich am Internet Explorer orientieren.
    Außerdem sind die Scripte von Macromedia geschrieben - da muss man wohl oder übel so lange warten bis Macromedia was neues rausgibt... - oder man programmiert sich von selbst ein paar neue Funktionen, die besser überschaubar sind und dem Standard entsprechen (also auch in möglichst vielen Browsern funktionieren).

    cu

    Marc Reichelt || http://www.marcreichelt.de/

    --
    Linux is like a wigwam - no windows, no gates and an Apache inside!
    SELFCode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)
    http://emmanuel.dammerer.at/selfcode.html
    1. hallo marc,

      ich poste sonst nie so viel script. ist mir schon klar, dass das nicht so gut kommt. dachte nur, dass der ein oder andere direkt erkennt, wie man das leicht ändert, dass auch NS7 oder FF berücksichtigt wird. wenn ich mich nicht täusche, dann wird ja abgefragt welcher browser die seite anzeigt und dem entsprechend die unterschiede für IE und NS gemacht.

      siehe:

      var i,j,aLayer,retVal,curDrag=null,curLeft,curTop,IE=document.all,NS4=document.layers;
        var NS6=(!IE&&document.getElementById), NS=(NS4||NS6); if (!IE && !NS) return false;

      wie gesagt dachte, dass jemand weiß, wie man da noch NS7 mit einbindet. wennich mich recht erinnere geben sich die browser ja als IE oder NS4 oder NS6 zu erkennen, wenn man sie abfragt. scheint aber bei NS7 nicht der "NS7" zu sein. sonst bräuchte man da ja nur dazu schreiben. ich weiß halt nicht, was der gravierende unterschied zwischen NS6 und NS7 ist.

      kommt nicht wieder vor, das sich so viel script poste... bin halt verzweifelt. ;)

      cu christian

      1. Hallo christian,

        wie gesagt dachte, dass jemand weiß, wie man da noch NS7 mit einbindet. wennich mich recht erinnere geben sich die browser ja als IE oder NS4 oder NS6 zu erkennen, wenn man sie abfragt. scheint aber bei NS7 nicht der "NS7" zu sein. sonst bräuchte man da ja nur dazu schreiben. ich weiß halt nicht, was der gravierende unterschied zwischen NS6 und NS7 ist.

        Das Problem bei dem Script ist soweit ich mich erinnere nicht die Browserunterscheidung, sondern die fehlenden Maßeinheiten beim dynamischen Setzen der CSS-Eigenschaften top und left. Im Quirks-Mode läuft das Script also auch mit Geckobrowsern. Entweder du tüftelst also an den entsprechenden Stellen noch ein +'px' in das Script, verwendest einen anderen Doctype oder bedienst dich beispielsweise an diesem Script: http://dhtml.dieneuerepublik.de/elementziehen/

        MfG, Mülli

        --
        Viva Colonia!
        1. hi,

          Das Problem bei dem Script ist soweit ich mich erinnere nicht die Browserunterscheidung, sondern die fehlenden Maßeinheiten beim dynamischen Setzen der CSS-Eigenschaften top und left. Im Quirks-Mode läuft das Script also auch mit Geckobrowsern. Entweder du tüftelst also an den entsprechenden Stellen noch ein +'px' in das Script, verwendest einen anderen Doctype oder bedienst dich beispielsweise an diesem Script: http://dhtml.dieneuerepublik.de/elementziehen/

          danke. das war dochmal eine information, die mich weiterbringt :)

          cu c

        2. Respekt, Selfforum, auf fünf Antworten eine, die den Fragesteller direkt weiterhilft. Eine beeindruckende Quote, bei anderen Threads liegt sie oft 10:1.

          Mathias

  2. Hi,

    ich habe das problem, dass gerne ein javascript menue von dreamweaver erstellen lassen wollte,

    Das ist allerdings ein Problem.

    aber das script schein zu alt für die neusten browser zu sein.

    Dann wende Dich doch bitte an den Support des Herstellers dieses Scripts.
    Dreamweaver-Scripte sind extrem unübersichtlich, da sollen sich bitte die durchwühlen, die das verbockt haben.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Hi,

    function MM_reloadPage(init) {  //reloads the window if Nav4 resized

    diese Funktion kannst Du inzwischen wirklich rausschmeißen.

    MM_dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL,cR,targL,targT,tol,dropJS,et,dragJS) { //v4.01

    //Copyright 1998 Macromedia, Inc. All rights reserved.

    das ist definitiv zu alt. Wenn Du schon Macromedia-Scripts verwendest, solltest Du mal updaten.
    Oder schreibe Deine Scripts selbst.

    freundliche Grüße
    Ingo

    1. hallo ingo,

      das ist definitiv zu alt. Wenn Du schon Macromedia-Scripts verwendest, solltest Du mal updaten.

      das ist leider das script, was von DW MX 2004 (7.0.1) erstellt wird :(

      Oder schreibe Deine Scripts selbst.

      mir wird wohl nichts anderes übrig bleiben, ich wollte es mir halt leichter machen, weil es schon ziemlich lange her ist, das sichmit JS was gemacht habe. die freien scrits, die ich gefunden habe waren leider auch zu alt oder zu schlecht, dass sie den NN7 und FF nicht erkannt haben.

      cu christian

  4. Hallo,

    ich hatte schon mal kurz gefragt, warum das js in den browsern nicht geht -> weil die scripte zu alt sind.

    das muss nicht immer der Grund sein.

    ich habe das problem, dass gerne ein javascript menue von dreamweaver erstellen lassen wollte, aber das script schein zu alt für die neusten browser zu sein. geht wohl nur bis NS6.

    "scheint", "geht wohl nur"? Hast du es probiert?

    wenn es im NS7 funktiniert, dann sollte ja auch im FF gehen. danke schon mal für alle hinweise.

    Nein, nicht automatisch. Soweit erkennbar sollte aber dein Scriptbeispiel NN 6, NN 7, ggf. Opera, und Firefox ähnlich behandeln.
    Und Fehler sind meist anhand der JavaScript-Konsole eingrenzbar.

    Die Browsererkennung jedenfalls geht schonmal, da sie nicht den user-agent bemüht:
    IE=document.all;
    var NS6=(!IE&&document.getElementById);

    Noch kurz ein Link zu Infos über [Link:http://www.lipfert-malik.de/webdesign/tutorial/bsp/browser_js_test.html@title=Browsererkennung per JavaScript], falls du da gründlicher unterscheiden möchtest. Sonst können Unterschiede noch durch unterschieldiche EventHandler oder falsches DOM kommen, aber wie schon gepostetet die JavaScript-Console müßte solche Probleme aufzeigen.

    Grüsse

    Cyx23

    1. hallo cyx23,

      "scheint", "geht wohl nur"? Hast du es probiert?

      mit NN4.7 geht es noch und mit 6 vermute ich auch, weil ja im script NS6 steht.

      Soweit erkennbar sollte aber dein Scriptbeispiel NN 6, NN 7, ggf. Opera, und Firefox ähnlich behandeln.
      Und Fehler sind meist anhand der JavaScript-Konsole eingrenzbar.

      ich dachte FF wäre NN ähnlich genug, dass die unterscheidung zwischen IE und NN reichen würde. die javascriptconsole zeigt weder im FF noch im NN einen fehler an

      cu christian

      1. Hallo,

        "scheint", "geht wohl nur"? Hast du es probiert?

        mit NN4.7 geht es noch und mit 6 vermute ich auch, weil ja im script NS6 steht.

        und wenn im Script Rumpelstilzchen steht was dann? Offenbar ist dir nicht vollkommen klar wie und warum "im script NS6" steht.

        Umso sinnvoller wäre es für dich einerseits das Script auszuprobieren und dazu mal in SelfHTML unter JavaScript über Variablen und if-Abfragen nachzulesen.

        ich dachte FF wäre NN ähnlich genug, dass die unterscheidung zwischen IE und NN reichen würde. die javascriptconsole zeigt weder im FF noch im NN einen fehler an

        FF und NN 4 oder FF und NN 7 bzw.6?

        Und wenn "javascriptconsole zeigt weder im FF noch im NN", hast du das Script offenbar doch ausprobiert und es funktioniert, wo ist dann dein Problem?

        Grüsse

        Cyx23

        1. und wenn im Script Rumpelstilzchen steht was dann? Offenbar ist dir nicht vollkommen klar wie und warum "im script NS6" steht.

          doch, das ist mir klar. habe ns6 nicht installiert, da es aber einen fall für ns6 im script gibt gehe ich davon aus, dass es auch im ns6 geht. also weiß ich nicht was deine frage soll.

          Umso sinnvoller wäre es für dich einerseits das Script auszuprobieren und dazu mal in SelfHTML unter JavaScript über Variablen und if-Abfragen nachzulesen.

          ich habe es ausprobiert und es geht im IE, NS4.7 und vermutlich auch im NS6. im NS7 und FF aber nicht, obwohl keine fehler angzeigt werden. wenn es klappen würde, dann hätte ich hier bestimmt nicht gefragt!

          FF und NN 4 oder FF und NN 7 bzw.6?

          ist ja wohl klar, dass FF ähnlich NN7 gemeint war!

          Und wenn "javascriptconsole zeigt weder im FF noch im NN", hast du das Script offenbar doch ausprobiert und es funktioniert, wo ist dann dein Problem?

          wie gesagt: trotz keiner fehleranzeige geht es eben nicht!!

          cu christian

          1. Hallo,

            doch, das ist mir klar. habe ns6 nicht installiert, da es aber einen fall für ns6 im script gibt gehe ich davon aus, dass es auch im ns6 geht. also weiß ich nicht was deine frage soll.

            Netscape 6 und 7 verhalten sich ähnlich. Der Variablenbezeichner deutet zwar daruf hin dass es zur Zeit der Scriptentwicklung einen Netscape 7 noch nicht gab, aber die Variable ns6 ist je nach Konfiguration bei anderen Browsern wie Opera oder Netscape 7 auch true.
            Einen kleinen Unterschied hat dir ja Tobias Müller geposted, wobei ich vermutet hatte dass solche Probleme in der JavaScript-Konsole auftauchen.

            ich habe es ausprobiert und es geht im IE, NS4.7 und vermutlich auch im NS6. im NS7 und FF aber nicht, obwohl keine fehler angzeigt werden. wenn es klappen würde, dann hätte ich hier bestimmt nicht gefragt!

            Bei deinen Ausführungen ist mir jedenfalls nicht deutlich geworden was du schon ausprobiert hast, zumal dein umfangreiches Posting kein isoliertes Test-Beispiel enthält.

            ist ja wohl klar, dass FF ähnlich NN7 gemeint war!

            Für dich anscheinend.

            wie gesagt: trotz keiner fehleranzeige geht es eben nicht!!

            Da wäre es schon hilfreich wenn du eine URI mit dem ganzen Beispiel oder als Ergänzung kurz den Code mit dem Aufruf der betr. Funktion posten würdest.

            Grüsse

            Cyx23