あなたがここで問題を抱えているという理由で拡張するだけで、javascript Scope(Very Helpful Blog)について少しお読みください。基本的に、次のコードを考えてみます。
<script>
var thisOne=true;
function thatOne() {
alert("whizbang");
}
var theOther={foo:"bar"};
//More code here...
</script>
コメントを達すると、あなたはif (thisOne) {...}
、element.onclick=thatOne;
またはconsole.log(theOther.foo)
のように、直接これらの変数や関数にアクセスすることができます知っています。ただし、Webブラウザでwindow
と呼ばれるルートオブジェクトの子としてアクセスすることもできます。だから、行うことができます。
console.log(window["thisOne"]);
window.thatOne.call(obj, params);
console.log(window.foo.bar);
をそう(オープン定義することによって)(と言うことです、ルート要素の内部にある)他の要素内にない機能として、あなたは、window.open()関数を上書きします。後でこの関数を呼び出そうとすると、window.openを呼び出すwindow.openがwindow.openを呼び出すため、問題が発生します。
これを回避する方法はいくつかあります。
onclick="window.open('hello.jsp','window','status=1,height=700, width=800');"
:
これを行うにはonclickのハンドラをインライン
を定義し、(それはそれをサポートしています)あなたが選択したいずれかの要素使用して、その後、全体<script>..</script>
要素を取り除くにはonclickの属性を追加します
これはすばらしい素早い方法であり、トリガー要素を使ってすべてのロジックをそのまま維持しますが、容易に拡張できず、一部の人にはびっくりするかもしれません。(「ああ、あなたはインラインはJavaScriptを使用していますか?どのように趣のある」)
変更メソッド名を
これは(あなたが持っているものから今働いて自分のページを取得するという点で、あなたからの最低の労力がかかります基本的に他の誰もが示唆していることです)。 openメソッドの名前をopenANewWindow()やgotoJSP()などの名前に変更するか、ルートオブジェクトにまだ存在しないものを変更します(スクリプト要素内で定義する場所と使用する場所の両方を取得します)それ(onclick属性内)。
利用閉鎖
これは、この場合には、ほぼ間違いなくあなたが望んでいないものです、あなたは、単一の機能のために必要以上の複雑さ。これをルートオブジェクトから抜け出す方法の例としてこれを含めるだけで、その中にいるものがあなたの問題の核心であるように見えます。
あなたは既にjavascriptでオブジェクトを定義する方法を知っているかもしれませんが、オブジェクトを定義することによって、実際にはルートオブジェクトにオブジェクトプロパティを追加するだけです。この振る舞いをあなたの利点に利用して、関数に階層構造を与えることができます。例えば
:
<script>
var MyFunctions = (function() {
function open(){
var x=window.open("hello.jsp","window","status=1,height=700, width=800");
x.focus();
}
return {open:open};
})();
</script>
これはすぐに実行された無名関数を作成します。この関数のスコープの中では、別の関数open()が定義されていますが、ルートオブジェクト(ウィンドウ)ではなく、その無名関数のスコープ内で定義されています。 open()が定義されると、そのオブジェクトへの参照がopen:オブジェクトプロパティの値として返されます。
この結果、MyFunctionsオブジェクトのopenプロパティが必要な機能になります。 MyFunctions.open()またはwindow.MyFunctions.open()を使用して呼び出すことができます。
open()関数の名前をwindow.open()と同じ名前に変更したい場合があります。 – Neps