只是为了扩展您在这里遇到问题的原因,您可能需要阅读一些关于 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() 调用它。