21

Firefox 6 のアドレス バーで次の JavaScript コードを実行してみました。

javascript:alert("Hello")

私は得る

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

以前は Firefox 5 で問題なく動作していましたが、Opera、Safari、Chrome でも引き続き動作します。これを修正するにはどうすればよいですか?

4

3 に答える 3

21

を使用しているようjavascript:で、data:URL (アドレスバーに直接) は現在、このコメントに従って許可されていません:

参考までに、このバグを複数の短期および長期の修正に分割する予定です。

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

そして、これが最新版で解消された「バグ」です。最後のコメントには次のようにも記載されています。

javascript: は実際には無視されません - それらは実行されますが、期待される通常の DOM メソッドを持たない「空の」コンテキストで実行されるため、最も一般的な使用法 (例: javascript:alert(1)) は単に (したがって、事実上無視されます)。ただし、javascript:1+1 は問題なく動作します。

今:

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

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

于 2011-07-10T20:30:43.053 に答える
10

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

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

于 2011-07-10T20:36:51.783 に答える
1

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

Scratchpad からの実行に対するボタンの利点:

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

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

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

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

グローバル関数 ( setTimeout、 または などalert) を直接使用する代わりに、それらの前に置き、 /をローカル/theWindow.に置き換える必要があります。これは機能しているようです。ただし、非常に複雑なケースでは完全にテストしていません。documentwindowtheDocumenttheWindow

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

于 2012-03-07T15:58:30.783 に答える