Avatar billede tjensen Nybegynder
16. november 2005 - 10:03 Der er 24 kommentarer og
1 løsning

Luk vindue og ændre input

Hey,

Jeg mangler javascript funktionen, der kan ændre noget i et andet vindue.
F.eks. i ens netbank eller bestillings sider, hvor man kan poppe en kalender op i et nyt vindue. Efter man har fundet datoen og trykket på den, lukker den calenderen og overfører datoen til ens <input>.
Lige præcis den funktion leder jeg efter at beherske, men har ike kunne finde den i diveres kalender scripts.

Hilsen Thomas
Avatar billede softspot Forsker
16. november 2005 - 10:26 #1
Du kan med window.opener få fat i det vindue som åbnede vinduet selv. Med den information i hånden, er det bare et spørgsmål om at finde en metode til at identificere den kontrol som skal have værdien du vælger i det aktuelle vindue...
Avatar billede softspot Forsker
16. november 2005 - 10:35 #2
Du kan f.eks. lave et link således:

<a href="#" onclick="selectAndClose(this,1); return false;">værdi 1</a><br>
<a href="#" onclick="selectAndClose(this,2); return false;">værdi 2</a><br>


og så kan flg. script returnere og lukke vinduet:

<script type="text/javascript">
function selectAndClose(elm,val) {
  if(elm) {
    window.opener.forms[0].elements['modtagerkontrolnavn'].value = val;
    window.close();
  }
  return true;
}
</script>
Avatar billede softspot Forsker
16. november 2005 - 10:37 #3
Ja, ok - det er jo ikke fordi det er strengt nødvendigt at overføre this til den funktion som eksemplet er udformet her, men det kunne være at du f.eks. ville bruge id-attributten på linket til at identificere hvilken værdi der skulle sendes med tilbage til formularfeltet... eller sådan noget... og så er det jo godt nok at vide hvilket element der sender eventet :)
Avatar billede tjensen Nybegynder
16. november 2005 - 13:25 #4
ja, lyder som noget af det rigtige..
havde ikke lige regnet med at window.opener var den
funktion jeg ledte efter. Men det jo sådan ud.

Prøver lige at arbejde med det i aften, vender
tilbage i morgen, og fortælle hvorvidt jeg er kommet.
Avatar billede tjensen Nybegynder
17. november 2005 - 08:15 #5
Okay, efter lidt selv studie kom jeg frem til følgende:

--------------- test.php ------------
<script type="text/javascript">
<!--
function findvare(sel){
  window.open('index.php?vis=test2', 'findvare');
}
// -->
</script>

<form id="oversigt">
<input id="vare[1]" type="text" size="8" /><a href="#" onclick="findvare(1)">Find vare</a><br />
<input id="vare[2]" type="text" size="8" /><a href="#" onclick="findvare(2)">Find vare</a><br />
</form>


------------------ test2.php -----------------
<script type="text/javascript">
<!--
function selectAndClose(val){
  window.opener.forms['oversigt'].elements['vare[]'].value = val;
  window.close();
}
// -->
</script>

<a href="#" onclick="selectAndClose(301)">301</a><br />
<a href="#" onclick="selectAndClose(308)">308</a><br />
Avatar billede softspot Forsker
17. november 2005 - 10:15 #6
OK... fungerer det? Har du brug for mere... inspiration?
Avatar billede tjensen Nybegynder
17. november 2005 - 10:22 #7
nej, fungere ikke..

window.opener.forms['oversigt'].elements['vare[]'].value = val;

elementet eksistere ikke melder den. Og jeg tror ikke selv den forstår at smide den tilbage i henholdevis vare[1] eller vare[2] alt efter hvad der åbner vinduet.
Avatar billede softspot Forsker
17. november 2005 - 10:32 #8
Hvad så hvis du skriver således:

--------------- test.php ------------
<script type="text/javascript">
<!--
function findvare(sel){
  window.open('index.php?vis=test2&idx='+sel, 'findvare');
}
// -->
</script>

<form id="oversigt">
<input id="vare[]" type="text" size="8" /><a href="#" onclick="findvare(0)">Find vare</a><br />
<input id="vare[]" type="text" size="8" /><a href="#" onclick="findvare(1)">Find vare</a><br />
</form>


------------------ test2.php -----------------
<script type="text/javascript">
<!--
function selectAndClose(val){
  window.opener.forms['oversigt'].elements['vare[]'][$_GET['idx']].value = val;
  window.close();
}
// -->
</script>

<a href="#" onclick="selectAndClose(301)">301</a><br />
<a href="#" onclick="selectAndClose(308)">308</a><br />


Som du måske har opdaget, så er jeg ikke PHP-kyndig, så du må bære over med mit forsøg på at kode PHP i funktionen selectAndClose, men det jeg gerne vil illustrere er at du skal overføre endnu en parameter i querystring, som angiver hvilket indeks værdien skal indsættes i. Dette indeks genereres ind i siden når den vises (og vil derfor være en konstant hvis du viser kildekode i browseren).

Du laver tilsyneladende en slags redirect over index.php, så den parameter jeg sender med til index.php, der hedder idx, skal altså føres med videre til test2.php - håber du forstår hvad jeg mener :)
Avatar billede tjensen Nybegynder
17. november 2005 - 10:45 #9
yes, jeg er helt med på din løsning. Jeg er php mand, så den del skal jeg nok klar.
Mit store problem igår var det +sel du har skrevet.
Det er så måde man skriver en variabel i en streng i javascript. Så er jeg blevet det klogere :)

Denne linie tror jeg er mere korrekt.
window.opener.forms['oversigt'].elements['vare[<?php $_GET['idx']?>]'].value = val;

Har desværre ingen internet derhjemme før onsdag igen. Og sidder på uni nu, så kan desværre ikke lige teste det nu.
Avatar billede softspot Forsker
17. november 2005 - 10:48 #10
Du vender bare tilbage når du er klar - jeg skal ingen steder (tror jeg nok :))...
Avatar billede softspot Forsker
17. november 2005 - 10:49 #11
I øvrigt mente jeg det, da jeg skrev:

window.opener.forms['oversigt'].elements['vare[]'][<?php $_GET['idx']?>].value = val;

da det er en indeksering i den anden dimension af elements-array'et...
Avatar billede tjensen Nybegynder
17. november 2005 - 10:54 #12
ja, sad også lidt og overvejede det efter jeg svarede..
Er bare vant til php, men åbenbart håndtere javascript arrays anderledes.

PHP
vare[1]=foo;
vare[2]=bar;

print "Vare: ".vare[1];  //Vare: foo
print "Vare: ".vare[2];  //Vare: bar
Avatar billede softspot Forsker
17. november 2005 - 10:55 #13
Bemærk at jeg også har ændret i koden til test2.php...
Avatar billede softspot Forsker
17. november 2005 - 10:56 #14
sludder test.php (men jo faktisk dem begge :))...
Avatar billede tjensen Nybegynder
17. november 2005 - 11:03 #15
Ja, det ser helt kanon ud. Ved det er det rigtige vi har fat i.
Jeg ender måske med at kende lidt til javascript en dag :)
Avatar billede softspot Forsker
17. november 2005 - 11:04 #16
Det er nogenlunde samme måde at håndtere arrays i javascript, men i og med at jeg har valgt at kalde felterne det samme (dvs. vare[]), så dannes der et "controlarray", hvilket betyder at jeg skal indeksere array-elementet for at få fat i det rigtige felt...
Avatar billede tjensen Nybegynder
17. november 2005 - 11:11 #17
okay.. hmm, men i php ville det se således ud hvis de var ens:

vare[]=foo;
vare[]=bar;

print "Vare: ".vare[0];  //Vare: foo
print "Vare: ".vare[1];  //Vare: bar
Avatar billede softspot Forsker
17. november 2005 - 14:11 #18
OK, jamen så er der vist alligevel forskel :)
Avatar billede tjensen Nybegynder
18. november 2005 - 09:47 #19
Det virker ikke. Her den som dit indlæg 10:32:02

Error: 'window.opener.forms.oversigt' is null or not an object
Code: 0

Der er også et problem med php i javascript. Man kan ikke aktivere php med <?php ?>
Giver fejl i java'et.

Jeg testede også med en entydig input, så jeg var sikker på det ikke var php fejlen. Men der komm også denne fejl:

Error: 'window.opener.forms.oversigt' is null or not an object
Code: 0
Avatar billede tjensen Nybegynder
18. november 2005 - 09:48 #20
Afsætter lige lidt flere pointz ;)
Avatar billede softspot Forsker
18. november 2005 - 10:29 #21
Nu har jeg lige prøvet at gå tilbage til ren HTML og er kommet frem til denne løsning som fungerer. Jeg har et hovedvindue (default.htm) og en popup (popup.htm).

Konklusion:
-----------
Det må være window.opener.document.forms['oversigt'] kombineret med at formularen har NAME-attribute i stedet for en ID-attribut som indeholder teksten oversigt, der finder formularen på hovedvinduet.


default.htm
------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Hovedvindue - Varer</title>
  <script type="text/javascript">
  <!--
  function findvare(sel){
    window.open('popup.htm?vis=test2&idx='+sel, 'findvare');
  }
  // -->
  </script>
</head>
<body>

  <form name="oversigt">
    <input type="text" size="8" NAME="vare[]"/><a href="#" onclick="findvare(0)">Find vare</a><br />
    <input type="text" size="8" NAME="vare[]"/><a href="#" onclick="findvare(1)">Find vare</a><br />
  </form>


</body>
</html>


popup.htm
----------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <title>Popup - vælg værdi</title>
  <script type="text/javascript">
  <!--
  var parts = window.location.search.substr(1).split('&');
  var idx = -1;
  for(var i=0; i < parts.length; i++) {
    if(parts[i].split('=')[0].toLowerCase() == "idx")
      idx = parts[i].split('=')[1];
  }
  alert('idx='+idx);
  function selectAndClose(val){
    if(idx > -1) {
      window.opener.document.forms['oversigt'].elements['vare[]'][idx].value = val;
      window.close();
    }
  }
  // -->
  </script>
</head>
<body>

  <a href="#" onclick="selectAndClose(301)">301</a><br />
  <a href="#" onclick="selectAndClose(308)">308</a><br />


</body>
</html>
Avatar billede tjensen Nybegynder
18. november 2005 - 11:04 #22
Jeps.. Har lige testet det, og det virker ganske fint. Lige efter planen!

Så må jeg selv igang med at omskrive det så det passer.
Jeg takker for hjælpen!
Smid lige et svar :)
Avatar billede softspot Forsker
18. november 2005 - 11:07 #23
Velbekomme :)
Avatar billede tjensen Nybegynder
18. november 2005 - 11:27 #24
For at ligger php varibaler ind i javascript'et, så sætter jeg bare php til at skrive hele js'et ;)
Avatar billede softspot Forsker
18. november 2005 - 11:31 #25
Ja, ok, men jeg kan bare ikke helt forstå hvorfor det skulle være et problem at indsætte PHP-kode i scriptet... men der er jo så meget jeg ikke forstår :)

Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester