爲了擴大您在這裏遇到問題的原因,您可能需要閱讀一些有關JavaScript範圍(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()函數。當您稍後嘗試調用該函數時,會出現問題,因爲打開的函數調用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對象的打開屬性是您需要的功能。然後你可以用MyFunctions.open()甚至window.MyFunctions.open()來調用它。
可能希望將它的open()函數重命名爲與window.open()相同的作用域() – Neps