2008-11-07 39 views
1

我正在使用jQuery嘗試並在jQuery處理ASP.NET(2.0)下拉列表的更改事件時觸發方法。問題在於下拉列表位於gridview內部,即使在用戶決定在該GridView中編輯行時也是如此。使用JavaScript和jQuery獲取嵌入式ASP對象的ID

我想我已經拿起使用ASP代碼塊的對象,但問題是,當頁面第一次加載該行的編輯索引不存在,它會引發錯誤。將該塊放入IF語句中也不起作用。

$(document).ready(function() //when DOM is ready, run containing code 
{ 
    <% if (grvTimeSheets.EditIndex > -1) {%> 
     $(#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>).change(function() { 
      $(#<%= grvTimeSheets.ClientID %>).block({ message: null } 
     }); 
} 
); 
<% } %> 

這是我做的一個嘗試,我也嘗試將IF語句的ASP代碼放在JavaScript塊之外。它也不起作用。

我該如何將jQuery事件應用到下拉框?儘可能簡潔。


感謝您的回答,但不,它不工作:(。JavaScript代碼,似乎不輸出...混亂...

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="jquery.tablesorter.js"></script> 
<script type="text/javascript" src="jquery.blockUI.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() //When DOM is ready, run the containing code 
    { 

    } 
    ); 
</script> 

是輸出。儘管這是代碼:

<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript" src="jquery.tablesorter.js"></script> 
<script type="text/javascript" src="jquery.blockUI.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() //when DOM is ready, run containing code 
    {<% if (grvTimeSheets.EditIndex > -1) {%> 
     var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>'; 
     $(id).change(function() { 
      $(id).block({ message: null } 
     }); 
    <% } %> 
    } 
    ); 
</script> 

有人在這之前還有,我都快瘋了


對不起,你能否做得更清楚些。我試圖在後面的代碼中定義完整的東西,例如:

DropDownList ddl (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients"); 
if (ddl != null) 
{ 
    ClientScriptManager csm = Page.ClientScript; 
    Type cstype = this.GetType(); 
    String csname1 = "PopupScript"; 

    string script = @" 
    <script language='javascript' type='text/javascript'> 
    $(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>"; 
      csm.RegisterStartupScript(cstype, csname1, script, true); 
} 

這就是你的意思?

BTW,上面沒有工作。沒有錯誤,只是沒有事件的工作。

+0

我喜歡使用類選擇器的方式太Ben但我讀它不像DOM訪問一樣快,是真的嗎?每個實例也會有相同的類別? – OutOFTouch 2008-11-07 17:41:29

回答

2

幾件事情在這裏。

  1. 當您將選擇器傳遞給$()函數時,需要用引號括住選擇器。上面的代碼片段生成類似$(#some-generated-id),這將無法正常工作。
  2. 右大括號爲您的服務器端的if語句是onready功能之外。它需要嵌套在開放的同一級別。

試試這個:

$(document).ready(function() //when DOM is ready, run containing code 
{ 
    <% if (grvTimeSheets.EditIndex > -1) {%> 
     var id = '#<%=grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients").ClientID %>'; 
     $(id).change(function() { 
      $(id).block({ message: null } 
     }); 
<% } %> 
} 
); 

如果它不工作,繼續和粘貼生成的JavaScript以及。

1

我使用Page.ClientScript屬性來註冊一個腳本塊來包含我需要用jQuery訪問的任何id。

這是我的JavaScript在外部文件中的一個示例:

var myFancySelector = '#' + myControlId; 
selectedValue = $(myFancySelector).val(); 

myControlId從後面的代碼和registerd在ClientScriptBlock定義。

1

使用此:

cs.RegisterClientScriptBlock(cstype, csname, cstext2.ToString(), False) 

它是假的,因爲你是包括他們不要創建腳本標籤。 MSDN文檔在解釋標誌的方式上是錯誤的。

此外,只需將您的控件的客戶端ID從代碼背後分離變量,而不是jQuery代碼。

然後在jQuery代碼中使用包含id的變量。

0

關鍵可以是任何你想要的,但它應該是唯一的。

0

我會在週末後再試一次。這是代碼,但:

DropDownList ddl = (DropDownList)grvTimeSheets.Rows[grvTimeSheets.EditIndex].FindControl("ddlClients"); 
if (ddl != null) 
{ 
    ClientScriptManager csm = Page.ClientScript; 
    Type cstype = this.GetType(); 
    String csname1 = "PopupScript"; 

    string script = @" 
    <script language='javascript' type='text/javascript'> 
    jQuery(#" + ddl.ClientID + ").change(function() { $(" + grvTimeSheets.ClientID + ").blockUI({ message: null }});} </script>"; 
    csm.RegisterStartupScript(cstype, csname1, script, false); 
1

裏面,你在後面的代碼創建自己的腳本塊:

string script = @"<script type=text/javascript> var myControlId = '" + ddl.ClientId "';") + "</script>" 

我沒有驗證這個語法,但它應該是接近。您可以自己添加grvTimeSheets.ClientID的附加語法。如果你得到這個工作,那麼你可能想要改變它來構建一個JavaScript數組並存儲ClientId的方式,然後你只有一個全局的JavaScript變量需要使用。

1

另一個選擇是給你要找的類名描述它的行爲的元素。然後你的jQuery代碼變得非常清晰:

$(function() { 
    $("select.yourMarkerClass").change(....); 
}); 

如果沒有編輯行,那麼這段代碼什麼都不做。如果存在與選擇器匹配的元素,則會添加新的行爲。

1

如果你不使用的頁面上的其他地方相同的ID,就可以阻止的ASP.NET的UniqueID與jQuery的先進的選擇之一:

$('[id$=ddlClients]') 

這只是ID字符串的結尾,而不是匹配整體。請記住,如果控件在不同行中存在多次,則會匹配所有實例。

請參閱Selectors更多示例。

0

因爲每行都有一個下拉菜單。每個下拉菜單都會有一個Unique ClientId,所以我建議按照Ben的建議進行操作,並使用類選擇器,因爲它是最簡單的解決方案。

或者您可以在您的編輯點擊創建JavaScript函數,然後在正在編輯的行中獲取您的下拉列表的唯一客戶端ID。

對不起,我應該仔細閱讀你的代碼。