Wątek przeniesiony 2023-04-07 10:28 z JavaScript przez Riddle.

Nowe okno o określonych wymiarach

0

Witam i proszę o wyrozumiałość - nie znam kompletnie javascript!
Znalazłem program (w załączniku), który właśnie adaptuję do swoich potrzeb, ale mam problem.
W każdej z tych kolorowych stron mam tabelę z linkami do wielu podstron o określonych wymiarach.
Użyłem skryptu:

<script>
<!--
onload=function(){
  for(i=0;d=document.getElementsByTagName('a')[i++];){
   if (d.href.match(/.*hotel\d+\.html/)){
     d.onclick=function(){window.open(this.href,'a','width=740, height=750, resizable=yes, scrollbars=yes, left=20, top=20');return false}
   }
  }
}
//-->
</script>

na stronie głównej i na każdej z kolorowych stron, ale niestety podstrony o zadanych wymiarach otwierają się w nowym oknie tylko na pierwszej stronie, a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.
Mogę prosić o rozwiązanie tego, pewnie błahego, problemu?

0

na stronie głównej i na każdej z kolorowych stron, ale niestety podstrony o zadanych wymiarach otwierają się w nowym oknie tylko na pierwszej stronie, a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.
Mogę prosić o rozwiązanie tego, pewnie błahego, problemu?

Pytanie co chcesz osiągnąć? Po co robisz te nowe okna właściwie?

a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.

Rozrysuj, co chcesz osiągnąć, bo ciężko mi to skonceptualizować, jak ma być docelowo.

0
LukeJL napisał(a):

na stronie głównej i na każdej z kolorowych stron, ale niestety podstrony o zadanych wymiarach otwierają się w nowym oknie tylko na pierwszej stronie, a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.
Mogę prosić o rozwiązanie tego, pewnie błahego, problemu?

Pytanie co chcesz osiągnąć? Po co robisz te nowe okna właściwie?

a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.

Rozrysuj, co chcesz osiągnąć, bo ciężko mi to skonceptualizować, jak ma być docelowo.

Dzięki za szybką odpowiedź.
Otóż mam tabelę na wielu kolejnych stronach, której ideę wziąłem z załączonego pliku demo (na głównej stronie " Tab one" jest widoczna jej pierwsza strona (czyli pierwsza tablica - A). I tam ten mój skrypt działa).
W tabelach (kolejne Tab two, Tab three, etc...czyli moje B C, D, E, F...) mam usystematyzowane alfabetycznie hotele, a kliknięcie na nazwę każdego z nich otwierać ma stronę z informacjami o tym hotelu. Otwiera, ale w tym samym oknie, a chciałbym, aby otwierała się w osobnym, mniejszym i w określonym miejscu. Tak jak na tej głównej stronie, na której działa mój załączony skrypt..
Czyli potrzebuję poprawionego/nowego skryptu lub dopisania do istniejącego z pliku demo jakichś komend, które dałyby efekt o jaki mi chodzi.
Mam nadzieję, że wytłumaczyłem dość jasno i uprzejmie poproszę o jakieś rozwiązanie!

0

Zmienna i używana w pętli for jest globalna i może kolidować z innymi zmiennymi o takiej samej nazwie w innych skryptach na stronie. Może to prowadzić do nieprzewidywalnego zachowania skryptu i problemów z otwieraniem linków w odpowiednich oknach.

Możesz zmienić sposób iteracji po elementach a na bardziej bezpieczny, korzystając z pętli forEach().
Ten skrypt iteruje po wszystkich elementach a, które znajdują się na stronie, a następnie dla każdego linku, który spełnia warunek z wyrażenia regularnego, dodaje funkcję onclick, która otwiera link w nowym oknie.

window.addEventListener('load', function() {
  var links = document.getElementsByTagName('a');
  Array.prototype.forEach.call(links, function(link) {
    if (link.href.match(/.*hotel\d+\.html/)) {
      link.onclick = function() {
        window.open(this.href, 'a', 'width=740, height=750, resizable=yes, scrollbars=yes, left=20, top=20');
        return false;
      };
    }
  });
});
0

Mógłbyś użyć np. target="_blank" i mieć to na poziomie HTMLa:

<a href="/hotel1.html" target="_blank">Hotel Jakiś</a>
<a href="/hotel2.html" target="_blank">Hotel Inny</a>

to by otworzyło linka w nowej karcie przeglądarki

chociaż dalej tak słabo rozumiem, co chcesz zrobić.

Otóż mam tabelę na wielu kolejnych stronach, której ideę wziąłem z załączonego pliku demo (na głównej stronie " Tab one" jest widoczna jej pierwsza strona (czyli pierwsza tablica - A). I tam ten mój skrypt działa).
W tabelach (kolejne Tab two, Tab three, etc...czyli moje B C, D, E, F...) mam usystematyzowane alfabetycznie hotele, a

Ale co trzymasz w tej tabeli? Jakieś dane o hotelach? Jak to wygląda? Może jakbyś wrzucił screena albo rysunek poglądowy.

a na kolejnych kolorowych stronach otwierają się w tym samym oknie i na całej stronie.

co to znaczy "kolejny" w tym kontekście? Co sprawia, że jedna strona jest "kolejna" po drugiej? W sensie chodzi o kolejność interakcji, że najpierw otwierasz A, a później otwierasz B?

podstrony o zadanych wymiarach

I czemu podstrony mają mieć zadane wymiary? W sensie - what the point, jak ktoś z komórki wejdzie czy z innego monitora niż twój i będzie miał dziwny efekt.

Jak chcesz, żeby coś miało jakiś rozmiar, to masz od tego CSS.

1

podstrony o zadanych wymiarach otwierają się w nowym oknie tylko na pierwszej stronie

Jestem w szoku, że w ogóle jakaś przeglądarka w 2023 nadal otworzyła Ci coś w zadanych wymiarach. Jaka to przeglądarka?

Generalnie traktuj window.open jako coś, czego nie powinieneś używać, bo może się to w ogóle nie otwierać, a wartości z wymiarami najczęściej będą kompletnie ignorowane.

Po prostu otwieraj to w nowej karcie poprzez zwykły tag <a href="" target="_blank" rel="noopener">. Koniecznie dodawaj "noopener", w innym przypadku pozostawiasz brzydką dziurę na swojej stronie.

Jeżeli bardzo przywiązałeś się do swojego kodu to po prostu zamień drugi parametr 'a' na '_blank'. Drugi parametr określa nazwę okna - klikasz 1 link i tworzy się "okno" o nazwie a, klikasz drugi i ponieważ okno a już istnieje to strona otworzy się w nim. _blank to taka magiczna zawsze nowego okna. Koniecznie jeżeli zostajesz przy paskudnym window.open dodaj noopener po przecinku do trzeciego parametru. Inaczej pozostawiasz dziurę o której wspomniałem wyżej.

0

@dzek69, dzięki za podpowiedź, ale to nic mi nie dało. Rzeczywiście pierwszy hotel otwiera się na nowej karcie, ale dużej, a następne tak jak przed zmianą, czyli w tym samym oknie i o wymiarach całego ekranu.

<!--
onload=function(){
  for(i=0;d=document.getElementsByTagName('a')[i++];){
   if (d.href.match(/.*hotel\d+\.html/)){
     d.onclick=function(){window.open(this.href,'_blank','noopener', 'width=740, height=750, resizable=yes, scrollbars=yes, left=20, top=20');return false}
   }
  }
}
//-->
</script>

Chyba, że coś zrobiłem nie tak...
Nie przywiązywałem się do window.open, po prostu znalazłem odpowiadające mi rozwiązanie gdzieś w sieci.

LukeJL, też dziękuję za zainteresowanie i zgodnie z Twoją sugestią podsyłam moje demo.
A info o hotelach w takich podstronach o mniejszych wymiarach fajnie wygląda na ekranie kompa. Na smartfonie, to rzeczywiście bez znaczenia...

Jeśli znalazłoby się jakieś bardziej eleganckie rozwiązanie mojego problemu, to uprzejmie poproszę. Tylko jedno - chciałbym zachować poniższy układ tabeli i jej stron.

<tr><td class="td1"><a href="hotelA1.html">A1</a></td>
<td class="td2"></td>
<td class="td5">101</td>
<td class="td3"></td></tr>
<tr><td class="td1"><a href="hotelA2.html">A2</a></td>
<td class="td2"></td>
<td class="td5">6</td>
<td class="td3"></td></tr>
0

Tak, wiem, średnik jest niepotrzebny. Ale czy jest czy go nie ma i tak nie otwiera mi stron tak, jak sobie wymyśliłem.

Tak, wiem też, że nic nie daje się otworzyć bezpośrednio z pliku, ale po poniższej informacji o błędzie nie wiem co mogę zrobić.

zablokowano żądanie do zasobu innego pochodzenia: zasady „Same Origin Policy” nie pozwalają wczytywać zdalnych zasobów z „file:///I:/MUZA/demo/page2.html” (żądanie CORS inne niż HTTP).

P.S. A nie wystarczy analiza kodu i javascript?

0
Blasius napisał(a):

<a href="hotelA1.html">A1</a></td>

Jak nazwałeś link hotelA1.html, a łapiesz to za pomocą if (d.href.match(/.*hotel\d+\.html/)){

to ci tego nie złapie, bo po hotel powinna być cyfra.

tylko że sam pomysł, żeby to łapać w ten sposób trochę z tyłka jest. Lepiej już dodać np. atrybut data-hotel albo coś do elementu <a> niż opierać działanie programu o to, jaki będzie url.

Przy czym piszę w kontekście pierwszego posta.

Jeśli natomiast wywalisz ten niepotrzebny JS z pierwszego posta (w sensie zmienisz rozwiązanie na czysto HTMLowe), to nie będzie miało znaczenia.

0

Dzięki za odpowiedź.
Oczywiście hotele w przykładzie źle nazwałem, ale w projekcie mają tylko cyfry.
Tylko jest jeden problem. Chciałbym pozostawić poniższy układ kodu hoteli:

A1</td>
1 </tr> A6 6

Dałoby się do niego dopasować jakiś skrypt?

P.S. Poprawiłem załącznik

0
A1</td>
1 </tr> A2 2 A3 2 > Miało być dodane powyższe...
0
<tr><td class="td1"><a href="hotel001.html">A1</a></td>
<td class="td2"></td>
<td class="td5">1</td>
<td class="td3"></td></tr>
<tr><td class="td1"><a href="hotel002.html">A2</a></td>
<td class="td2"></td>
<td class="td5">2</td>
<td class="td3"></td></tr>
<tr><td class="td1"><a href="hotel003.html">A3</a></td>
<td class="td2"></td>
<td class="td6">2</td>
<td class="td3"></td></tr>

Miało być dodane powyższe...

0

Dzięki za odpowiedź, ale nie, nie o takie rozwiązanie mi chodzi.
Może zacznę jeszcze raz:
Tak jak w przykładzie demo.7z. mam tabelę na stronach, powiedzmy od A do Z, w każdej mam kilkanaście/kilkadziesiąt hoteli.
Chcę, aby po każdym kliknięciu na dowolny hotel z dowolnej strony otwierał się on w tym samym nowym oknie o określonym wymiarze. I tylko tyle i aż tyle.
Jedynie chciałbym zachować układ kodu tabeli.
Poniższy kod robi to co chcę, ale tylko dla pierwszej strony.

<!--
onload=function(){
  for(i=0;d=document.getElementsByTagName('a')[i++];){
   if (d.href.match(/.*hotel\d+\.html/)){
     d.onclick=function(){window.open(this.href,'a','width=740, height=750, resizable=yes, scrollbars=yes, left=20, top=20');return false}
   }
  }
}
//-->
</script>

Dla zobrazowania daję printscreen jak ma to wyglądać.

P.S.1 Sorry za zaśmiecanie!
P.S.2 Niektóre puste komórki to miejsca na dodatkowe informacje, których celowo nie umieściłem, aby nie zaciemniać kodu.

0

Dobra.
Nie wiem czy tam te tabele masz w ramkach (iframe - a jeśli tak to lepiej użyj "srcdoc" albo "document.write()") czy nie ani czy planujesz zamykać to okno czy nie, więc odpiszę tak:

<!DOCTYPE html>
<html>
<body>

<p>Jesli okno jest otwarte to uzywam uchwytu do okna 
o nazwie "window.top.moje_okno" aby uzyc na tym oknie polecenia
location.assign() jesli jest zamkniete otwieram je i przypisuje do nazwy "window.top.moje_okno"</p>

<button onclick="if(window.top.moje_okno.closed || window.top.moje_okno=='closed'){
otwieram_okno();
}else{
window.top.moje_okno.location.assign(location.href);
}">1</button>

<button onclick="if(window.top.myWindow.closed || window.top.moje_okno=='closed'){
otwieram_okno();
}else{
window.top.moje_okno.location.assign(location.href);
}">2</button>

<script>
window.top.moje_okno="closed";

function otwieram_okno() {
window.top.moje_okno = window.open("",'a','width=740, height=750,
resizable=yes, scrollbars=yes, left=20, top=20');
  
  
}
</script>

</body>
</html>
0

Hmmm,
Dzięki za odpowiedź, ale:
po pierwsze nie bardzo rozumiem po co te przyciski 1 i 2 (Invalid or unexpected token), skoro mam w pliku javascript.js przypisane do odpowiednich liter alfabetu odpowiednie tabelki,
po drugie jak bym nie kombinował, to żądanego efektu i tak nie uzyskuję.
A tabelki są najzwyklejsze:

<table>
<tr>
<td>...</td>
<td>...</td>
</tr>
</table>

Może jakiś inny pomysł?

0

Twój projekt z pliku działa tak:

Tam nie widać żadnych tabel ani żadnych stron. Nic.

0

Wiem, pisałem już powyżej, że z pliku nie da się otworzyć:

Komp daje takie info:
    zablokowano żądanie do zasobu innego pochodzenia: zasady „Same Origin Policy” nie pozwalają wczytywać zdalnych zasobów z „file:///I:/MUZA/demo/page2.html” (żądanie CORS inne niż HTTP).


Poniżej skrócony, "goły" wygląd zwyczajnej tabelki i to nieszczęsne nowe okno.
Czy to naprawdę takie skomplikowane, a może moje wyjaśnienia o co mi chodzi są niejasne?
Ale przecież w gruncie rzeczy chodzi tylko o zwykłe otwieranie nowego okna za pomocą niezbyt skomplikowanego (chyba) javasript!
W demo.7z podałem wszystkie niezbędne pliki.

0

Korzystasz z AJAX ? JQuery ? Bez znajomości JavaScript? Napisz co chcesz osiągnąć - to dostaniesz projekt. Temat jest bardziej niż banalny.

0

Tak jak w przykładzie demo.7z. mam tabelę na stronach, powiedzmy od A do Z, w każdej mam kilkanaście/kilkadziesiąt hoteli.
Chcę, aby po każdym kliknięciu na dowolny hotel z dowolnej strony otwierał się on w tym samym nowym oknie o określonym wymiarze. I tylko tyle i aż tyle.
Jedynie chciałbym zachować układ kodu tabeli.<

Tak napisałem 4 odpowiedzi wstecz.
Nic się nie zmieniło. O to dokładnie mi chodzi!
Jeśli chodzi o używanie Ajax i JQuery, to przecież wynika z pliku demo3.html.
A że nie znam javascript, to dlatego poprosiłem Was o pomoc. W końcu w internetach można dopasować co sięchce, chociać tego co chcę (otwieranie nowego okna o określonym wymiarze) jakoś nie znalazłem, a znalazłem to forum.

0

Okno - nowa zakładka, nowe okno przeglądarki, ramka(iframe), teraz już np. DIV.

0

" Jeśli znalazłoby się jakieś bardziej eleganckie rozwiązanie mojego problemu, to uprzejmie poproszę. Tylko jedno - chciałbym zachować poniższy układ tabeli i jej stron."

<tr><td class="td1"><a href="hotel101.html">A1</a></td>
<td class="td2"></td>
<td class="td5">101</td>
<td class="td3"></td></tr>
<tr><td class="td1"><a href="hotel06.html">A2</a></td>
<td class="td2"></td>
<td class="td5">6</td>
<td class="td3"></td></tr>

Napisałem na 1 stronie powyższe.
Chodzi mi tylko o skrypt, który działałby w oparciu o najzwyklejszą tabelę, bez żadnych ramek!
I zastanawiam się dlaczego ten skrypt:

<script>
<!--
onload=function(){
  for(i=0;d=document.getElementsByTagName('a')[i++];){
   if (d.href.match(/.*hotel\d+\.html/)){
     d.onclick=function(){window.open(this.href,'a','width=740, height=750, resizable=yes, scrollbars=yes, left=20, top=20');return false}
   }
  }
}
//-->
</script>

działa tylko na pierwszej stronie  (A), a na pozostałych już otwiera hotele na pełnej stronie (B,C,D...)

0

I jest tak jak zwykle.
Albo pytanie jest tak banalne, że nie ma sensu odpowiadać, albo tak dziwne, że nie wiadomo jak odpowiedzieć.
Sądzę, że w moim przypadku to pierwsze stwierdzenie jest prawdziwe.
Pisałem, że javascript'u nie znam!
Ale mimo wszystko jeszcze raz uprzejmie proszę o jakiś prosty javascript, który otwierałby nowe, małe okno w przypadku używania na stronach i AJAX i jquery.

0

Witam Kolegę. Miałem podobny zgryz tylko dużo bardziej zagmatwany. Jako obiekt do wyświetlenia - gotowy plik PHP z miksem PHP, HTML'a, Javascript i czym tam jeszcze 'na pokładzie' który rysował w oknie przeglądarki piękne responsywne, skalowalne wykresy, tych okien do pokazania dla konkretnego zarejestrowanego użytkownika po kilka X ilość użytkowników (dla każdego coś innego do pokazania). Do tego trzeba to było pokazać w Wordpress CMS - dokleić niejako do istniejącej witryny firmowej. Po 'bolesnej' walce najbliższe celu i stabilne okazały się okna POP-UP. Używałem w WP bezpłatnych dodatków. Do obsługi POP-UP używałem https://wppopupmaker.com. Do obsługo wszelkich skryptów fajnie się sprawdziła wtyczka https://wpcode.com która bez dopłat 'łykała' mix PHP/HTML/Javascript. Być może warto skorzystać z POP-UP? Zawile się to obsługiwało - elementy do kliknięcia w celu otwarcia POP-UP'a trzeba było żmudnie dla każdego 'klikalnego' elementu zdefiniować, najpierw nadać ID# w edytorze WP potem zdefiniować zdarzenie otwarcia i tam podać ID# klikanego obiektu. Dało się ale dalej było boleśnie. Ale ostatecznym i 'czystym' rozwiązaniem okazał się stary dobry mechanizm iFrame z poziomu HTML'a. Dla każdego 'na sztywno' zdefiniowanego użytkownika tworzy się w dwie minutki nową stronę (u kolegi to ma być strona hotelu? czyli już istnieje!), dodaje z repozytorium dwa szablony, zmienia się i owszem ręcznie ale wygodnie w okienkach edytora WP odnośniki href i target|iframe_wind. W kolegi przypadku - na tej samej stronie gdzie są miniaturki obiektów - można by dać np. poniżej karuzeli 'klikalnych' miniaturek pole iFrame o zdefiniowanym rozmiarze które to pole bez problemu każda przeglądarka otworzy poprawnie (nazwa/identyfikator np. iFrame_wind) i jako target od klikanych miniaturek ustawić właśnie to iFrame_wind. U mnie dopiero ten stary sprawdzony mechanizm zadziałał. Bez zbędnego kodu, wyłapywania zdarzeń w skryptach Java, edytora POP-UP, user-snippet-cod'ów itp. Nie analizowałem dokładnie Kolegi wymagań ale ja bym poszedł obecnie w mechanizm iFrame. Open.Window()... zapomnieć. Gotowe POP-UP makery - dają radę. Ale dopiero proste mechanizmy iFrame HTML'a się sprawdziły. Ta sama strona. Modalne wstawione okienko gdzie można prosto wyświetlić w 10s a choćby i stronę Forum dyskusyjne poprzez proste wywołanie w href i skierowanie do iFrame_wind. Może Koledze nie - ale być może komuś pomogę w jego poszukiwaniach. Ja w każdym razie odetchnąłem z mechanizmami iFrame... Pozdrawiam Jarek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1