Antje: Objekte loeschen

Hallo zusammen!

Ich habe eine Funktion, mit der allerhand angestellt wird, unter anderm auch eine 2. Funktion aufgerufen, die dann einige Objekte auf den Bildschirm bringt. Nun wird beim wiederholten Aufruf der 1. Funktion die 2. wieder mit ausgefuehrt. Das Problem ist nun, dass die Objekte vom ersten Aufruf noch da sind, was ich aber nicht will, weil die Objekte in der Zwischenzeit andere Parameter bekommen haben (sprich an einer anderen Position sind)
Gibt es so etwas "loesche Objekt", was ich dann einbauen koennte? Ich will auf keinen Fall mit Frames arbeiten und auch nicht den ganzen Inhalt loeschen...

Antje

  1. hi,

    Ich habe eine Funktion, mit der allerhand angestellt wird, unter anderm auch eine 2. Funktion aufgerufen, die dann einige Objekte auf den Bildschirm bringt. Nun wird beim wiederholten Aufruf der 1. Funktion die 2. wieder mit ausgefuehrt. Das Problem ist nun, dass die Objekte vom ersten Aufruf noch da sind, was ich aber nicht will, weil die Objekte in der Zwischenzeit andere Parameter bekommen haben (sprich an einer anderen Position sind)

    ändern sich wirklich die objekte, oder verändert sich nur ihre position?
    erstellst du wirklich neue objekte, sprich "nodes" über das DOM?

    Gibt es so etwas "loesche Objekt", was ich dann einbauen koennte?

    wenn du wirklich nach dem DOM arbeitest und neue knoten für die objekte erstellst, kannst du sie auch wieder entfernen, http://selfhtml.teamone.de/javascript/objekte/node.htm#remove_child

    gruss,
    wahsaga

    1. Hallo wahsaga,

      danke fuer deine Hilfe. Du hattest mir vorgestern schon auf die Spruenge geholfen, was ich jetzt auch irgendwie geloest habe.

      Also die bisherige Loesung ist, dass ich die Position meiner Punkte (gifs) auf einer Karte berechne und diese auch dargestellt werden und bei einer Veraenderung des Kartenausschnittes(z.B. Zoom) neu berechnet werden. Klappt ja soweit recht gut, nur dass die "alten" eben stehen bleiben. Im Prinzip suche ich sowas wie clear(Punkte) bei jedem Aufruf.
      Und huch... als Newbie hoere ich sowas wie DOM und Knoten zum ersten mal. Ich hoffe, da kommt nicht noch mehr Lesearbeit dazu ;)

      Antje

      1. hi,

        Also die bisherige Loesung ist, dass ich die Position meiner Punkte (gifs) auf einer Karte berechne und diese auch dargestellt werden und bei einer Veraenderung des Kartenausschnittes(z.B. Zoom) neu berechnet werden.

        es werden also lediglich die positionen neu berechnet, anzahl und art der eingesetzten "punkte"-gifs bleibt gleich?

        Klappt ja soweit recht gut, nur dass die "alten" eben stehen bleiben.
        Im Prinzip suche ich sowas wie clear(Punkte) bei jedem Aufruf.

        wieso bleiben die "stehen"?
        du brauchst die punkte doch eigentlich nur an die neu berechneten positionen bringen.

        gruss,
        wahsaga

        1. hallo,

          da die Anzahl nicht gleich bleibt (wie gesagt, da sind zum Beispiel Funktionen wie "zoomen" und "pan") wird je nach Anzahl i der sichtbaren Punkte (insgesamt 5000) das gleiche Bild i mal dargestellt. Beim naechsten Schritt eben weniger oder mehr. Ich berechne ja die Positionen neu, nur bleiben die alten Punkte eben stehen. Ich kann ja mal den Code zeigen:

          function position(px) {

          for(var i=0; i<=PN.length; i++) {

          //Algorithmus: point inside rectangle
              if ((NO[i]>=minN) && (EA[i]>=minE) && (NO[i]<=maxN) && (EA[i]<=maxE))
               //distance bbox-photopoint (left-bottom)
               dx[i]=NO[i]-minN;
               dy[i]=EA[i]-minE;

          //pixeldistance
               //change to int + x <---> y
                 pixelx[i]=Math.floor(dy[i]/p);
                 pixely[i]=Math.floor(400-(dx[i]/p));

          //get the right one (eval)
                 obj=eval("pp"+i);
                 obj.style.left = pixelx[i];
                 obj.style.top = pixely[i];
                 obj.style.display="inline";
                 p = px;
                     }
                 }
              }

          function customize() {
          //Loop through the array
          for(var i=0; i<=PN.length; i++) {
            if ((NO[i]>=minN) && (EA[i]>=minE) && (NO[i]<=maxN) && (EA[i]<=maxE)) {
                document.write("<img id="pp" + i +"" src="pp.gif" width="8" style="display:none;position:absolute;top:10;left:10">");
             }
            }
          }

          Die Funktion position() wird aufgerufen, wenn sich der Bildausschnitt geaendert hat... (Bildausschnitt = bbox)

          1. hi,

            da die Anzahl nicht gleich bleibt (wie gesagt, da sind zum Beispiel Funktionen wie "zoomen" und "pan") wird je nach Anzahl i der sichtbaren Punkte (insgesamt 5000) das gleiche Bild i mal dargestellt.

            *uah!*

            bis zu 5000 punkte auf diese weise (als einzelne <img>) darstellen, und noch dazu deren positionen mit JS dynamisch verändern?

            himmel hilf, damit wirst du garantiert auch den besten browser an den rand seiner leistungsfähigkeit bringen, und viele vermutlich darüber hinaus.

            ich denke, dein ansatz ist für das, was du erreichen willst, vollkommen ungeeignet.

            gruss,
            wahsaga

            1. hi,

              naja, 5000 auf einmal werden es nich sein... Ich will das darstellen der Bilder erst ab einer bestimmte Zoomstufe zulassen, so dass es sich vielleicht um ein paar Duzend handelt. Und bei dem gif mit unter 1 KB ist das auch noch userfreundlich, denke ich.
              Das Problem ist eigentlich nur, dass ich nicht die ganze Seite refreshen will, da im Hintergrund ja mittlerweile die Karte in einer bestimmte Zoomstufe (kommt von einem Mapserver) liegt, siondern eben nur die Bilder.

              1. hi,

                Das Problem ist eigentlich nur, dass ich nicht die ganze Seite refreshen will, da im Hintergrund ja mittlerweile die Karte in einer bestimmte Zoomstufe (kommt von einem Mapserver) liegt, siondern eben nur die Bilder.

                das ist nicht das problem, sondern deine anforderung :-)

                wo jetzt aber das problem liegt, diese umzusetzen, ist immer noch nicht klar.

                wer hindert dich daran, auf irgendeine ereignis hin die bildpositionen neu zu berechnen und zu setzen ...?

                gruss,
                wahsaga

                1. ... meine Unkenntnis...

                  Genau das mache ich. Mit jeder Veraenderung der Map werden die Bildpunkte neu berechnet. Nur eben, dass die vom Schritt vorher auch noch zu sehen sind.

                  Ich versuch gerade

                  obj.style.visibility = "hidden";

                  in die Schleife einzubauen, wobei nun das Problem ist, dass entweder das Objekt nicht kennt (klar, weil noch nicht initialisiert) oder ernix mehr anzeigt.

                  Antje

                  1. hi,

                    Genau das mache ich. Mit jeder Veraenderung der Map werden die Bildpunkte neu berechnet. Nur eben, dass die vom Schritt vorher auch noch zu sehen sind.

                    dann machst du es anders, als ich es im sinn habe - du scheinst wirklich immer neue bild-objekte zu erzeugen.

                    wofür?

                    nimm dir eine handvoll, und positioniere sie.
                    nach einer neuen berechnung änderst du dann einfach die positionierung, so dass sie woanders angezeigt werden(*).

                    dafür ist kein neu erstellen, und vor allem auch kein "löschen" irgendwelcher objekte erforderlich.

                    gruss,
                    wahsaga

                    (*) falls du dabei dann ein paar "zu viel" hast, positioniere sie so lange ausserhalb des sichtbaren bereiches - z.b. top:-500px;

                    1. Hi wahsaga,

                      ja, das waere eine Moeglichkeit. Nur widerstrebt es mir, bei einer Karte mit kleinem Massstab (z.B. 1:850.000) 60 kleine (gleiche!) gifs zu erzeugen, sie darzustellen und dann, wenn ich auf 1:50.000 runtergezoomt habe und nur noch 2 zu sehen sind, 58 ausserhalb des sichtbaren Bereichs zu setzen... Das widerspricht doch gegen jeden Sinn der Programmierung. Aber ich werde das mal versuchen.
                      Vielen Dank!

                      Antje

          2. hallo,

            da die Anzahl nicht gleich bleibt (wie gesagt, da sind zum Beispiel Funktionen wie "zoomen" und "pan") wird je nach Anzahl i der sichtbaren Punkte (insgesamt 5000) das gleiche Bild i mal dargestellt. Beim naechsten Schritt eben weniger oder mehr. Ich berechne ja die Positionen neu, nur bleiben die alten Punkte eben stehen. Ich kann ja mal den Code zeigen:

            Das kann nicht sein, wenn du mit dem Skript die Punkt neu berechnest sind es ja nicht neue Punkte sondern die alten.

            aber dieses Skript krankt.

            function position(px) {

            for(var i=0; i<=PN.length; i++) {

            //Algorithmus: point inside rectangle
                if ((NO[i]>=minN) && (EA[i]>=minE) && (NO[i]<=maxN) && (EA[i]<=maxE))
                 //distance bbox-photopoint (left-bottom)
                 dx[i]=NO[i]-minN;
                 dy[i]=EA[i]-minE;

            //pixeldistance
                 //change to int + x <---> y
                   pixelx[i]=Math.floor(dy[i]/p);
                   pixely[i]=Math.floor(400-(dx[i]/p));

            //get the right one (eval)

            und zwar hier:

            obj=eval("pp"+i);

            eval ist hier nicht nur überflüssig, sondern macht das Skript um einige Faktoren langsamer. Gerade bei deinem Skript sollte dies ein Punkt sein den du beachten solltest.

            Um an das Image zu kommen reciht ganz einfach:
            obj= document.images["pp" + i];

            Je nach browser ist das 5 bis 10 mal schneller.

            obj.style.left = pixelx[i];
                   obj.style.top = pixely[i];
                   obj.style.display="inline";

            Das ist unwichtig (oder so gar falsch?)

            p = px;

            Was macht das?

            }
                   }
                }

            function customize() {
            //Loop through the array
            for(var i=0; i<=PN.length; i++) {
              if ((NO[i]>=minN) && (EA[i]>=minE) && (NO[i]<=maxN) && (EA[i]<=maxE)) {
                  document.write("<img id="pp" + i +"" src="pp.gif" width="8" style="display:none;position:absolute;top:10;left:10">");

            bei top und left fehlt eine Einheit oder nimm 0.

            Trotz allem kann ich dein Problem nicht nachvollziehen, da sich ja die Anzahl der Punkte nicht ändert insofern auch keine Punkte an der alten Position bleiben sollten.

            Kann man sich das vielleicht irgendwo mal angucken?

            Struppi.

            1. Hallo Struppi,

              Danke erstmal fuer deine Hilfe. Es ist nicht so ganz einfach das Problem zu beschreiben, da der Code (oder Kot?) mitlerweile recht verzahnt ist und angucken ist im Momment auch noch nicht drin (und wird es wohl auch nicht werden, da der Mapserver in der Firma nur mit Passwort zugaenglich ist. Aber du kannst ja mal versuchen, ob du da rankommst:
               http://kortforsyning.kms.dk/gronland/gronland.htm
              Ist ein aehnliches Projekt, nur liegen da die Punkte "fest" auf der Karte und da ist Java im Spiel. Aber von der Idee vielleicht das gleiche

              Also versuche ich es mal mit Worten zu beschreiben (ich koennte dir ja den Quellcode per mail senden, aber ich glaube, das willste nich wirklich)

              1. Ich habe habe auf diesem Mapsever _verschiedene_ Karten mit _verschiedenen_ Aufloesungen. Und wenn ich die Distanzen berechnen will brauche ich diese Aufloesungen. Daher das p = px;
              Das ist nur ein zuruecksetzen der Zoom-funktion in der ich meine position() aufrufe:

              function zoom() {

              if ((actpic==0) && (event.button==1)){
                   calc("D_3200",238,"images/3200.jpg",true);
               setTimeout("position(238)",2000);

              }
                 else if((actpic==1) && (event.button==1)) {
                   calc("D_500",50,"images/500.jpg",true);
               setTimeout("position(50)",2000);
              ...

              2.

              obj.style.left = pixelx[i];
                     obj.style.top = pixely[i];
                     obj.style.display="inline";

              Warum ist das falsch? Irgendwie muss ich obj ja ne neue Position zuweisen

              3. obj=eval("pp"+i);
              Das hab ich auf deinen Rat hin geeaendert in:
              obj= document.images["pp" + i];

              4. genauso die Einheiten

              5.

              Trotz allem kann ich dein Problem nicht nachvollziehen, da sich  ja die Anzahl der Punkte nicht ändert insofern auch keine Punktean der alten Position bleiben sollten.

              Wie geasgt, bei einem kleineren Kartenausschnitt aendert sich die Anzahl und die Position.

              1. http://kortforsyning.kms.dk/gronland/gronland.htm
                Ist ein aehnliches Projekt, nur liegen da die Punkte "fest" auf der Karte und da ist Java im Spiel. Aber von der Idee vielleicht das gleiche

                nö lieber nicht, ich hab hier 'n älteren Browser auf nem P100, da lass ich Java lieber aus ;-)

                Also versuche ich es mal mit Worten zu beschreiben (ich koennte dir ja den Quellcode per mail senden, aber ich glaube, das willste nich wirklich)

                Zumal ich die Adresse kaum nutze.

                function zoom() {

                if ((actpic==0) && (event.button==1)){
                     calc("D_3200",238,"images/3200.jpg",true);
                 setTimeout("position(238)",2000);

                }
                   else if((actpic==1) && (event.button==1)) {
                     calc("D_500",50,"images/500.jpg",true);
                 setTimeout("position(50)",2000);
                ...

                obj.style.left = pixelx[i];
                       obj.style.top = pixely[i];
                       obj.style.display="inline";

                Warum ist das falsch? Irgendwie muss ich obj ja ne neue Position zuweisen

                das tust du schon durch top/left, das display ist unnötig.

                Trotz allem kann ich dein Problem nicht nachvollziehen, da sich  ja die Anzahl der Punkte nicht ändert insofern auch keine Punktean der alten Position bleiben sollten.

                Wie geasgt, bei einem kleineren Kartenausschnitt aendert sich die Anzahl und die Position.

                Wenn du das so machst, wie ich es vermute kann das gar nicht gehen, da du nicht mir documnet.write() nachträglich Elemente hinzufügen kannst.

                Um nachträglich Elemente in das Dokument einzufügen oder zu löschen musst du mit node arbeiten:
                http://selfhtml.teamone.de/javascript/objekte/node.htm

                Wobei ich keine Erfahrung damit habe.

                Struppi.

                1. hi Struppi,

                  Um nachträglich Elemente in das Dokument einzufügen oder zu löschen musst du mit node arbeiten:
                  http://selfhtml.teamone.de/javascript/objekte/node.htm

                  Danke, dann weiss ich weigstens, wonach ich suchen muss.

  2. Hallo zusammen!

    Ich habe eine Funktion, mit der allerhand angestellt wird, unter anderm auch eine 2. Funktion aufgerufen, die dann einige Objekte auf den Bildschirm bringt. Nun wird beim wiederholten Aufruf der 1. Funktion die 2. wieder mit ausgefuehrt. Das Problem ist nun, dass die Objekte vom ersten Aufruf noch da sind, was ich aber nicht will, weil die Objekte in der Zwischenzeit andere Parameter bekommen haben (sprich an einer anderen Position sind)
    Gibt es so etwas "loesche Objekt", was ich dann einbauen koennte? Ich will auf keinen Fall mit Frames arbeiten und auch nicht den ganzen Inhalt loeschen...

    Deine Beschreibung ist zu wage, als dass man dir wirklich helfen kann. "allerhand angestellt", "einige Objekte auf den Bildschirm bringt", "objekte noch da sind" - da kann man sich alles möglich drunter vorstellen, weiß aber nicht Ansatzweise was du damit meinst.

    Struppi.