【问题标题】:Getting the ID of an embedded ASP Object using JavaScript and jQuery使用 JavaScript 和 jQuery 获取嵌入式 ASP 对象的 ID
【发布时间】:2010-09-21 06:47:24
【问题描述】:

ASP.NET (2.0) 下拉列表的更改事件由 jQuery 处理时,我正在使用 jQuery 尝试触发一个方法。问题是下拉列表位于 gridview 内,即使这样,也只有当用户决定编辑该 gridview 中的一行时。

我想我让它使用 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);
}

这是你的意思吗?

顺便说一句,以上没有奏效。没有错误,只是没有任何事件起作用。

【问题讨论】:

  • 我也喜欢使用类选择器方式 Ben 但我读到它的执行速度不如 DOM 访问快,是这样吗?每个实例也会有相同的类吗?

标签: asp.net jquery datagridview drop-down-menu css-selectors


【解决方案1】:

这里有几件事。

  1. 当您将选择器传递给$() 函数时,您需要将它们用引号括起来。上面的代码 sn-p 会生成类似$(#some-generated-id) 的东西,这不起作用。
  2. 服务器端的右大括号 if 语句位于 onready 函数之外。它需要嵌套在与开头 if 相同的级别。

试试这个:

$(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。

【讨论】:

    【解决方案2】:

    使用这个:

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

    不创建脚本标签是错误的,因为您包含它们。 MSDN 文档在解释标志的方式上是错误的。

    另外,只需将控件的客户端 ID 放入与后面代码不同的变量中,而不是 jQuery 代码。

    然后在 jQuery 代码中使用包含 id 的变量。

    【讨论】:

      【解决方案3】:

      在您在后面的代码中创建的脚本块内:

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

      我没有验证这个语法,但它应该很接近。您可以自己添加 grvTimeSheets.ClientID 的附加语法。如果你得到这个工作,那么你可能想要改变它来构建一个 JavaScript 数组并以这种方式存储 ClientId,然后你只有一个需要使用的全局 JavaScript 变量。

      【讨论】:

        【解决方案4】:

        另一种选择是只为您正在寻找的元素提供一个描述其行为的类名。然后你的 jQuery 代码就变得非常清晰了:

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

        如果没有编辑行,则此代码不执行任何操作。如果有与选择器匹配的元素,您将获得添加的新行为。

        【讨论】:

          【解决方案5】:

          如果您没有在页面的其他地方使用相同的 ID,您可以使用 jQuery 的高级选择器之一来阻止 ASP.NET 的 UniqueID:

          $('[id$=ddlClients]')
          

          这仅匹配 id 字符串的结尾而不是整个。请记住,如果控件在不同行中多次出现,这将匹配所有实例。

          请参阅 Selectors 了解更多示例。

          【讨论】:

            【解决方案6】:

            我使用 Page.ClientScript 属性注册了一个脚本块,以包含我需要使用 jQuery 访问的任何 ID。

            这是我在外部文件中的 JavaScript 示例:

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

            myControlId 是从后面的代码中定义的,并在 ClientScriptBlock 中注册。

            【讨论】:

              【解决方案7】:

              密钥可以是任何你想要的,但它应该是唯一的。

              【讨论】:

                【解决方案8】:

                我会在周末之后尝试更多。不过,这是代码:

                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);
                

                【讨论】:

                  【解决方案9】:

                  因为您在每一行都有一个下拉菜单。每个下拉菜单都有一个唯一的 ClientId,所以我建议按照 Ben 的建议做,并使用类选择器,因为它是最简单的解决方案。

                  或者您可以在编辑点击时创建一个 JavaScript 函数,然后在正在编辑的那一行中获取您的下拉列表的唯一客户端 ID。

                  抱歉,我应该仔细阅读您的代码。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-10-02
                    • 2019-04-11
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-11-24
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多