Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Předání hodnoty inputu do nově otevřeného okna

Mám okno, ve kterém je formulář, obsahující textové pole. Potřebuju, aby se po kliknutí na tlačítko v tomto okně otevřelo nové okno, rovněž obsahující formulář, do něhož potřebuju přenést hodnotu z pole v 1. okně. Potřebuju, aby to fungovalo min. v IE 6+, FF 3, Google Chrome.

Můj demo zjenodušený pokus
index.html (1. okno z něhož přenáším hodnotu):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
     <meta http-equiv="content-type" content="text/html; charset=windows-1250">
     <script src="pokus.js"></script>
  </head>
  <body>
    <form name="LANSA" method="post">
      <input type="text" id="text" value="0123456789" /><br /><br />
      <input type="button" id="butt_text" value="Přenes data" onclick="javascript: okno();" />
    </form>
  </body>
</html>

okno.html (2. okno, do kterého přenáším hodnotu):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=windows-1250">
    <script src="pokus.js"></script>
  </head>
  <body>
    <form name="LANSA" method="post">
      <input type="text" id="text1" />
      <input type="text" id="text2" />
    </form>
  </body>
</html>

pokus.js

function okno() {
  var win = window.open("./okno.html", "", "");
  win.addEventListener("load", prenesData(win, document), false);
}

function prenesData(win, doc) {
  win.document.getElementById("text1").value = "ahoj"; 
  win.document.getElementById("text2").value = doc.getElementById("text").value;
}

V prvním řádku fce prenesData natvrdo přiřadím nějakou hodnotu prvnímu inputu - kontrola, že volání inputů v nově otevřeném okně je v pořádku. Ve druhém řádku pak přiřadím hodnotu z prvního okna.

Jenže:
1. Toto funguje v IE, Ve FF ani GCH se hodnoty nepředají (a to ani ta, co přiřazuji natvrdo). FF vypíše win.document.getElementById("text1").is null;
2. Přidám na začátek fce prenesData příkaz alert("prenesData()"); Nyní se hodnoty v IE 6 a FF vyplní, v GCh stále ne.
3. Zakomentuji alert a místo něj dám while, který by měl čekat, dokud se inputy nevytvoří:
while (win.document.getElementById("text2") == null) {
var a = 1;
}
V IE 6 funguje, v FF a Gch se věčně zacyklí.

Nemáte tip, jak to napsat, aby to fungovalo všude?

Předmět Autor Datum
Možná teď plácnu něco mimo, ale proč hodnoty nepřeneseš přes GET/POST nebo pomocí session?
host 20.07.2009 19:04
host
Protože to by se pak muselo napsat cosi na serveru v LANSE (nejspíš vytvořit nový proces...), což já…
Anicka 21.07.2009 15:11
Anicka
Musíš to urobiť na opak. Z otvoreného okna načítať údaje z jeho vlastníka. // otvoríš okno window.o…
Len tak 21.07.2009 15:36
Len tak
Problém je v tom, že já do nově otevřeného okna nemůžu napsat <body onload="..."> , protože to okn…
Anicka 27.07.2009 14:30
Anicka
Tak jsem se nakonec dopracovala k tomuhle kódu: function okno() { var win = window.open("./okno.htm… poslední
Anicka 28.07.2009 12:18
Anicka

Protože to by se pak muselo napsat cosi na serveru v LANSE (nejspíš vytvořit nový proces...), což já neumím a ten, kdo to umí na to nemá čas. Přece musí být způsob jak jednoduše předat z jednoho okna pomocí js data do druhého tak, aby to fungovalo ve všech prohlížečích, ne?

Session taky ne - běží to na lansáckém serveru, který má nějaké svoje session, ale moc s nimi tady nikdo pracovat neumí a k předávání dat se proto u nás nepoužívají.

Problém je v tom, že já do nově otevřeného okna nemůžu napsat

<body onload="...">

, protože to okno je generováno LANSOU a tag body je generován automaticky. Proto je ve fci, která okno otevírá příkaz:

win.addEventListener("load", prenesData(), false); 

fci prenesData jsem upravila takhle:

function prenesData() {
	alert("prenesData()");

	document.getElementById("text1").value = "baf";
	document.getElementById("text2").value = window.opener.getElementById("text").value;
}

Testovací alert se provede, ale data se nepřenesou. A na rozdíl od předchozího zápisu, kdy se document předával jako parametr fce to teď nefunguje ani v IE natož v tom ostatním. Konkrétně ve FF se zobrazí chybová zpráva document.getElementById("text1") is null;

Tak jsem se nakonec dopracovala k tomuhle kódu:

function okno() {
  var win = window.open("./okno.html", "", "");

  if (win.addEventListener) {
    win.addEventListener("load", prenesData(win), false);
  }
  else
    if (win.attachEvent) {
      win.attachEvent("load", prenesData(win));
    }
}

function prenesData(win) {
  alert("prenesData()");

  win.document.getElementById("text1").value = "baf";
  win.document.getElementById("text2").value = 
    win.opener.document.getElementById("text").value;
}

Tohle funguje v IE i ve FF a Opeře. V Google Chrome ne. Bohužel jen do okamžiku, než zakomentuji alert v prenesData(). Pak to funguje jen v IE, ale v ostatních se data nepředávají. Nemáte nějaký nápad, jak to udělat bez alertu?

Zpět do poradny Odpovědět na původní otázku Nahoru