2013-06-13 20 views
5

Po pierwsze, nie mam prawdziwego problemu. Pytam o to tylko z ciekawości.javascript: void (0) i target = "_ blank" zachowanie

Przypadkowo natknąłem się na dziwne zachowanie podczas korzystania z javascript:void(0) i target="_blank" w tym samym łączu, w ten sposób.

<a href="javascript:void(0);" target="_blank" /> Link </a> 

stwierdziliśmy, że Chrome jest do pracy normalnie i nic nie robić po kliknięciu w link, natomiast IE i Firefox otworzyć pustą nową kartę.

Moje pytanie brzmi, czy to nie jest javascript:void(0) ma zapobiegać uruchamianiu każdego kliknięcia z linku, nawet jeśli jest skierowany na nową kartę/okno? I dlaczego nad nim stoi target="_blank"?

Co jest najlepszym podejściem, jeśli mam, powiedzmy, wypełnianie atrybutu href za pomocą jakiegoś języka backendu i wolę kod target="_blank" na stałe z atrybutem href?

+1

Myślałem, że 'javascript: void (0);' został uznany za złą praktykę. – j08691

+1

Lepszym rozwiązaniem byłoby nie używanie pustych znaczników zakotwiczających, zamiast używania stylów rozpiętości. – tymeJV

+0

Jak moja odpowiedź nie zapewniła odpowiedzi? Podany przeze mnie kod jest zgodny z oczekiwaniami - wygląda jak link, ale niczego nie odwiedza. Poprosiłeś o najlepsze podejście, podałem moje najlepsze podejście. – Zdenek

Odpowiedz

1
<a href=# onclick="return false;">I look like a link!</a> 

Zawsze używane.

EDYCJA: Na twoje pytanie dotyczące void (0), onclick ma mieć wyższy priorytet niż atrybut href, ponieważ zapewnia bogatszą funkcjonalność i ma zdolność uniemożliwiającą działanie href - czyli mój return false. Href jest dostępny tylko dla robotów i starych przeglądarek, jeśli występuje zdarzenie onclick.

Oprócz tego, czy przeglądarka jest wykonywana z dziwnie ukształtowanymi adresami URL, zależy również od przeglądarki. Jeśli link zaczyna się od skrótu, powinien po prostu przejść do zakładki. Ale kiedy jest pusta lub zawiera inne protokoły, wszystko zależy od przeglądarki, jeśli zdecyduje się spróbować odwiedzić nowy dokument. Wprowadzanie pseudo-protokołu javascript: jest tradycyjnie używane w skryptozakładkach, które powinny działać z bieżącą stroną, więc wszystko, co powinno być zrobione pod , które nie ma wartości document.write() lub innej niszczycielskiej modyfikacji, powinno być niezadane.

EDIT2: Nie jestem pewien, co masz na myśli przez język backendu w href, ale zastanów się nad poprawnymi atrybutami HTML data-, aby dać swojemu kodowi do pracy, jeśli nie jest to logiczne w atrybucie href.

+0

Ten wpis jest automatycznie oznaczany jako niska jakość, ponieważ jest to tylko kod. Czy możesz rozszerzyć go, dodając tekst wyjaśniający, w jaki sposób rozwiązuje problem? – gung

+1

Odpowiedź pomogła mi, może nie dostarczyć odpowiedzi na questiion, ale kiedy wpisujemy "javasxcript: void (0) open new page" w google, ta pomoc na stronie! dzięki Ci –

0

Rozwiązałem to, używając prostej sztuczki. To może być przydatne.

Dynamicznie usunąłem atrybut docelowy na podstawie linku. tzn. jeśli link jest niezdefiniowany lub pusty lub javascript: void (0), wówczas usuniemy atrybut docelowy za pomocą poniższego kodu.

Jeśli link jest poprawny, dodamy atrybut docelowy dla hiperłącza ("drugi warunek" spowoduje to, ponieważ na mojej stronie linki są dynamiczne).

Skopiowałem próbkę pliku html (Test.html). jeśli chcemy usunąć atrybut na stronie pobierania, skopiuj kod skryptu w tym pliku i wklej go na końcu wymaganego pliku.

Jeśli chcemy zastosować to do linków dynamicznych, musimy umieścić ten kod w jednej funkcji i możemy go wywołać, gdy jest to wymagane.

Ten kod będzie stosowany do wszystkich hiperłączy na tej stronie.Możemy ograniczyć to do konkretnego zestawu linków za pomocą klasy lub innych atrybutów.

Test.html 
--------- 

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> 
<a href="javascript:void(0);" target="_blank">Link1</a> 
<a href="javascript:void(0);" target="_blank">Link2</a> 
<a href="www.url1.com" target="_blank">Link3</a> 
<a href="www.url2.com" target="_blank">Link4</a> 

<script> 
$("a").each(function() { 

if(typeof(this.href) == 'undefined' || this.href == 'javascript:void(0);') { 
    $(this).attr('href', 'javascript:void(0);'); 
    $(this).removeAttr('target'); 
} 
if(typeof(this.href) != 'undefined' && this.href != 'javascript:void(0);') { 
    var s_link = this.href; 
    if (s_link.indexOf('http://') === -1 && s_link.indexOf('https://') === -1) { 
     s_link = 'https://' + s_link; 
    } 
    $(this).attr('href', s_link); 
    $(this).attr('target', '_blank'); 
} 

}); 
</script> 
Powiązane problemy