繁体   English   中英

javascript window.open不起作用

[英]javascript window.open doesn't work

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

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

更改功能的名称。

window对象是JavaScript中的顶级对象,它本身包含其他几个对象,例如“document”,“history”等。

当您定义自己的变量或函数时,您确实向窗口对象添加了一个新属性。 这将工作(和一个小实况示例 ):

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() ,你递归调用你的函数。

只是为了扩展你在这里遇到问题的原因,你可能想要阅读一些关于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()后,将返回对它的引用作为object属性的值:open。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM