2013-03-15 23 views
0

我想獲得一箇舊的ASP經典項目作爲ASP.NET webfroms解決方案啓動並運行,並且出現了將javascript連接到ASP控件的問題。下面是在.aspx代碼:Javascript getElementById無法看到ASP服務器控件

<asp:TextBox id="groupOwner2" CssClass="textbox" Runat="server" Enabled="False" TextMode="SingleLine"></asp:TextBox> 

這應該操縱它看起來像這樣的JavaScript,並試圖清除文本框:

function OnChange() { 
// clear existing data 

document.getElementById('<%=groupOwner2.ClientID%>').value = "";} 

原來,在JavaScript控件參考看起來像這樣:

document.Form1.elements["groupOwner2"] 

而且這也沒有工作(不出意外)。我已經嘗試了一些這些變體,但沒有任何工作,我剛剛得到「腳本被觸發時,JavaScript運行時錯誤:無法設置未定義或空引用的屬性'值」。爲了記錄,該腳本正在被另一個控件觸發,這就是爲什麼在文本框ASP代碼中未提及onChange()函數的原因。

任何輸入將不勝感激!

+0

不要使用服務器端代碼構建JavaScript。你的HTML屬於'.html'文件,你的CSS屬於'.css'文件,同樣你的JS屬於'.js'文件。使用'[class]'屬性,並根據類進行選擇。 ASP使得ID變得混亂​​。 – zzzzBov

+0

@zzzzBov「類」不一定是選擇元素的最佳方式。看看爲什麼Facebook使用'data-sigil'屬性。 http://www.phabricator.com/docs/javelin/article/Concepts_Sigils_and_Metadata.html –

+3

您是否驗證過生成的腳本與生成的HTML中的ID匹配? –

回答

4

的問題,你的最新言論來看,是代碼:

document.getElementById('<%=groupOwner2.ClientID%>').value = ""; 

包含在.js文件,該文件(默認)不由ASP.NET引擎處理。即使這樣,它也無法解析客戶端ID,因爲它是完全獨立的HTTP請求。

解決辦法有兩個:

1)創建於.ASPX頁的全局變量,像:

<script> 
var GROUP_OWNER_ID = '<%=groupOwner2.ClientID%>'; 
</script> 

然後,在你的.js文件,你可以這樣做:

document.getElementById(GROUP_OWNER_ID).value = ""; 

2)在網頁控件上使用靜態ID:

<asp:TextBox id="groupOwner2" CssClass="textbox" Runat="server" Enabled="False" TextMode="SingleLine" ClientIDMode="Static"></asp:TextBox> 

請注意ClientIDMode屬性。無論如何,這將導致ID爲總是groupOwner2。然後,您可以只使用:

document.getElementById('groupOwner2').value = ""; 
+0

爲了避免js命名空間污染,在.aspx頁面中使用javascript命名空間模式更好:_var YourAwsomeAppSpace = YourAwsomeAppSpace || {}; YourAwesomeAppSpace.GROUP_OWNER_ID ='<%= groupOwner2.ClientID%>'; _ – AardVark71

+0

這正是我需要學習的東西。謝謝邁克! – DevNoob

0

嘗試...

'<%= Page.[yourpage].FindControl("ContentPlaceHolder1").FindControl("groupOwner2").ClientID %>' 
+0

沒有骰子。試過我的頁面定義和「ContentPlaceHolder1」兩個是和實際的ContentPlaceHolder ID,MainContent。不過謝謝! – DevNoob

0

使用的ClientIDMode =「靜態」 你可以把頁面指令或專門就控制你使用。

然後下面的代碼完美地工作。 document.getElementById('controlID');

然後controlID始終保持不變。你不需要使用clientid。

相關問題