2012-07-12 52 views
3

我正在研究一個JavaScript函數,它接受三個控件的名稱,然後在頁面上找到它們。有五套這些控件。爲了簡單起見,我想使用相同的函數並傳入一組控制名稱,然後讓該函數通過clientID動態查找控件。有沒有辦法做到這一點?如何動態查找使用javascript的控件的ClientID?

這裏是我迄今爲止...

 function InsertKeyword(keywordCtrl, subjCtrl, bodyCtrl) { 
      var ctrl; 
      if (OnSubj) ctrl = $find("<%=" + subjCtrl + ".ClientID%>"); 
      if (OnBody) ctrl = $find("<%=" + bodyCtrl + ".ClientID%>"); 
      if (OnSubj == 1 || OnBody == 1) { 
       var selectedIndex = document.getElementById(keywordCtrl).selectedIndex; 
       var selectedText = document.getElementById(keywordCtrl).options[selectedIndex].text; 
       var strSpan = '<u>' + selectedText + '</u>&nbsp'; 
       ctrl.pasteHtml(strSpan); 
      } 
     } 

這並不工作,但它說明了什麼,我試圖做的。

如何動態查找使用javascript的控件的ClientID?

+3

我想你混淆了客戶端和服務器端的工作...''<%= %>如何是一個服務器端命令 – freefaller 2012-07-12 13:50:33

回答

3

<%= %>是服務器端,而不是客戶端代碼,所以不是...

if (OnSubj) ctrl = $find("<%=" + subjCtrl + ".ClientID%>"); 
if (OnBody) ctrl = $find("<%=" + bodyCtrl + ".ClientID%>"); 

你應該有類似...

if (OnSubj) ctrl = $find("<%=subjCtrl.ClientID%>"); 
if (OnBody) ctrl = $find("<%=bodyCtrl.ClientID%>"); 

subjCtrlbodyCtrl是實際服務器端控制對象。

你可以讓你的JavaScript工作的唯一辦法是,如果你調用的函數是這樣的......

InsertKeyword("my keyword", "<%=subjCtrl.ClientID%>", "<%=bodyCtrl.ClientID%>"); 

再有你的JavaScript像...

function InsertKeyword(keywordCtrl, subjCtrl, bodyCtrl) { 
    var ctrl; 
    if (OnSubj) ctrl = $find(subjCtrl); 
    if (OnBody) ctrl = $find(bodyCtrl); 

UPDATE

根據OP的評論,不可能在使用<%= %>語法時使用通過標記在服務器端控件上聲明OnClientClick屬性。

以下將無法正常工作,<%=myCtrl.ClientID%>將呈現與發送到瀏覽器時一模一樣......

<asp:Button runat="server" ID="test" OnClientClick="myFnc('<%=myCtrl.ClientID%>')"/> 

相反,你需要通過這些方法之一來設置通過後臺代碼(C#假定)的屬性...

test.OnClientClick = "myFnc('" + myCtrl.ClientID + "');"; 
test.OnClientClick = string.Format("myFnc('{0}');", myCtrl.ClientID); 
+0

我喜歡你的答案,但我試過了,只傳入了字符串「<%= txtSubject.ClientID%>」,而不是控件的客戶端ID。 – ks78 2012-07-12 14:03:42

+1

@ ks78,你確定ASP.NET正在處理服務器上的「<%= txtSubject.ClientID%>」嗎?如果它包含一個'.js'文件(例如),那麼該文件將被簡單地抽出到瀏覽器,而不需要任何處理 – freefaller 2012-07-12 14:04:51

+0

@ ks78,記住只有包含服務器端控制對象的page/usercontrol可以提供' ClientID'(除非你已經設置了方法/屬性/會話變量/ etc來檢索該值) – freefaller 2012-07-12 14:07:03

0

你不能做到這一點:

「<%=」 + subjCtrl + 「.ClientID%>」

您需要:

「<%= codeBehindControlID.ClientID%> 「

+0

正確。這就是爲什麼它不起作用。有另一種方法嗎? – ks78 2012-07-12 13:51:17

+0

什麼不起作用?你的代碼還是我的? – 2012-07-12 13:52:06

0

如何使用CSS選擇器來獲得控制匹配在ASP.NET clientID的最後一部分,就像這樣:

$.find('input[name$='+subjCtrl+']:checked'); 

未經測試,但它應該是這樣的。

編輯:我不知道你正在使用什麼控件,但這是一個例子。如果你發佈你的ASP.NET標記,也可以提供更詳細的信息。

+0

我對CSS選擇器知之甚少,但不是指客戶端控件名稱? – ks78 2012-07-12 14:05:42

1

如果我沒有理解,那麼你問我想你想控制的ID在JavaScript中。如果您使用的是Asp.Net 4,請設置控件ClinetIDMode = Static。現在在javascript中輸入相同的控件ID。例如,如果你有一個ID myControl則控制在JavaScript中,你可以把它作爲

var cID = document.getElementByID('myControl');