65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 jQuery 在母版页中查找控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (7投票s)

2010年11月28日

CPOL

3分钟阅读

viewsIcon

41452

使用 jQuery 在母版页中查找控件

这个问题出现在我担任版主的 ASP.NET 论坛上

“如何使用 jQuery 从子页面中查找母版页上的 HTML 元素?”

我跃跃欲试。我喜欢这样的问题,因为当我不懂答案时,这给了我探索和学习的借口。

问题在于,母版页上的元素 ID 会被篡改或修饰,以防止最终呈现的 HTML 上出现重复的 ID。

例如,一个 textbox,其 ID 如下:MasterPageTextBox,最终会变成这样的 ID:ctl00$MasterPageTextBox

解决方案 1

我们可以将篡改后的 ID 硬编码到 jQuery 搜索条件中,这样就可以工作了。但那将是一场维护噩梦,将来,篡改后的 ID 可能会更改:这是不可接受的。当人们付钱让你编写代码时,你应该编写好的代码。

解决方案 2

如果您使用的是 ASP.NET 4,您可以控制生成的 ID 并使其可预测。然后,您可以将生成的 ID 硬编码到 CSS 选择器中。但是,目前大多数网站的情况并非如此。

解决方案 3

在 Google 和 Bing 上搜索了一番后,我想出了在母版页中使用这种方法

protected void Page_Load(object sender, EventArgs e)    
{
    Page.ClientScript.RegisterHiddenField
	("HiddenFieldClientID", this.MasterPageTextBox.ClientID);     
}

上面的代码获取生成的 ClientID 并将其放入发送到浏览器的 HiddenField 中。然后,子页面中的 jQuery 代码可以获取 HiddenField 中的值,并使用它来搜索元素。我认为这很酷,但是...... jQuery 代码无法编译,因为 HiddenField 不在其页面上。因此,必须在页面上放置一个空的 HiddenField 控件。这很麻烦,但它有效!以下是子页面上的 jQuery 如何访问隐藏字段,然后访问母版页上的 textbox

// ---- SetMasterPageTextBox ---------------------------
// write hello in a textbox field on the master page

function SetMasterPageTextBox()
{
    // Get the hidden field         
    var HidField = $("#HiddenFieldClientID");
    if (HidField.length == 1)
    {
        // get the contents of the hidden field
        var ClientID = HidField[0].value;
        // use it as the ID of the TextBox control
        $("#" + ClientID).val("Hello");
    }
}

我正要去发布我“出色”的答案,但与此同时,另一位论坛成员发布了一个比我的答案好得多的答案。

Frank Hong 建议用 span 标签包装元素。

解决方案 4

以下两件事使下一个解决方案有效。

  1. Span 标签 ID 不会被篡改或修饰。
  2. CSS 选择器很酷,真的很酷......快速回顾

div, p

逗号 (,) 运算符表示 AND。页面上的所有 div 和段落都将被选中。

div > p

大于号 (>) 运算符表示 直接父元素。任何 直接 位于任何 div 内部的段落都会被选中

div p

空格 ( ) 运算符表示 祖先元素。任何位于 div 内部的段落都会被选中,即使它们位于 div 内的其他元素内部。

在母版页中,用 span 元素包装 textbox

<%-- Span is to allow child page to jQuery select textbox--%>     
<span id="SpanMyTextBox">         
    <asp:TextBox ID="MyTextBox" runat="server"></asp:TextBox>     
</span>  

这是呈现后的样子,请注意 TextBox id 被篡改了,但 span id 保持不变

<span id="SpanMyTextBox">        
    <input name="ctl00$MyTextBox" type="text" id="ctl00_MyTextBox" />  
</span>  

在子页面中,我们可以使用大于号或空格运算符。大于号运算符更明确地表达了我们的意图。我们使用 'input' 因为 textbox 被呈现为 HTML 输入元素。

因此,CSS 选择器是:#SpanMyTextBox > input

// ---- SetMasterPageTextBox ---------------------------    
// write hello in a textbox field on the master page             

function SetMasterPageTextBox()    
{        
    //Textbox is wrapped in span element        
    $("#SpanMyTextBox > input").val("Hello");    
}

现在,是不是更好了?当然,开发者有责任确保不使用重复的 span id。

[更新:]

解决方案 5 (来自评论)

您也可以使用通配符 CSS 选择器。

input[id$=MyTextBox]

上面的行匹配所有 id 属性以 "MyTextBox" 结尾的 HTML input 元素。

它会匹配

<asp:TextBox ID="ctl00$MyTextBox" runat="server"...
<asp:TextBox ID="LaLaLaMyTextBox" runat="server"...
<asp:TextBox ID="abc123MyTextBox" runat="server"...

我希望有人觉得这有用。

史蒂夫·韦伦斯

© . All rights reserved.