diverses zu javascript
derdon
- 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
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.
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
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
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
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;">/,')',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
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.
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.
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.
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