【问题标题】:Javascript to blank textbox value wont work, but jquery doesJavascript 到空白文本框值不起作用,但 jquery 可以
【发布时间】:2016-03-05 18:30:48
【问题描述】:

我在页面中有一个更新面板,供用户指定活动的“所有者”。该所有者将是我们活动目录中的用户。该面板允许用户输入一些文本,然后单击搜索按钮以在我们的 Active Directory 中查找匹配的用户。当用户从匹配列表中选择用户时,会填充所有者的姓名和用户名。用户名是隐藏的,因为用户不需要看到它。一切正常

我的问题是我有一个事件处理程序,每当所有者名称的文本发生更改时都会触发,如果用户更改所有者名称,我想将所有者用户名设为空白,直到用户实际调出匹配列表并选择一个有效的进入。

我的问题是,当我尝试使用 Javascript 访问隐藏文本框的值时,我不能,但是当我尝试 jquery 等效代码时,它工作得很好。为什么?

这是我的 HTML

<asp:UpdatePanel ID="OwnerUpdatePanel" runat="server" UpdateMode="Conditional" ClientIDMode="Static">
    <ContentTemplate>
        <asp:TextBox id="OwnerNameTextbox" runat="server" class="form-control input-sm" Width="200"/>
        <asp:TextBox id="OwnerUsernameTextbox" runat="server" class="hidden"/>
        <asp:LinkButton class="btn btn-default btn-sm StopClickPropagation" id="GetOwners" AutoPostBack="True" runat="server" OnClientClick="CheckLength()" OnClick="GetMatchingOwners">
            <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
        </asp:LinkButton>
        <asp:ListBox id="OwnersList" runat="server" AutoPostBack="True" class="dropdown-list" onblur='$(".dropdown-list").hide();' OnSelectedIndexChanged="OwnerSelectionChanged">
        </asp:ListBox>
        <p>
    </ContentTemplate>
</asp:UpdatePanel>

这是我的所有者名称文本框更改事件的处理程序

    function OwnerNameTextChanged() {
        document.getElementById("OwnerUpdatePanel").childNodes[1].value = "";
    }

这会将我的 OwnerNameTextBox 设置为空白,这不是我想要的。我想将 OwnerUsernameTextbox 设置为空白。但是当我将 childNodes 的下标更改为 2 时,什么都没有改变(检查 childNodes[2] 的值并发出警报,给我“未定义”)。但如果我尝试使用 jquery:

$("#OwnerUpdatePanel").children(":nth-child(2)").val("");

效果很好。为什么 jquery 子选择可以工作,而 javascript 却不行?

【问题讨论】:

    标签: javascript jquery html asp.net


    【解决方案1】:

    由于textNode也是childNode,你需要尝试一下

    document.getElementById("OwnerUpdatePanel").childNodes[3].value = "";
    <div id="OwnerUpdatePanel">      
      <input type="text" id="OwnerNameTextbox" value="name">
      <input type="text" id="OwnerUsernameTextbox" value="user">
    </div>

    去掉标签之间的间距(去掉一个子节点)

    document.getElementById("OwnerUpdatePanel").childNodes[2].value = "";
    <div id="OwnerUpdatePanel">      
      <input type="text" id="OwnerNameTextbox" value="name"><input type="text" id="OwnerUsernameTextbox" value="user">
    </div>

    来自documentation - childNodes 还包括例如文本节点和 cmets。要跳过它们,请使用children

    document.getElementById("OwnerUpdatePanel").children[1].value = "";
        <div id="OwnerUpdatePanel">      
          <input type="text" id="OwnerNameTextbox" value="name">
          <input type="text" id="OwnerUsernameTextbox" value="user">
        </div>

    【讨论】:

    • 谢谢。去吃午饭回来检查,没想到会有答案,更不用说用代码 sn-ps 和所有的如此彻底的答案了。我认为我遇到了对 DOM 缺乏理解的问题。将我的代码更改为使用子节点而不是 childNodes,它工作得很好。再次感谢!
    • @AgapwIesu - 欢迎。很高兴为您提供帮助,无需担心理解。随着时间的推移,你的努力会为你带来:)
    • 但是...什么文本节点?即使我检查生成的 html(来自我的 aspx),它也只有这些输入,中间没有其他内容。
    • @AgapwIesu - div 元素在索引 0 处有一个文本节点。然后在索引 1 处是第一个输入元素。然后,由于输入 1 和输入 2 之间有一个输入/下一行/空格,因此索引 2 处还有另一个文本节点。最后,第二个输入位于索引 3。我在答案中添加了更多详细信息以供参考。跨度>
    • 好的,我将在我的日历中添加一个约会,它会提醒我在这个问题上悬赏并奖励给你,只要 SO 软件允许我。你已经提供了更多的帮助,我非常感谢你。
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多