2008-11-07 108 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。

对不起,我应该仔细阅读你的代码。