derdon: diverses zu javascript

Moin moin

Ich interessiere mich seit kurzem für JS bin aber auf zwei Probleme gestossen, die ich nicht gelöst bekomme.

Situation:
Ich möchte per JS eine anzahl seiten in tabs öffnen(np).
Auf den Seiten werden clientseitig einige Berechnungen angestellt und das ergebnis dynamisch in die seite geschrieben.
Abhängig von dem Ergebnis soll die seite entweder vom erzeuger geschlossen werden, oder eine neue seite in einem neuen tab geöffnet werden usw usw.

das ganze möchte ich ohne frames machen, da ich ja nicht einfach ein neues Frame zu einem frameset hinzufügen oder löschen kann.
Das mehrfache auslesen kommt auch nicht in frage, da ich die serverlast nicht verdoppeln möchte.

1.problem)wie kann ich auf die inhalte einer in einem anderen tab geladenen seite zugreifen?

2.problem)wie kann ich feststellen, die andere Seite fertiggeladen ist(dh. inklusive der dyn. erzeugten inhalte);

Ich danke schonmal im voraus und hoffe auf eine lösung
mfg  derdon

  1. Ich danke schonmal im voraus und hoffe auf eine lösung

    Ich denke du machst es dir zu kompliziert, aber da bist du nicht der einzige, deshalb existiert Ajax

    Struppi.

  2. Hallo,

    Auf den Seiten werden clientseitig einige Berechnungen angestellt

    Wieso denkst du, dass die Berechnungen schneller laufen, wenn sie parallel in mehreren Fenstern/Tabs bzw. Dokumenten ablaufen?

    (Wieso stellst du solche Berechnungen clientseitig an?)

    das ganze möchte ich ohne frames machen, da ich ja nicht einfach ein neues Frame zu einem frameset hinzufügen oder löschen kann.

    Ja doch, wenn du iframes nimmst, kannst du beliebig ausgehend von einem Dokument iframes hinzufügen und ggf. löschen.

    Das mehrfache auslesen kommt auch nicht in frage, da ich die serverlast nicht verdoppeln möchte.

    Dann sorge für angemessenes Caching der Seiten im Browser, um den Server zu entlasten.

    1.problem)wie kann ich auf die inhalte einer in einem anderen tab geladenen seite zugreifen?

    Wenn du das Fenster mit window.open() geöffnet hast, gibt dir window.open das window-Objekt des geöffneten Fensters zurück.

    2.problem)wie kann ich feststellen, die andere Seite fertiggeladen ist(dh. inklusive der dyn. erzeugten inhalte);

    Sorge dafür, dass dein JavaScript-Code, der für die dynamische Erzeugung der Inhalte zuständig ist, eine Handlerfunktion aufruft und/oder eine Variable setzt, wenn die Erzeugung abgeschlossen ist.

    Mathias

    1. Hallo,

      Auf den Seiten werden clientseitig einige Berechnungen angestellt

      Wieso denkst du, dass die Berechnungen schneller laufen, wenn sie parallel in mehreren Fenstern/Tabs bzw. Dokumenten ablaufen?

      Im Endeffekt ist es eigendlich egal, ob die Fenster parallel oder nacheinander geöffnet werden. Aber!!!: Das Öffnen sollte schon nacheinander geschehen, damit der Server nicht grossartig mit Leistungsspitzen zu kämfpen hat.

      (Wieso stellst du solche Berechnungen clientseitig an?)

      Weil ich die Grundwerte nur aus der Html-Seite ziehen kann.
      Ich NUTZE einen Service und passe nur bestimmte Schritte und Darstellungen an.

      das ganze möchte ich ohne frames machen, da ich ja nicht einfach ein neues Frame zu einem frameset hinzufügen oder löschen kann.

      Ja doch, wenn du iframes nimmst, kannst du beliebig ausgehend von einem Dokument iframes hinzufügen und ggf. löschen.

      ein beispielcode wäre evtl hilfreich da ich darüber nichts gefunden hab.

      Das mehrfache auslesen kommt auch nicht in frage, da ich die serverlast nicht verdoppeln möchte.

      Dann sorge für angemessenes Caching der Seiten im Browser, um den Server zu entlasten.

      1.problem)wie kann ich auf die inhalte einer in einem anderen tab geladenen seite zugreifen?

      Wenn du das Fenster mit window.open() geöffnet hast, gibt dir window.open das window-Objekt des geöffneten Fensters zurück.

      Aber ich kann nicht aus dem öffnenden fenster auf die inhalte zugreifen.
      geht jedenfalls nicht mit evaluate.

      2.problem)wie kann ich feststellen, die andere Seite fertiggeladen ist(dh. inklusive der dyn. erzeugten inhalte);

      Sorge dafür, dass dein JavaScript-Code, der für die dynamische Erzeugung der Inhalte zuständig ist, eine Handlerfunktion aufruft und/oder eine Variable setzt, wenn die Erzeugung abgeschlossen ist.

      Mathias

      1. Hallo,

        wenn du iframes nimmst, kannst du beliebig ausgehend von einem Dokument iframes hinzufügen und ggf. löschen.

        ein beispielcode wäre evtl hilfreich da ich darüber nichts gefunden hab.

        Hinzufügen:
        http://de.selfhtml.org/javascript/objekte/document.htm#create_element@title=document.createElement
        http://de.selfhtml.org/javascript/objekte/node.htm#append_child@title=appendChild

        Löschen:
        http://de.selfhtml.org/javascript/objekte/node.htm#remove_child@title=removeChild
        (brauchst du wahrscheinlich gar nicht - du kannst ja mit http://de.selfhtml.org/css/eigenschaften/positionierung.htm#visibility@title=versteckten iframes arbeiten)

        Zugriff auf die iframe-Fensterobjekte über window.frames
        http://de.selfhtml.org/javascript/objekte/frames.htm
        Interessant dazu: http://aktuell.de.selfhtml.org/artikel/javascript/fensterzugriff/

        Wenn du das Fenster mit window.open() geöffnet hast, gibt dir window.open das window-Objekt des geöffneten Fensters zurück.

        Aber ich kann nicht aus dem öffnenden fenster auf die inhalte zugreifen.

        Doch. Zum Beispiel:

        var fensterobjekt = window.open(...)  
        alert(fensterobjekt.globaleVariableImPopupFenster); // Zugriff auf JavaScript-Variablen.  
        alert(fensterobjekt.document.getElementById("ID").innerHTML); // Zugriff aufs Dokument über das DOM
        

        Oder meinst du, du kannst nicht darauf zugreifen, weil es die Same Origin Policy verbietet?

        geht jedenfalls nicht mit evaluate.

        Was ist evaluate?

        Mathias

        1. so da bin ich wieder

          mit evaluate meine ich natürlich document.evaluate(string path,...)
          damit kann man sehr einfach auf einen bestimmten knoten zugreifen
          aber jetzt unwichtig

          Wichtig ist:
          Etwas ähnliches wie dein variablen-zugriff hab ich bereits in funktion gesehen.
          Und zwar bei 2 popups.

          Aber meine zu öffnende Fenster sind normale tabs, bei dehnen es scheinbar nich funktioniert:
          hier die zwei beteiligten GM-scrpits:
          das erste wird im opener-fenster ausgeführt
          das zweite im zu öffnenden fenster
          // ==UserScript==
          // @name            TFsuche_mod
          // @namespace       TFsuche_mod
          // @include

          var win = null;
          var win_TF = null;

          var urls = ["211","241"];

          var path_url=">>>eine bestimmte seite :)<<<";
          var status_value ="nicht fertig";
          var pos_at_win ="/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR[1]/TD[1]";
          var max_num_trans = 0;

          function main() {

          var i=0;
           var l= urls.length;

          win = window.open(path_url+urls[i],"nix"+urls[i]);
           i++;
           window.setInterval(function() {if(i<5){
                GM_log("i<5");
                if(status_value=="Fertig"){
                 GM_log("fertig");
                 status_value = "nicht fertig";

          if(max_num_trans>=1){
                  max_num_trans = 0;
                  GM_log("transen grösser");
                  win = window.open(path_url+urls[i],"nix"+urls[i]);i++;
                 }else{
                  max_num_trans = 0;
                  GM_log("transen kleiner");
                  win.close();
                  win = window.open(path_url+urls[i],"nix"+urls[i]);i++;
                 }
                }

          }
           },500);

          };

          window.addEventListener("keypress",
             function(event) {
               if (event.altKey && event.charCode == 'g'.charCodeAt(0)) {
                 event.preventDefault();
                 main();
               }
              },
              true);

          //.user.js

          // ==UserScript==
          // @name            TF_mod
          // @namespace       TF_mod
          // @include
          // @include

          function do_platypus_script() {

          var max_num_Trans =0;
          for(var i=1;i<=17;){

          try{
           var tmp = calc_add(i+2);
           if((typeof tmp)=="undefined") tmp =0;
           //GM_log("tmp:"+tmp+" max_num_Trans:"+max_num_Trans);

          max_num_Trans = (tmp<max_num_Trans?max_num_Trans:tmp);
           }catch(e){
           i=18;
           }
           i=i+1;
          }// >>>Zeile 87<<<
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR[1]/TD[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/.*/,max_num_Trans+"("+window.opener+")",null);

          // ***crosswindow-werteübergabe*** <<<---hier passiert ANGEBLICH was
          try{
          window.opener.max_num_trans = max_num_Trans;
          GM_log("max_num_trans gesetzt");
          }catch(e){
          GM_log(e.message);
          }
          try{
          window.opener.status_value = "Fertig";
          GM_log("status_value gesetzt");
          }catch(e){
          GM_log(e.message);
          }
          };

          window.addEventListener("load", function() { do_platypus_script() }, false);

          function calc_add(tr) {
          var ret = 0;
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/'metall: /,' (',null);
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/<br>Kristalle: /,'+',null);
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/<br>omega: /,'+',null);
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/style="border: medium none ; width: 12px;"&gt;/,')',null);
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/`/g,'',null);

          var num = ((document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.innerHTML).match(/\d++\d++\d+/));
          if(num!=null){
          var tmp = num[0].match(/\d+/g);
          var res = 0;

          for(var i=0;i<3;i++){
           //GM_log('tr:'+tr+' i:'+i);
           res = res+parseInt(tmp[i]);
          }

          ret =((((res-150000)/350000)<1)?0:((res-150000)/350000));

          if(ret>0){
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/\d++\d++\d+/,ret,null);
          }else{
          do_modify_html_it(window.document,document.evaluate('/HTML[1]/BODY[1]/DIV[5]/TABLE[2]/TBODY[1]/TR['+tr+']/TD[2]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue,/(\d++\d++\d+)/,'',null);
          }

          return ret;
          }
          };

          function do_modify_html_it(doc, element, match_re, replace_string) {
              match_re = new RegExp(match_re);
              if (element.innerHTML) {
          element.innerHTML = element.innerHTML.replace(match_re, replace_string);
              };
          };

          //.user.js

          in zeile 88 wird als Ausgabe "0([object XPCNativeWrapper [object Window]])" in die entsprechende tabelle geschrieben

          und die nachfolgenden try-catch-blöcke werden auch augeführt

          nur werden die globalen variablen
          window.opener.max_num_trans
          und
          window.opener.status_value
          scheinbar nicht verändert, denn der setInterval-Timer kommt nicht über das "if(i<5)" hinaus.

          und die iframes kann ich ja deshalb nicht nutzen, weil das opener script erwartungsgemäß ~10-50 Fenster öffnen wird.
          Das ist mit iframes(im gegensatz zu tabs) sehr unübersichtlich !und! nach allem was ich bisher gelesen habe, müssen nach jedem hinzufügen oder entfernen ALLE Inhalte wieder neugeladen werden.
          Das geht gar nich!!!

          ich hoffe der code gibt jetzt etwas mehr einblick in das problem.

          hopeful waiting derdon

          PS:@struppi ich hab keinen schimmer von ajax .
          vllt kennst du ja ne Seite mit einen fehlerfreien/schnellen/umfassenden Tutorial und gutem Supportforum.
          Ich hab nichts entsprechendes gefunden

          1. mit evaluate meine ich natürlich document.evaluate(string path,...)
            damit kann man sehr einfach auf einen bestimmten knoten zugreifen

            Das gibt es nicht.

            PS:@struppi ich hab keinen schimmer von ajax .
            vllt kennst du ja ne Seite mit einen fehlerfreien/schnellen/umfassenden Tutorial und gutem Supportforum.
            Ich hab nichts entsprechendes gefunden

            Du kennst nicht google?
            Der erste Link führt auf die Wikipedia Seite, wo schon fast alles steht.

            Struppi.

            1. also evaluate geht eindeutig!!
              ist getestet und für gut befunden.
              siehe script oben

              Google?? wasn das
              scherz beiseite

              wenn man(evtl. ich) bei google nach nem workaround irgendeiner art(HW,SW,steuererklärung,/.*/) sucht, ist man stunden und manchmal tage beschäftigt.
              ich weiss wovon ich rede und von den nächten will ich gar nicht anfangen.

              um den tip mit der anonymous method aus dem code zu finden, hats nen halben tag gebraucht(und sehr vieler nicht jugendfreier Wörter).

              GOOGLE ist in erster linie eine Firmen- und Gartenverein-verlinkungsmaschine.

              1. also evaluate geht eindeutig!!
                ist getestet und für gut befunden.

                Dann sag wenigstens wann und wo es geht, es geht nämlich durchaus nicht überall und immer http://developer.mozilla.org/en/docs/DOM:document.evaluate

                Die Funktion ist also nur bedingt zu empfehlen und ich kann nicht erkennen warum sie einer DOM Funktion vorzuziehen ist.

                wenn man(evtl. ich) bei google nach nem workaround irgendeiner art(HW,SW,steuererklärung,/.*/) sucht, ist man stunden und manchmal tage beschäftigt.
                ich weiss wovon ich rede und von den nächten will ich gar nicht anfangen.

                Also ich muss fast nie Tage suchen, das liegt eher an deiner Suchstrategie. z.b. ergibt die Eingabe von AJAX bereits auf der ersten Seite nur gute Treffer.

                um den tip mit der anonymous method aus dem code zu finden, hats nen halben tag gebraucht(und sehr vieler nicht jugendfreier Wörter).

                Deine Suchstrategie ist eindeutig verkehrt

                GOOGLE ist in erster linie eine Firmen- und Gartenverein-verlinkungsmaschine.

                Deine Meinung sei dir ungenommen, deshalb hab ich dir ja bereits gezeigt wie du mit einen für deine Suche hilfreichen Suchwort auf ein sinnvolles Ergebnis kommst.

                Struppi.

          2. Hallo,

            Das scheint wohl irgendein Firefox-internes Problem zu sein, offenbar gehts um ein Greasemonkey-Script.

            Ich fürchte, es ist der XPCNativeWrapper, der den Zurgiff aus Sicherheitsgründen unterbindet:

            »Any time a protected script accesses an untrusted object it will get back an implicit deep XPCNativeWrapper.«

            http://developer.mozilla.org/en/docs/XPCNativeWrapper
            http://www.xs4all.nl/~jlpoutre/BoT/Greasemonkey/xpcnativewrapper.html
            http://www.oreillynet.com/pub/a/network/2005/11/01/avoid-common-greasemonkey-pitfalls.html

            Du kannst mal versuchen, eine eigene Funktion im opener aufzurufen (opener.meineFuntion()), aber das geht wahrscheinlich auch nicht.

            Frag am besten mal in einem Greasemonkey-Forum oder dergleichen.

            Mathias