5

我想用window.open一个窗口打开我的 JSP 文件之一。但是浏览器一直显示connecting..。每次我单击文本时,甚至萤火虫都会停止工作。pinput标签都不起作用,但是当我使用 ahref链接 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>
4

4 回答 4

10

那是因为你在window.open定义函数 open 时已经重新定义了。请改用其他函数名称。

于 2012-11-14T04:45:02.120 回答
6

更改函数的名称。

于 2012-11-14T04:45:08.297 回答
5

The window object is the top level object in JavaScript, and contains in itself several other objects, such as "document", "history" etc.

When you define a variable or a function of your own you really add a new property to the window object. And this will work ( and a little live example ):

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

In addition if you add this little snippet to your code:

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

you will get this error, when press the button:

Error: Uncaught RangeError: Maximum call stack size exceeded

This means an endless recursion. It is a side effect - you define a new open function, and when you call window.open(), you recursively call your function.

于 2012-11-14T05:30:00.107 回答
1

只是为了扩展您在这里遇到问题的原因,您可能需要阅读一些关于 javascript Scope 的内容(非常有用的博客)。本质上,考虑以下代码:

<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() 后,对它的引用作为对象属性的值返回:open。

这一切的结果是 MyFunctions 对象的 open 属性就是你需要的函数。然后,您可以使用 MyFunctions.open() 甚至 window.MyFunctions.open() 调用它。

于 2012-11-14T05:47:31.863 回答