Autor Zpráva
Jack06
Profil
Dobrý den, bohužel musím napsat znovu ohledně otevření okna.

Mám jedno hlavní okno, ze kterých otevírám šeptací okna k různým uživatelům:

window.open("","whisper"+to_user_ID, "width=500, height=300, menubar=0, status=1, resizable=1, scrollbars=1");


při odeslání formuláře proběhne v hlavním okně(ne šeptacím) callback, a já bych potřeboval vědět, zda se dá, pokud budu mít například v okně whisper20 function refresh(){....}, jestli se dá nějak spustit.

přez callback napsat něco jako window.whisper20.fetch() - nevím jak to napsat proto se ptám.. jestli z hlavního okna mohu pomocí toho názvu whisper20 spustit funkci v tom daném šeptacím. Děkuji.
_es
Profil
Jack06
Ak by si si klikol na funkciu window.open v kóde čo si dal, tak by si zistil, že si môžeš objekt vytváraného okna uložiť do premennej.
Teda v tvojom prípade asi takto:
var o = window.open(/*parametre*/);
o.funkcia_v_otvaranom_okne();
Jack06
Profil
_es
tj, jenže já přez jednu funkci otevírám více oken.. viz:

var win;
function whisperWin(to_user_ID,to_username) {
nick = <?php print "'$_SESSION[sp_nick]'";?>;
txt = '<html><head><title>'+root.username+'<-->'+to_username+'</title>';
txt += '<scr'+'ipt>function fetch(){window.opener.showTextMini('+to_user_ID+')};setInterval("fetch()",10000);setTimeout("fetch()",200);';
txt += 'function useSmile(sid){ a=mini_write.document.getElementById("text"); a.value=a.value+"!"+sid+"! "; a.focus(); }';
txt += 'function nickComplete(e,t){window.opener.nickComplete(e,t);}';
txt += '</scr'+'ipt>';
txt += '<style type="text/css" media="screen, projection">';	
txt += '       @import "./themes/chat/default/style.css";';
txt += '</style>';
txt += '</head><body>';
txt += '<div id="msgBoxMini"><span class="system">čekejte... nahrávám...</span></div>';
txt += '<div id="miniFooter">';
txt += '<div class="div-margin">';
txt += '<form name="postDT" action="" method="post" onsubmit=" return !window.opener.odeslat(this,\'datachat.php?akce=form&room=<?php print $_GET["rid"]; ?>\',2);">';
txt += '<label for="txt">'+nick+':&nbsp;</label><input type="text" name="text" id="txt" autocomplete="off" maxlength="400" onkeydown="nickComplete(event,this);">';
txt += '<input type="hidden" name="refme" value="1">';
txt += '<input type="hidden" name="to_ID" value="'+to_user_ID+'">';
txt += '<input type="submit" name="submit" id="submit" value="Odešli">';
txt += '</form>';
txt += '</div>';
txt += '</div>';
txt += '</body></html>';
/*
for (i in smileList) {if(i==0) { continue; }
sid = smileList[i];
txt += '<a href="#" onclick="useSmile('+sid+');return false;"><img';
txt += ' title="!'+sid+'!"  class="smile" style="vertical-align:top;" src="./img/s/!'+sid+'!.gif"></a>';}
*/
win = window.open("","whisper"+to_user_ID, "width=500, height=300, menubar=0, status=1, resizable=1, scrollbars=1");
win.document.write(txt);
win.document.close();
}


function showTextMini(user_ID) {
var txt = '';
var i_use = 0;
var num_line = 20;
var is_last = 0;
var a = win.document.getElementById("msgBoxMini");
for(i=text_list.length-1;i>=0;i--) {
var row = text_list[i];
if ((row.uid1!=user_ID && row.uid2!=user_ID) || !row.uid2){continue;}i_use++;
if (i_use>=num_line) { is_last = 1; }
txt += textFormatMini(row) + '<br>';
if (is_last) { break; }}
a.scrollTop = 0;
if (i_use==0) {txt += "<i>žádné texty</i>";}a.innerHTML = txt;}


A když pak otevřu druhé, tak se mi spouští funkce showTextMini v obou..

Takže text, který má být v jednom šeptacím okně je pak v obou. :-( A nevím, jak to udělat, aby byl jen v tom ve kterém být má.
_es
Profil
Jack06
Tak si ten skript uprav tak, aby mohol využívať ten princíp.
Napríklad si ukladaj tie otvarané okná do poľa a cez to pole môžeš potom pristupovať ku všetkým oknám:
var win = [];
function whisperWin(to_user_ID, to_username){
  /*
  ostatný kód
  */
  win[to_user_ID] = window.open(/*parametre*/);
  win[to_user_ID].document.write(txt);
  win[to_user_ID].document.close();
}
Jack06
Profil
_es
Tak nevím nějako se mi tam ta funkce nechce spustit..
funkce na refresh hlavního okna se spustí při callback, ale win[1].fetch(); nespustí funkci fetch v šeptacím okně :-(.. nenapíše to chybu nic (firebug), ale neproběhne to. V domu tam je win - 1.
_es
Profil
Jack06
Máš to nejaké príliš chaotické, v tom sa ti asi nikto rýpať nebude.
Ak spustíš funkciu whisperWin príkazom whisperWin(1000, "nejake_meno"); tak vo win[1000] by mal byť objekt toho otváraného okna.
Možno keby si dal ukážku konkrétnej stránky a zrozumiteľne vysvetlil, čo chceš dosiahnuť, tak by poradil aj niekto iný.
Jack06
Profil
_es
Kdyžtak o link a heslo napiš na mail.. jsou tu lidi, kteří se neumí chovat a zneužívahjí údaje které jsem sem dal

Přihlas se a v horním menu klikni na testovací místnost
_es
Profil
Jack06
Vyhľadaj si v kóde postupnosť týchto dvoch znakov: ,)
Ak chceš poradiť, tak skús ten problém nejako "vyextrahovať",
zdarma ti asi nikto nebude analyzovať taký zbastlený kód.
Jack06
Profil
_es
Ten kód celý funguje.. je to minichatový framework. Nefunguje pouze vepsání toho textu do šeptacího okna.. zkoušel jsem vyalertovat i funkci showTextMini a všechno v ní proběhne.. oběkt a existuje a přez firebug je vidět i callback
_es
Profil
Jack06
Máš tam jednu konkrétnu chybu a napísal som ti, ako ju nájdeš.
Ten kód je ako celok zle navrhnutý, určite by tam veľa vecí išlo urobiť jednoduchšie alebo elegantnejšie.
Jack06
Profil
_es
našel jsem tam jeden středník navíc :-)
Když jsem ho odstranil, tak už se to refreshuje, ale o jedno pozadu .. A jak jsi tu chybu našel? Když ji firebug neukáže?

// re to co jsi psal jsem našel též při otevírání oken jsem posílal 3 proměné místo dvou, to už jsem opravil, nicméně se mi to při prvním poslání textu nerefreshne, a od druhého se mi refresuje text o jedno id pozadu
_es
Profil
Jack06
Vieš vôbec, že do otváraného okna môžeš priradiť už vytvorenú funkciu, ktorá môže potom jednoducho pristupovať k obom oknám?
Vyskúšaj tento kód:
<script>
var x = 1, n = 2;
function f(){alert([x,this.x]);}
function o(){
  var w = window.open("", "_blank");
  w.document.write("<button id=b>Zobraz x</button>");
  w.document.close();
  var b = w.document.getElementById("b"); 
  b.x = n++;
  b.onclick = f;
}
</script>
<p onclick="o();">Kliknutím na tento text sa otvorí nové okno</p>
Jack06
Profil
_es
Asi trochu nechápu využití..
Já to teď píšu takto do kódu:
txt += '<scr'+'ipt>function fetch(){window.opener.showTextMini('+to_user_ID+');}setInterval("fetch()",10000);setTimeout("fetch()",200);';
txt += 'function nickComplete(e,t){window.opener.nickComplete(e,t);}';
txt += '</scr'+'ipt>';

_es
Profil
Jack06
Já ti teď píšu takto do kódu:
Čiže najprv sa ten reťazec musí poskladať, potom sa z toho vytvorí funkcia a až potom môže byť okno otvorené a funkcia spustená.
Ten môj krátky kód priraďuje do vytváraného okna už hotovú funkciu, takže je to oveľa jednoduchšie a rýchlejšie, len treba rozumieť tomu, ako sa dostať k premenným oboch okien. V tomto prípade o ktoré x, ktorého okna ide. Tá funkcia nemusí byť priradená len udalosti, ale aj vlastnosti celého objektu okna, vtedy to bude len trochu zvláštna globálna funkcia toho okna.
Jack06
Profil
_es
Tak to si nejsem jistej zda to dám dokupy.. zas tolik tomu nerozumím :-D

// re, tak mě napadlo, jakože utvořit html, všetně toho scriptu atd už předem a pak to akorád vložit pomocí toho co jsi psal? Takhle jsi to myslel?
_es
Profil
Jack06
utvořit html, všetně toho scriptu atd už předem ... Takhle jsi to myslel?

Nie, myslel som do otvarane_okno.document.write predávať len html bez JavaScriptu a celý JavaScript tam dať extra - nie cez document.write, ale nejako podobne ako v tom krátkom kóde.
Jack06
Profil
_es
aha okey díky zkusím to, ale tak mě napadlo, že když otevřu to okno, a vytvořím to pole oken okna jsou vytvořený, a dám f5 na tom ze kterého jsem okno otevřel, tak stratím to pole a pak to hází chyby, protožeuž neexistujou proměnné win[].. Dá se to nějak ošetřit taky??
_es
Profil
Jack06
Môžeš zabezpečiť, že si tie podokná vtedy zavrú, aspoň myslím.
Jack06
Profil
_es
A nevíš asi jak že..? :-(.. Nějak se nikde nemohu dočíst, jak ty otevřená okna při refreshi zavřít..
_es
Profil
Jack06
V tom hlavnom okne budeš mať nejaký kód podobný tomuto:
onunload = function(){prve_podokno.close(); druhe_podokno.close(); /* ... */};

Len si nie som istý, či to bude fungovať vo všetkých prehliadačoch.
Leo
Profil
Mate nejaky duvod proc pouzivat nova okna (s temi jsou jen potize nejen v js) misto rekneme divu s position absolute v okne puvodnim a jedinem? Leo
Jack06
Profil
Leo
Nevím, a nebude se to sekat při více otevřených oknech (divech), když už je budu tvořit, tak by bylo lepší aby se s nimi dalo pohybovat aby nepřekáželi při čtení textů z hlavního okna..
Vím že jste někde psal že jste si také dělal svůj chat. Budu rád, když mi poradí kdokoli zkušenější.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: