【问题标题】:DOM Navigation with JQuery in ASP.Net在 ASP.Net 中使用 JQuery 进行 DOM 导航
【发布时间】:2009-04-14 19:56:38
【问题描述】:

我已经编写了下面的 JQuery,并且不得不使用多次调用 .parent() 在 DOM 中搜索项目,因为在 ASP.Net 中呈现的 ClientID 是在 html 中动态构建的。我知道每次我们更改标记代码时都会出现问题,并且想看看是否有人知道在 ASP.Net 中执行此操作的更好方法。

<script language="jquery" src="js/jquery-1.3.2-vsdoc2.js" type="text/javascript">
</script>
<script src="js/jquery.color.js" type="text/javascript">
</script>
script language="javascript" type="text/javascript">
    $(document).ready(function() {

    //Get the cost of the base item, then add the cost of the selected compoents as 
    //they get selected.    
    $(".AspNet-CheckBoxList > ul > li > input").click(function() {

        var itemCost = 0;

        $(this).find("fieldset:div:span");

        itemCost =  GetItemCost($(this).parent().parent().parent().parent()
        .parent().parent().parent().children().find("span").text());
        var Component = $(this).next("label").text();

        if ($(this).attr("checked") == true) {
            itemCost = (itemCost + GetItemCost(Component)).toFixed(2);               
        }
        else {
            itemCost = (itemCost - GetItemCost(Component)).toFixed(2);
        }

        $(this).parent().parent().parent().parent().parent()
        .parent().parent().children().find("span").text("$" + itemCost);
        $(this).parent().parent().parent().parent().parent()
        .parent().parent().children().find("span").animate( 
        { backgroundColor: "#FFFF66" }, 300)
         .animate({ backgroundColor: 'white' }, 750);
      });

   });

function GetItemCost(text) {
    var start = 0;
    start = text.lastIndexOf("$");

    var itemCost = text.substring(start + 1);       

    var pattern = /,/g;
    itemCost = itemCost.replace(pattern, "");       

    return Number(itemCost);
}
</script>

这是从渲染页面的源代码复制的一些html

<fieldset id="ctl00_ContentPlaceHolder1_ctl00_FieldSet" class="parent">
<legend>
</legend>
<a id="ctl00_ContentPlaceHolder1_ctl00_ImgLink" class="imgcontainer">
</a>
<div>
<input id="ctl00_ContentPlaceHolder1_ctl00_RemoveCartItem" type="image" 
    alt="Remove Item" src="img/buttons/remove_4c.gif" 
    name="ctl00$ContentPlaceHolder1$ctl00$RemoveCartItem"/>
<span id="ctl00_ContentPlaceHolder1_ctl00_TotalItemCost">$315.96</span>
</div>
<ol id="ctl00_ContentPlaceHolder1_ctl00_InputList">
<li class="pt">
<label id="ctl00_ContentPlaceHolder1_ctl00_ProjectLabel"   
for="ctl00_ContentPlaceHolder1_ctl00_ProjectValue">Project</label>
<input id="ctl00_ContentPlaceHolder1_ctl00_ProjectValue" type="text"  
name="ctl00$ContentPlaceHolder1$ctl00$ProjectValue"/>
</li>
<li class="pt">
<label id="ctl00_ContentPlaceHolder1_ctl00_TaskLabel"    
for="ctl00_ContentPlaceHolder1_ctl00_TaskValue">Task</label>
<input id="ctl00_ContentPlaceHolder1_ctl00_TaskValue" type="text"  
name="ctl00$ContentPlaceHolder1$ctl00$TaskValue"/>
</li>
<li id="ctl00_ContentPlaceHolder1_ctl00_ComponentsLI">
<span>Specify</span>
<fieldset id="ctl00_ContentPlaceHolder1_ctl00_ComponentsFieldSet"  
class="fieldsetlist">
<legend>Software Components</legend>
<div id="ctl00_ContentPlaceHolder1_ctl00_SoftwareComponentsCheckList" class="AspNet- 
CheckBoxList">
<ul class="AspNet-CheckBoxList-RepeatDirection-Vertical">
<li class="AspNet-CheckBoxList-Item">
<input id="ctl00_ContentPlaceHolder1_ctl00_SoftwareComponentsCheckList_0"  
type="checkbox" value="2305"     
name="ctl00$ContentPlaceHolder1$ctl00$SoftwareComponentsCheckList$0"/>
<label for="ctl00_ContentPlaceHolder1_ctl00_SoftwareComponentsCheckList_0">Another  
Cool Component $1,000.00</label>
</li>
<li class="AspNet-CheckBoxList-Item">
<input id="ctl00_ContentPlaceHolder1_ctl00_SoftwareComponentsCheckList_1"  
type="checkbox" value="2306"   
name="ctl00$ContentPlaceHolder1$ctl00$SoftwareComponentsCheckList$1"/>
<label for="ctl00_ContentPlaceHolder1_ctl00_SoftwareComponentsCheckList_1">Software   
Assurance $274.89</label>
</li>
</ul>
</div>
</fieldset>
</li>
</ol>
</fieldset>

【问题讨论】:

  • 您是否暗示您不能在 aspx 标记中使用服务器端标记 ?
  • 是的,按照我的理解,它们在呈现的 html 中被转换为具有长连接的唯一性,如下所示:
  • @Russ- 我想我不太明白问题出在哪里。您可以将服务器端标签与 jQuery 一起使用,例如$("#") 并且将使用生成的客户端 ID 呈现在 HTML 中,即 $("#ctl00_ContentPlaceHolder_myOriginalId")。这是你需要的吗?
  • 看看这个答案的一些选项 - stackoverflow.com/questions/497802/…
  • 标签: jquery dom navigation


    【解决方案1】:

    这可能对您有所帮助:要在 JavaScript 中获取 ASP .NET 控件的 ID,请在您的 JavaScript 代码中使用类似这样的服务器标签:

    $("#<%=lblMyAspNetLabel.ClientID %>").text("test");
    

    其中 lblMyAspNetLabel 是您的 aspx 页面上的 asp:Label 控件的 ID。

    【讨论】:

      【解决方案2】:

      您可以使用attribute ends with selector:

      $("tag[id$='ServerSideId']") 
      

      其中 ServerSideId 是服务器端使用的 id。

      例如选择:

      <li id="ctl00_ContentPlaceHolder1_ctl00_ComponentsLI">
      

      用途:

      $("li[id$='ComponentsLI']") 
      

      【讨论】:

      • 这对于获取列表项的集合非常有用,但是您知道如何仅获取当前上下文的集合吗?我试图像这样 $(this).find("li[id$='ComponentsLI']") 将 $(this) 添加到它,但这不起作用。谢谢 - 拉斯。
      【解决方案3】:

      我知道 ASP.NET 很难知道给定标记的 ID 是什么,但通常可以将 CSS 类添加到任何给定控件。也许你可以为你想用 jQuery 找到的控件使用一个唯一的类,然后使用 $(".yourCssClass") 来获取 DOM 节点。

      【讨论】:

        【解决方案4】:

        我的建议是使用 css 类作为您希望 jQuery 选择的控件的标识符。例如

        <a id="ctl00_ContentPlaceHolder1_ctl00_ImgLink" class="imgcontainer">
        </a>
        

        会变成

        <a id="ctl00_ContentPlaceHolder1_ctl00_ImgLink" class="imgcontainer ImgLink">
        </a>
        

        然后用$(".ImgLink")选择超链接

        【讨论】:

          【解决方案5】:

          我为 ASP.Net UniqueID 的 jQuery 写了一个 custom selector

          //case-insensitive selector for ASP.Net ID's
          //usage: $(':aspnetid(id)')
          
          jQuery.extend(
              jQuery.expr[":"],
              {
                  aspnetid: function(a, i, m) {
                      return (new RegExp(m[3] + '$', 'i')).test(jQuery(a).attr('id'));
                  }
              }
          );
          

          【讨论】:

            【解决方案6】:

            在 jQuery 中定位 .Net 元素的非常简单的方法

            $("[id$='txb_myTextbox']")
            

            其中 txb_myTextbox 是用户为控件指定的 Id。

            【讨论】:

              猜你喜欢
              相关资源
              最近更新 更多
              热门标签