2013-02-25 52 views
1

代碼javascript函數我已經準備好一個文件裏面的函數:訪問從後面

$(document).ready(function() { 
    function test1() { 
     alert('successful'); 
    } 
}); 

現在,在後面的代碼(C#)我有這樣的:

ScriptManager.RegisterStartupScript(this, typeof(Page),"Con121", "test1();", true); 

這不會有彈出警惕......但如果我將它從預備功能中取出,效果還是不錯的。 我需要這個在準備工作。

我甚至嘗試沒有成功這樣做:

$(document).ready(function() { 
    window.test1 function test1() { 
     alert('successful'); 
    } 
}); 
+0

你爲什麼試圖在另一個函數裏面聲明一個函數?這看起來很奇怪!你說你需要這個在準備就緒 - 請你能詳細說明這個陳述來解釋爲什麼你必須這樣做嗎? – 2013-02-25 12:55:54

+0

您需要全局聲明它。 – Red 2013-02-25 12:55:59

+0

你的第二個例子是無效的JavaScript語法。 – 2013-02-25 12:58:04

回答

2

嘗試:

var test1; 

$(document).ready(function() { 
    test1 = function() { 
     alert('successful'); 
    } 
}); 

這裏的問題就是範圍界定。由於您在另一個函數(ready)內聲明瞭函數test1,因此您從代碼隱藏創建的啓動腳本將無法從ready函數以外訪問它。

另外,您需要確保啓動腳本在jQuery.ready之後被觸發,否則您可能會嘗試調用未分配的變量。

最後,如果函數不需要從ready中明確聲明,只需將它完全移出那裏,以便函數聲明和賦值都將存在於全局範圍中。

+0

值得注意的是,準備好的JS文檔會在Page_Load後面的代碼後被調用,因此可能會導致另一個呃逆。 – webnoob 2013-02-25 12:59:03

+0

@webnoob:注意。 – 2013-02-25 13:02:03

+0

我想這是我的問題,因爲我想要做的是在頁面加載中... – FrankP 2013-02-25 13:33:13

0

(的一部分),你的問題是,你的ScriptManager.RegisterStartupScript調用使test1();調用某個地方在它立即執行你的網頁的HTML,但$(document).ready(function() { ... });包裹定義的test1意味着函數不存在,被稱爲直到該頁面,包括該呼叫,已經被加載。

沒有理由等待文檔準備好定義您的函數,那麼爲什麼不直接定義它呢?

或者,爲什麼不刪除ScriptManager.RegisterStartupScript並立即在呼叫test1();後定義?這會在頁面加載完成後立即調用它:

$(document).ready(function() { 
    function test1() { 
     alert('successful'); 
    } 
    test1(); 
});