2012-09-15 70 views
0

有人可以幫我嗎?Javascript:我怎樣才能'宣佈'一個函數而不需要調用它?

下面的代碼工作,但不幸的是一個函數調用DoSomething的()是必要的:

<body onload=init()> 
</body> 

<script> 
    function Startscreen() 
    { 
     this.doSomething(); //why is this call necessary and how else to solve it? 
     this.startscreenhtml = 
      " <form onsubmit=doSomething()> " + 
      "  <input type=text />   " + 
      " </form>       "; 
     document.write(this.startscreenhtml); 
    } 
    Startscreen.prototype.doSomething = function() 
    { 
     alert(123) 
    } 
</script> 

<script> 
    function init() 
    { 
     var startscreen = new Startscreen();  
    } 
</script> 

我也想保持功能DoSomething的作爲對象啓動畫面的功能。

編輯:我想使用document.write

Preferrably我要聲明,我現在所做的構造之外DoSomething的保持,因爲我相信,否則的話我會叫新的啓動畫面多次,該相同的功能被創建多次。

但是,我嘗試了很多事情,使得這個工作沒有調用doSomething,包括聲明構造函數內的函數,但沒有任何工作。 我的猜測是,調用是必要的,使功能已知,因爲如果代碼是自上而下讀取,我即時分配給'onsubmit'之前我宣佈它。

有人知道如何解決這個問題嗎?

回答

2

我不認爲代碼的工作原理與您現在的想法相同。當您創建表單時將調用doSomething函數,但在您提交表單時不會調用它。

要從onsubmit事件調用的函數,它在全球範圍內被稱爲,作爲事件處理函數不是在Startscreen實例的情況下調用。由於兩個原因,使用當前的代碼無法調用該函數。從全局上下文無法實現,並且由於沒有對該對象實例的引用,因此甚至沒有可以用來調用它的實例。

(你可以得到從樣機的功能,或創建對象的新實例,但隨後與對象的設置將會是完全沒有意義的。)

如果你想保留的情況下,你有把它在生存的init函數的變量:

var startscreen; 
function init() { 
    startscreen = new Startscreen();  
} 

現在的對象仍然將圍繞當onsubmit事件處理程序被調用,這樣你就可以通過變量達到功能:

this.startscreenhtml = 
    "<form onsubmit="startscreen.doSomething()">" + 
    "<input type=text />" + 
    "</form>"; 

這當然不是理想的,因爲你將對象與變量耦合在一起,但是我希望你能夠獲得關於正在發生的事情的一些知識,以便你能夠挺身而出。


若要在提交事件的方法,而無需一個全局變量來找到它,你必須創建一個元素,讓你可以掛鉤的實際功能的事件處理程序。這樣,你可以達到從事件處理程序的方法:

// make a local variable that you can capture in a closure 
var me = this; 
var frm = document.createElement("form"); 
// make an anonymous function that will create a closure capturing "me" 
frm.onsubmit = function(){ 
    me.doSomething(); 
}; 

這意味着你不能使用document.write創建表單(或者你需要給每一個形成唯一的ID,這樣就可以得到一個參考到創建的元素並在事件後連接事件)。

+0

非常感謝這個解決方案,雖然它並不像您說的那樣理想,我不想事先知道我會做什麼變數名稱。然而,起初你說我的doSomething函數在我提交表單時不會被調用......但它會是......?只是在創建表單時(這是我想擺脫的副作用)。希望你會回覆,並感謝評論 – Jeroen

+0

順便說一句,我得到你的解釋關於沒有一個(引用一個)實例留在當事件處理程序做它的事情,但仍然代碼工作(我測試它在鉻)。所以也許最初的呼叫(我想要一個不同的解決方案)使得這個實例在全局範圍內已知 - 明確地說 - 或者將函數提升到全局水平..或者我不知道我只是在猜測,但它仍然有效......在我的原始文章中的代碼,doSomething將被調用時,我提交 – Jeroen

+0

@Jeroen:我不明白'onsubmit'事件可能如何調用該方法。調用方法不註冊是全局範圍內的一項功能。你必須在頁面中的某處添加更多的代碼才能實現。無論如何,我在如何從沒有全局變量的事件處理程序中獲取方法的問題上增加了一些更多內容。 – Guffa

相關問題