2011-07-10 23 views
21

Próbowałem działa ten kod JavaScript w pasku adresu w Firefoksie 6:alert JavaScript nie działa w Firefox 6

javascript:alert("Hello") 

dostaję

ReferenceError: alert not defined.

Kiedyś działać prawidłowo w Firefoksie 5, choć i nadal działa w Operze, Safari i Chrome. Jak to naprawić?

+0

Jak to zrobić? – Ryan

+0

@Ryan: Robiąc dokładnie to, co zrobiłeś z moją odpowiedzią: Zaakceptuj odpowiedź, która pomogła ci najbardziej. Powinieneś wrócić do starszych pytań i zrobić to. –

Odpowiedz

21

Wydaje użyciu javascript: i data: URL (bezpośrednio w pasku adresu) nie są obecnie dozwolone as per this comment:

FYI, I'm probably going to split this bug into multiple, short and longer term fixes.

Short term: disallow pasting of javascript: URLs into the URL bar
Longer term: additionally require that bookmarklets be "whitelisted" in the Bookmark Manager before it can run JavaScript

And this is the "bug" który został rozwiązany w latest version. last comment stwierdza również:

javascript: is not actually ignored - they're run, but in an "empty" context that doesn't have any of the usual DOM methods you would expect, so most common uses (e.g. javascript:alert(1)) just throw (and thus are effectively ignored). javascript:1+1 works fine, though.

Teraz:

How do I fix this?

nie można, trzeba czekać aż postanowili odpowiedniego rozwiązania. Zgodnie z komentarzem bookmarkslety działają, ale muszą być jawnie dozwolone. Jeśli chcesz przetestować kod, użyj funkcji Firebug lub nowej funkcji .

+0

Dwie osoby, które odnoszą się do tego samego zgłoszenia błędu w ciągu 25 sekund od siebie. : D Usunąłem odpowiedź, ponieważ jest to bardziej szczegółowe. – Quentin

+3

Ta "poprawka" właśnie zrujnowała dwumiesięczny projekt, nad którym pracowałem. :( – GeReV

+7

@GeRev, która musiała być piekłem bookmarkletu ... –

10

Odpowiedź Felixa poprawnie stwierdza, dlaczego javascript: na pasku adresu nie działa.

W przypadku tej opcji, jeśli próbujesz debugować swoją stronę internetową, jest to konsola internetowa (nie mylić z konsolą błędów). W kompaktowym menu znajduje się pod Web Developer; na pełnym pasku menu znajduje się w menu Narzędzia. Możesz też nacisnąć ctrl-shift-K (cmd-shift-K na Macu). Pasek z wyższym znakiem jest znakiem zachęty do JavaScript; wprowadzony tam kod zostanie oceniony w kontekście bieżącej strony. Wszystko w obszarze powyżej paska, który jest podkreślony, można kliknąć, aby wyświetlić okno inspektora.

+1

+1 dla konsoli internetowej ... Słyszałem, ale o tym zapomniałem;) –

+0

* * command + alt + K na Macu. Smutny dzień, będę tęsknić za wpisywaniem javascript w pasku adresu ... –

1

Jeśli twoja klikalna bookmarklet została zerwana i chcesz ją odzyskać, możesz utworzyć przycisk klikalny zamiast tego używając rozszerzenia przeglądarki Firefox Custom Buttons.

Zalety przycisk nad systemem z Brudnopisie:

  • rzeczywiście można Zapisz bookmarkletu (przycisk),
  • można mieć piękny własną ikonę (tworzenie jakiś obraz np PNG , zaimportuj go i base64_encode w nowym oknie dialogowym przycisku).

Rozszerzenie jest nieco szczególny, ponieważ przyciski uruchamiane w Firefoksie chrom poziomie, więc są one nieco bardziej uprzywilejowany (można wchodzić w interakcje z API przeglądarki), a nie ma korespondencja 1-do-1 pomiędzy normalnym JS a kodem przycisku (potrzebuje kilku poprawek). Dokładniej, document i window widziane z przycisku nie są tymi, których oczekiwałeś.

Jednak można przypisać „dobre” window i document do zmiennych, a następnie pracować na tych zmiennych zamiast (lepiej nie przedefiniować okna;)

Oto przykładowy kod napisałem który działa całkiem dobrze w FX10 :

// get proper 'window' and 'document' into our private variables 
var theWindow = window.top.getBrowser().selectedBrowser.contentWindow; 
var theDocument = theWindow.document; 

// here we go 
var input = theDocument.getElementById("foo"); 
input.focus(); // just to show you it's working, unnecessary in fact 

// simulate keyboard event 
var evt = theDocument.createEvent("KeyboardEvent"); 
evt.initKeyEvent ("keypress", true, true, theWindow , 
      0, 0, 0, 0, 0, 65); // 65 == "A" 
input.dispatchEvent(evt); 

// show alert after 2 sec 
theWindow.setTimeout(function(){ 
    input.value += "B"; 
    theWindow.alert(input.value); // alerts "AB" 
},2000); 

Zamiast używać funkcji globalnych bezpośrednio (jak setTimeout lub alert), trzeba umieścić theWindow. przed nimi, i zastąpić document/window z lokalnym theDocument/theWindow i wygląda na to, że działa. Nie testowałem go jednak dokładnie w bardzo skomplikowanych przypadkach.

Aby dodać przycisk, kliknij prawym przyciskiem myszy na przycisk, który już masz i wybierz "Dodaj nowy przycisk ...".