【问题标题】:getElementById.elements not picking up labelgetElementById.elements 没有拾取标签
【发布时间】:2015-11-20 22:20:53
【问题描述】:

代码优先:

function loopForm() {

var e = document.getElementById("form1").elements;

for (var i = 0; i < e.length; i++) {
  alert('this is ' + e[i].ID + ' of type' + e[i].type);
}  

我将上面的代码放在一个 .js 中,它是从一个 .aspx 调用的,它在服务器端以一个名为 form1 的表单中的文本框、下拉列表、复选框和标签等动态创建的控件。我的问题是,

代码正在获取所有控件的 ID 和类型,除了 标签,我正在寻找一种使用标签进行操作的方法(更改 style.display、颜色等)

我尝试过使用 JQuery 代码,例如:

$("#form1 label").each(function() {  //I used "div", "label" and all sort
alert('hi');
});  

并且不起作用。请注意,虽然 document.getElementById 可能有效,但页面上存在的控件每次都不同,因此无法硬编码。

编辑:这是将标签添加到 .aspx 的方式(在我的代码隐藏中):

private Label lbl = new Label();
System.Web.UI.HtmlControls.HtmlGenericControl NewDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");  
NewDiv1.Controls.Add(lbl);
form1.Controls.Add(NewDiv);

【问题讨论】:

  • 请定义“标签”和/或向我们展示 HTML 并准确指出您没有得到哪个元素。
  • .elements 选择表单控件。 labels 不是表单控件 - 它们不保存数据,不会导致表单提交,并且不是表单一起提交的数据的一部分。例如,这里只返回input,而不是它旁边的labelcodepen.io/paulroub/pen/RWOVrv
  • 从这里的答案和 cmets 我确定我误解了标签的处理方式。 @admiraalit 除非您在页面/表单加载后“查看源代码”,否则标签不会显示在 html 上。
  • @PaulRoub thx 正如我所提到的,我确信我误解了标签的处理方式。我正在寻找一种方法来单独更改每个标签的样式(即,当文本框为空时,将标签的 style.display 更改为“内联”)

标签: javascript jquery asp.net


【解决方案1】:

当您谈论labels 时,我怀疑您指的是ASP.NET 服务器控件,例如asp:Label。如果是这种情况,那么您真的在寻找 &lt;span&gt; 标签,因为 ASP.NET 将 &lt;asp:Label&gt; 转换为 html &lt;span&gt;

如果您想通过它们的 Id 来引用这些元素,您会注意到 ASP.NET 在客户端使用的 Id 与您在服务器端定义的不同。

但是,有一个解决方法。如果您希望客户端 ID 与服务器 ID 相同,请在您的服务器控件上设置以下属性:ClientIdMode="Static".

例如,在您的 .aspx 页面中,您有以下内容:

<asp:Label runat="server" Id="lblName"></asp:Label>

它会在 html 中生成类似这样的内容:

<span id="someservergeneratedid_lblName"></span>

如果你想自己控制id,可以这样做:

<asp:Label runat="server" ID="lblName" ClientIdMode="static"></asp:Label>

这将在 html 中生成:

<span id="lblName"></span>

【讨论】:

  • "如果您想通过它们的 Id 来引用这些元素,您会注意到 ASP.NET 在客户端使用的 Id 与您在服务器端定义的不同。" - @OliverDeMeulder 你能详细说明一下吗?我确实在服务器端分配了 ID,它显示了除标签之外的代码。此外,'ClientIdMode="Static" 将包含在 aspx 中还是?
  • @OliverDeMeulder 感谢您的更新,但是标签是在代码隐藏中添加的(回发后的服务器端),并且不存在像 标签这样的东西
  • @Alex 标签是如何在 Codebehind 中添加的?
  • 使用 Div 生成如下: System.Web.UI.HtmlControls.HtmlGenericControl NewDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("DIV");然后,newDiv.Controls.Add(lbl);其中 lbl 是声明为 Label 变量。然后,form1.Controls.Add(newDiv) 被包含在表单中
  • 那么,在调用之前设置 lbl.ClientIdMode = "Static";
【解决方案2】:

代码正在获取所有控件的 ID 和类型,标签除外

这很正常。元素集合只应该包含表单控件(以及出于某种原因的字段集)。标签不应该在那里。

$("div").each(function() { alert($(this).val()); });

Div 和 label 元素没有值,所以这不起作用。

您可以轻松地选择 HTML 标签元素:

jQuery("#form1 label").each(function () {
    jQuery("body").append("<p>Appending because alert is disabled in snippets</p>");
});
label {
  display: block;
  padding: 2px;
  margin: 2px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form1">
  <label>Hello
    <input name="hello" value="world">
  </label>
  <label>Goodbye
    <input name="hello" value="world">
  </label>
</form>

正如 Olivier 指出的那样,请确保您的 HTML 看起来符合您的预期,并且 ASP.NET 正在生成您正在寻找的具有正确类型的元素。

【讨论】:

  • 谢谢,但每次加载不同的标签,并且单独更改这些标签(即当文本框为空时显示错误标签)无法作为您的答案设置完成?
  • @Alex — 没有什么能阻止你使用each。我只是没有,因为它不需要解决您在问题中陈述的问题。
  • 我尝试过使用 $("#form1 label").each 并且它根本没有做任何事情(我只是使用 alert('hi') 而不是 val())。请稍后查看我的答案更新,谢谢
  • @Alex — 将答案更改为使用 each。它工作正常。
  • 我认为问题在于,.aspx 中不会有
猜你喜欢
  • 1970-01-01
  • 2012-05-12
  • 2012-12-31
  • 2015-07-10
  • 2015-01-10
  • 1970-01-01
  • 2021-03-05
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多