web-dev-qa-db-ja.com

Firefox6でJavaScriptアラートが機能しない

Firefox6のアドレスバーでこのJavaScriptコードを実行してみました。

javascript:alert("Hello")

私は

ReferenceError:アラートが定義されていません。

以前はFirefox5で正常に動作していましたが、Opera、Safari、Chromeでも動作します。これを修正するにはどうすればよいですか?

21
Ryan

javascript:およびdata: URL(アドレスバーに直接)の使用は現在許可されていないようです このコメントによる

参考までに、私はおそらくこのバグを複数の短期的および長期的な修正に分割するつもりです。

短期:JavaScriptの貼り付けを禁止:URLバーへのURL
長期:JavaScriptを実行する前に、ブックマークレットをブックマークマネージャーで「ホワイトリストに登録」する必要があります

そして これは「バグ」です最新バージョン で解決されました。 最後のコメント も次のように述べています。

javascript:は実際には無視されません-実行されますが、期待される通常のDOMメソッドがない「空の」コンテキストであるため、最も一般的な使用法(javascript:alert(1)など)は(javascript:alert(1)など)をスローするだけです。したがって、事実上無視されます)。ただし、javascript:1 +1は正常に機能します。

今:

これを修正するにはどうすればよいですか?

あなたはできません、あなたは彼らが適切な解決策を決定するまで待たなければなりません。コメントが言ったように、ブックマークレットは機能しますが、明示的に許可する必要があります。コードをテストしたいだけの場合は、 Firebug または新しい Scratchpad 機能のいずれかを使用してください。

21
Felix Kling

Felixの回答は、URLバーのjavascript:が機能しなくなった理由を正しく示しています。

replacementこれは、Webページをデバッグしようとしている場合、Webコンソールです(エラーコンソールと混同しないでください)。コンパクトメニューでは、WebDeveloperの下にあります。フルメニューバーの[ツール]の下にあります。または、ctrl-shift-K(Macの場合はcmd-shift-K)を押すこともできます。大なり記号の付いたバーはJavaScriptプロンプトです。そこに入力されたコードは、現在のページのコンテキストで評価されます。下線が引かれているそのバーの上の領域にあるものはすべてクリックして、検査ウィンドウを表示できます。

10
zwol

クリック可能なブックマークレットが壊れて元に戻したい場合は、代わりに カスタムボタン Firefox拡張機能を使用してクリック可能なボタンを作成できます。

スクラッチパッドから実行する場合のボタンの利点:

  • あなたは実際にブックマークレット(ボタン)を保存することができます、
  • 素敵な独自のアイコンを使用できます(PNGファイルなどの画像を作成し、インポートして、新しいボタンダイアログ内でbase64_encodeします)。

ボタンはFirefox chrome level)で実行されるため、拡張機能は少し特別です。したがって、ボタンはもう少し特権があります。 (ブラウザのAPIと対話できます)、通常のJSとボタンコードの間に1対1の対応はありません(微調整が必​​要です) 。より正確には、ボタンから見たdocumentwindowは、期待していたものではありません。

ただし、「good」windowおよびdocumentを変数に割り当ててから、代わりにこれらの変数で作業することができます(ウィンドウを再定義しない方がよい)。

これが私が書いたサンプルコードで、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);

グローバル関数(setTimeoutalertなど)を直接使用する代わりに、それらの前にtheWindow.を置き、document/windowをローカルtheDocument/theWindowに置き換える必要があります。しかし、非常に複雑なケースでは、徹底的にテストしていません。

ボタンを追加するには、既に持っているボタンを右クリックし、[新しいボタンを追加...]を選択します。

1
jakub.g