2012-11-14 24 views
5

window.openを使用して、自分のJSPファイルの1つにウィンドウを開きます。しかし、ブラウザはconnecting..を表示し続けます。そして、テキストをクリックするたびに火かぶりが止まります。どちらpinputタグは動作しませんが、私はJSPをリンクするhrefを使用する場合には、ファイルにリンクすることができます:あなたはopen関数を定義したときにwindow.openを再定義しているためだjavascript window.openが機能しません

<!DOCTYPE html> 
<html> 
<head><title>Sample JSP Page</title> 
<script> 
function open(){ 
    //window.open("hello.jsp","hello","height=700, width=800"); 
    var x=window.open("hello.jsp","window","status=1,height=700, width=800"); 
    x.focus(); 
} 
</script> 
</head> 
<body> 
<h1>Sample JSP Page</h1> 
<p onclick="open()">do not work</p> 
<form> 
<input type="button" value="new window" onclick="window.open('test-with-utils')"></form> 
</body> 
</html> 
+2

open()関数の名前をwindow.open()と同じ名前に変更したい場合があります。 – Neps

答えて

10

を。代わりに別の関数名を使用してください。

+0

非常に巧妙です!私は同じような問題で時間をかけました。ありがとうございました! – rigon

+0

ライフセーバー。ちょうどこれに遭遇しました:P –

6

機能の名前を変更します。

5

ウィンドウオブジェクトは、など、「ドキュメント」、「歴史」など、いくつかの他のオブジェクトは、JavaScriptのトップレベルのオブジェクトであり、それ自体に含まれてい

あなたは変数や、独自の関数を定義します実際にウィンドウオブジェクトに新しいプロパティを追加します。そして、これが機能(およびexampleライブちょっと)します:

また
var foo = "bar"; 
alert (window.foo); // says "bar" 

あなたのコードに、この小さなスニペットを追加した場合:

window.onerror = function (msg, url, num) { 
    alert ("Error: " + msg + "\nURL: " + url + "\nLine: " + num); 
    return true; 
}; 

あなたがボタンを押したときに、このエラーが発生します。

Error: Uncaught RangeError: Maximum call stack size exceeded 

これは無限の再帰を意味します。これは副作用です。新しい関数を定義し、window.open()を呼び出すと、関数を再帰的に呼び出します。

+0

+1良い説明 – prageeth

1

あなたがここで問題を抱えているという理由で拡張するだけで、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()を使用して呼び出すことができます。

関連する問題