2012-02-07 71 views
14

私はwindow.open(nameパラメータなし)をプロジェクトに散らばっていて、名前が指定されていない場合はデフォルト名を指定するように実装を変更したいとします。window.open機能をオーバーライドする方法は?

私がこれについてしたいのは、window.openを実行するたびにwindow.open(nameパラメータを指定して)を呼び出す独自のメソッドを内部的に呼び出すように、独自のメソッドをwindow.openにフックすることです。

Javascriptで可能ですか?これにwindow.open関数を呼び出すカスタム関数を呼び出すという循環依存関係の問題はありますか?

p.s.私がやりたいことは、window.openの機能をオーバーライドすることです。

答えて

26

円コールを避けるには、元のwindow.open関数を変数に置き去りにする必要があります。

良い方法(グローバル名前空間を汚染しない)は、クロージャを使用することです。元のwindow.open関数を引数として無名関数に渡します(下記のopen)。この無名関数は、フック関数のファクトリです。私は、この返信が少し遅れているけど、私はもっと一般的な解決策は、のために役立つかもしれないと感じました

window.open = function (open) { 
    return function (url, name, features) { 
     // set name if missing here 
     name = name || "default_window_name"; 
     return open.call(window, url, name, features); 
    }; 
}(window.open); 
+0

ここで何が起こっているのか説明できますか?私はJSに精通していない。私は恐れている。 –

+0

私は上記のアップデートでそれを説明しました。私はこれ以上深いことはできないと思う。私は次のことを読むことをお勧めします:1.関数スコープと呼び出し/適用の方法。モジュールパターン。 –

+0

これはJSエラーを出しています:Microsoft JScript実行時エラー:オブジェクトがプロパティまたはメソッド 'call'をサポートしていません –

4

P.s. In simple terms what I want to do is override the window.open functionality.

var orgOpen = window.open; 

window.open = function (url, windowName, windowFeatures) { 
    alert("Overrided!"); 
    return orgOpen(url, windowName, windowFeatures); 
} 

window.open("http://www.stackoverflow.com"); 
+2

1. Pollutesグローバル名前空間。 2.フック関数は引数を使用しません。 3.フック関数は新しいウィンドウオブジェクトを返しません。 4.これはどのように機能しましたか? –

+1

名前空間の汚染についてはあまり気にしません。 – georg

9

:あなたのフック関数は、恒久的にopen引数を経由して、元のwindow.open関数にバインドされています他の人(他の方法を上書きしようとしています)

+1

オブジェクトの機能をフックするきれいな一般的な方法 –

関連する問題