Niedawno Klient poprosił mnie, żeby kilka linków otwierało się w nowym oknie. Niestety XHTML 1.0 Strict, z którego korzystam nie pozwala na deklarację target="_blank". Pozostają zatem inne sposoby. Jednym z nich jest napisanie, przy wsparciu framework’a jQuery, krótkiego kodu otwierającego linki właśnie w nowym oknie.

Można to zrobić na dwa sposoby. Pierwszy to otwieranie w nowym oknie wszystkich linków, które zawierają jakąś klasę, na przykład newWindow. Kod wygląda następująco:

  1. $("a.newWindow").click(function() {
  2. window.open(this.href);
  3. return false;
  4. });

Sprawę można również rostrzygnąć w bardziej inwazyjny sposób, to znaczy deklarując chęć otwarcia nowego okna dla każdego linka, który nie odnosi się do naszej strony. Jest to oczywiście złe rozwiązanie, bo przeważnie „nowych okien” nie potrzeba więcej niż dwóch lub trzech. Niemniej jednak, rozwiązanie występuje. I wystarczy zamienić linijkę

  1. $("a.newWindow").click(function()

na

  1. $("a:not([href*='nazwa.dom'])").click(function()

Jak widać, jedyna różnica to zmiana selektora – wyłapuje teraz wszystkie linki, które prowadzą na adres inny, niż strony, z której pochodzą. Można też dodać na przykład atrybut title, mówiący że strona otworzy się w nowym oknie. Robimy to używając funkcji attr (można skorzystać również z łączenia funkcji):

  1. $("a.newWindow").attr("title","Link otwiera się w nowym oknie");

Można zrobić też deklarację w CSS, która doda znany i lubiany symbol ↗ – oznaczający, nie od dziś zresztą, link zewnętrzny:

  1. a[href^="http://"]:not([href*="nazwa.dom"])::after {
  2. content: "\2197";
  3. }

Oczywiście ten „trick” nie działa w IE6, ponieważ ta przeglądarka nie rozpoznaje ani ::before ani ::after. Dlatego można zrobić jeszcze jedną linijkę w jQ, i dodać strzałkę właśnie przez nią. Pomaga tu fajna funkcja append, i tak jak w poprzednim przypadku, można również użyć łączenia:

  1. $("a.newWindow").append("↗");

Naturalnie nie pochwalam używania ani jednego, ani drugiego rozwiązania, bo wielu użytkowników narzeka na nowe okna, ale wiadomo, czasem Klient wymaga, i na to nie ma rady.