Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zagmatwane :)
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
flasht
=> Sytuacja wyglada nastepujaco:
Mam index.html i frame w nim... w frame jest strona ktorej nie moge modyfikowac - strona z linkami otwierajacymi sie w nowym oknie.

=> Chcialbym:
Tak zakombinowac, zeby po kliknieciu w ktoregos linka nie tylko otwieralo sie okno z zawartoscia strony do ktorej sie link odnosi, ale takze zmieniala strona z ktorej kliknieto (cala niekoniecznie tylko frame) na jakas inna. Zaznaczam ze moge edytowac tylko index.html a nie strone z linkami sama w sobie.

=> Czy jest to mozliwe?
A jesli jest to mozliwe to bylbym wdzieczny za pomoc jak tego dokonac.

Pozdrawiam
FlashT
ActivePlayer
z frama robisz getElementsByTagName("a"); i dodajesz onclicka...
flasht
Cytat(ActivePlayer @ 2005-09-26 18:11:28)
z frama robisz getElementsByTagName("a"); i dodajesz onclicka...

Jak juz mowilem nie moge edytowac strony ktora jest w frame... moge edytowac tylko ta strone na ktorej ten frame jest umieszczony.
orson
witam ...

to nie ma znaczenia ... poprzez DOM odnosisz się do skruktury dokumentu wewnątrz ramki ... tam wyszukujesz dany link (np. po zawartości atrubutu href) i dodajesz mu event onclick ...

pozdrawiam
flasht
Cytat(orson @ 2005-09-26 18:38:19)
witam ...

to nie ma znaczenia ... poprzez DOM odnosisz się do skruktury dokumentu wewnątrz ramki ... tam wyszukujesz dany link (np. po zawartości atrubutu href) i dodajesz mu event onclick ...

pozdrawiam

Ok... ale ze gdzie ja mam wsadzic to GetElementById ? Bo sprawa wyglada mniej wiecej tak (kod skopiowany skads tam wiec prosze sie nie czepiac jakis brakujacych elementow):

http://debug.theweed.org/js

Moge edytowac tylko index.html a frame.html juz nie. Warto zwrocic uwage na to, ze funkcja ga ma sie rowniez wykonywac po kliknieciu.

Jakby ktos nie umial korzystac z prawego przycisku myszy:

Index.html
  1. <frameset framespacing="0" border="0" frameborder="0" rows="100%,*" noresize>
  2. <frame noresize src="frame.html">
  3. Blablabla.
  4. </head>
  5. </html>


Frame.html
  1.  
  2. <!--
  3. function ga(o,e){
  4. if (document.getElementById){
  5. a=o.id.substring(1);
  6. p = "";
  7. r = "";
  8. g = e.target;
  9. if (g) {
  10. t = g.id;
  11. f = g.parentNode;
  12. if (f) {
  13. p = f.id;
  14. h = f.parentNode;
  15. if (h) r = h.id;
  16. }
  17. } else{
  18. h = e.srcElement;
  19. f = h.parentNode;
  20. if (f) p = f.id;
  21. t = h.id;
  22. }
  23. if (t==a || p==a || r==a) return true;
  24. var newwin;
  25. linkstr=document.getElementById(a).href;
  26. newwin=window.open(linkstr);
  27. }
  28. }
  29. //-->
  30.  
  31. <tr height="68">
  32. <td id="taw1" style="cursor:pointer;cursor:hand" valign="top" onclick="ga(this,event)">
  33. <a id="aw1" class="googleheadline" target="_blank" href="http://wp.pl" onmouseout="window.status=''" onmouseover="window.status='htrhsgr'; return true;">Blablabla</a>
  34. <br><a id="aw1" class="googlelines" target="_blank" href="http://wp.pl" onmouseout="window.status=''" onmouseover="window.status='htrhtrh'; return true;">Tratatata</a>
  35. <br><a id="aw1" class="googlelink" target="_blank" href="http://wp.pl" onmouseout="window.status=''" onmouseover="window.status='tgrgrger'; return true;">Mumumumu</a>
  36. <br><br>
  37. </td>
  38. </tr>
  39.  
  40. </body>
  41. </html>


PS. Przyznaje sie bez bicia ze o JS nie mam zielonego pojecia... o Javie samej w sobie troszeczke.
orson
witam ...

hmm ... nie bardzo wiem z czym masz problem ... ta funkcja ga ... to jest twoja funkcja questionmark.gif co ona robi questionmark.gif bo narazie nigdzie nie jest wywoływana ...

a jeżeli chodzi o linki ... w index.html dodajesz kod który odwołuje się do ramki po jej id:
Kod
var frameDoc = document.getElementById('<frame_id>').contentDocument;

i potem normalne operacje na domie można robić tylko zamiast np. document.getElementsByTagName('a') dajesz frameDoc.getElementsByTagName('a') i masz wszystkie linki z dokumentu w ramce ... potem robisz na tej kolekcji fora i dodajesz event onclick=function (){ ga(<param1>, <param2>); }

pozdrawiam
edit:
kod pobierania dokumentu z ramki jest oczywiście zgodny ze specyfikacją w3c DOM więc nie działa w ie :| poniżej funkcja która zwraca dokument w zależności od przeglądarki:
Kod
function getIFrameDocument(aID){
        var rv = null;
      
        // if contentDocument exists, W3C compliant (Mozilla)
        if (document.getElementById(aID).contentDocument){
          rv = document.getElementById(aID).contentDocument;
        } else {
          // IE
          rv = document.frames[aID].document;
        }
        
        return rv;
      }

wywołanie zmieni się więc na takie:
Kod
var frameDoc = getIFrameDocument('<frame_id>');

dalej już tak samo ...
flasht
Cytat(orson @ 2005-09-27 10:07:37)
hmm ... nie bardzo wiem z czym masz problem ... ta funkcja ga ... to jest twoja funkcja questionmark.gif co ona robi questionmark.gif bo narazie nigdzie nie jest wywoływana ...

Nie to funkcja z frame i tylko taka podalem nie wazne co robi wazne ze ona tez ma byc wykonywana...

A jest wywolywana...

  1. <td id="taw1" style="cursor:pointer;cursor:hand" valign="top" onclick="ga(this,event)">


... i ma byc niezaleznie od tego co ja dodam.


...

Mecze sie z tym i jakos nie moge tego zrobic... moglbys bardzo pieknie prosze dac mi jakis konkretny przyklad?

W index.html daje:

<script>
<!--
var frame = null;
linki = null;

function getIFrameDocument(aID){
var rv = null;

if (document.getElementById(aID).contentDocument){
rv = document.getElementById(aID).contentDocument;
} else {
rv = document.frames[aID].document;
}

return rv;
}

frame = getIFrameDocument(frameID);
linki = frameDoc.getElementsByTagName('a');

(no i tutaj... niby jaka petla zeby wydobyc wszystkie "a"? da sie jakos jeszcze je przefiltrowac zeby to byly tylko linki do stron zawierajacych jakies slowo? np 'wp.pl' ?)


<poczatek petli>
for(i=1,i<=linki.count,i++){
linki[i].onClick=... ? a tutaj jak?questionmark.gif
}
<koniec petli>

//-->
</script>
orson
witam ...

tu masz błąd:
Kod
frame = getIFrameDocument(frameID);
linki = frameDoc.getElementsByTagName('a');

w moim przykładzie do zmiennej frameDoc przypisywałem wynik z funkcji ... skoro zmieniłeś tą zmienną to zmień ją wszędzie! powinno być tak:
Kod
frame = getIFrameDocument(frameID);
linki = frame.getElementsByTagName('a');

a co do pętli:
Kod
for(var i = 0; i < linki.length; i++){
    if (linki.item(i).innerText == 'wp.pl'){ //lub inny warunek
        linki.item(i).onclick= function (){
            window.open(this.href); // to sobie musisz sprawdzić czy we wszystkich przeglądarkach jest this ... - tu sięotwiera nowe okno z zawartością z linku
            document.location.href="http://www.onet.pl"; // tu tez nie jestem pewien czy tak można ... jak coś to document.getElmentById('id_iframe') - lub prarent.document exclamation.gif i src="http://www.onet.pl/" -- tu sie strona przeładowuje
        }
    }
}


pisane z palca ... na bank nie będzie działać winksmiley.jpg ale masz już jakiś szkielet ...

pozdrawiam
flasht
O... teraz to juz cos kumam, ale nie do konca smile.gif

Index.html wyglada teraz tak:

  1.  
  2. <frameset framespacing="0" border="0" frameborder="0" rows="100%,*" noresize>
  3. <frame id="frame0" noresize src="frame.html">
  4. Blablabla.
  5.  
  6.  
  7.  
  8. </head>
  9. <!--
  10. alert("jest"); //debug
  11.  
  12. var frame = null;
  13. linki = null;
  14.  
  15. function getIFrameDocument(aID){
  16. var rv = null;
  17.  
  18. if (document.getElementById(aID).contentDocument){
  19. rv = document.getElementById(aID).contentDocument;
  20. } else {
  21. rv = document.frames[aID].document;
  22. }
  23.  
  24. return rv;
  25. }
  26.  
  27. frame = getIFrameDocument("frame0");
  28. linki = frame.getElementsByTagName('a');
  29.  
  30. alert(frame); // debug
  31. alert(linki); // debug
  32.  
  33. for(var i = 0; i < linki.length; i++){
  34. linki.item(i).onclick= function (){
  35. document.location.href="http://www.onet.pl";
  36. }
  37.  
  38. }
  39.  
  40.  
  41. //-->
  42. </body>
  43. </html>


Ale...

1. W IE skrypt w ogole nie jest wykonywany.
2. W Operze skrypt jest zle wykonywany... znaczy... strona zmienia sie na onet.pl po kliknieciu ale nic innego sie nie dzieje... a mi zalezy na tym zeby funkcja ga() bylo wykonywana jak wczesniej i nie jest to funkcja ktora moge zmieniac bo jest w IFrame. Probowalem zmienic OnClick w powyzszym kodzie na OnRelease ale wtedy zachowuje sie jakby w ogole nie mial tego skryptu:( OnMouseDown i OnMouseUp tez nic nie zmienia...

Hmm... przed chwila sprawdzilem i juz w ogole nie dziala... w operze w sensie skrypt niby jest wykonywany - alerty sie pokazuja ale pozniej jakby go nei bylo.

Ok... juz doszedlem do tego, ze eventy trzeba pisac malymi literami bo inaczej nie dzialaja... (dziwne jakies)... teraz jak dalem onmousedown to wszystko jest wpozo smile.gif)) tylko ze w IE w ogole nie wykonuje tego skryptu... nawet debugowe alerty sie nei pokazuja sad.gif
orson
witam ...

dlatego że frameset (czyli dokument z ramkami) nie powinien mieć tagu body ... dodaj 2 ramkę 2x2 i w niej dokument ze skryptem ... tylko wtedy musisz zmienić troszkę skrypt ... w funkcji getIFrameDocument zmień document na parent.document (odwołujesz się z ramki to rodzica i z rodzica pobierasz obiekt dokument innej ramki ... trochę zagmatwane ale jak napiszesz to składnią kropkową to jest looz - wszystko widać) ... dalej nie zmieniaj ... event onclick jest wykonywany w kontekście dokumentu w ramce ...

pozdrawiam
flasht
A jeszcze jedna rzecz... potrzebuje sprawdzic czy link zawiera jakies slowo... chodzi mi o href a nie o to co jest pomiedzy <a> </a> ... jest jakas taka funkcja odpowiednik pos w delphi albo strstr w php ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.