我想使用window.open
打开一个JSP文件的窗口。但浏览器一直显示connecting..
。每当我点击文字时,甚至萤火虫都会停止工作。 p
和input
标记都不起作用,但当我使用href
链接JSP时,它可以链接到文件:
<!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>
答案 0 :(得分:10)
那是因为您在定义函数open时重新定义了window.open
。改为使用不同的函数名称。
答案 1 :(得分:6)
更改功能名称。
答案 2 :(得分:5)
窗口对象是JavaScript中的顶级对象,它本身包含其他几个对象,例如“document”,“history”等。
当您定义自己的变量或函数时,您确实向窗口对象添加了一个新属性。这将有效(并且有点活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()
时,你递归调用你的函数。
答案 3 :(得分: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);
因此,通过将open()定义为不在另一个元素内部的函数(也就是说,在根元素内),您将覆盖window.open()函数。当您稍后尝试调用该函数时,您会遇到问题,因为open函数调用window.open,它调用window.open,它调用window.open ...
有几种方法可以解决这个问题 -
在线定义onclick处理程序
为此,摆脱整个<script>..</script>
元素,然后使用您选择的任何元素(支持它)添加onclick属性:
onclick="window.open('hello.jsp','window','status=1,height=700, width=800');"
这是一个很好的快速方法,它使用它的触发元素保持所有逻辑,但它不容易扩展,你可能会发现自己被一些人嘲笑。 (“哦,你使用内联 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()之后,对它的引用将作为object属性的值返回:open。
所有这一切的结果是MyFunctions对象的open属性是你需要的函数。然后,您可以使用MyFunctions.open()甚至window.MyFunctions.open()调用它。