如何使用 Javascript 使 TextBox 只读

How To Make TextBox Read Only With Javascript

提问人:ExecChef 提问时间:4/11/2019 最后编辑:ExecChef 更新时间:4/11/2019 访问量:1074

问:

我得到了一个用 asp 创建的旧项目,我需要将其中一个文本框设置为只读(因为它由下拉框填充,不应允许任何自由文本条目)。这将被切割并干燥以设置 ReadOnly = “True” 的属性。 .除了 Keppress 上似乎有某种 JS 函数阻止只读属性工作。我在 JS 方面的经验和知识很少,所以我不知道如何解决 - 这应该是一个容易的改变。

我尝试在html中将ReadOnly属性添加到True,但是发生了一些奇怪的事情。当用户在框中键入内容时,文本将显示在框中,但他们无法将其删除。所以,这告诉我它正在部分工作,但其他事情正在发生。

然后,我从实际页面视图(在浏览器中)查看了源代码,在那里我看到触发了 kepress 事件。.(onkeypress=“返回 TheControl.RY(this, event);”)。因为这没有显示在我的ascx文件上。

总之。.ReadOnly 属性失败,因为 onkeypress 正在触发 . . .(a) 我不完全理解 JS 在做什么,或者如何使盒子只读。

这是 .ascx 文件中文本框的代码

 <span class="ComposeHeaderValue">
                <asp:TextBox runat="server"     ID="ToTextBox" TabIndex="1" ReadOnly="true" />
            </span>

但是当我从浏览器查看源代码时,这是html:

 <span class="ComposeHeaderValue">
                <input name="TheControl$ToTextBox" type="text" readonly="readonly" id="TheControl_ToTextBox" tabindex="1" onkeypress="return TheControl.RY(this, event);" />
            </span>

我没有任何 JS 经验,但看起来它正在调用事件 (RY) onkeypress 。.所以我在其中一个 js 文件中发现了一个名为 RY 的东西,这就是它所拥有的

  RY: function Rockliffe_MailSite_Web_UI_Client_ComposeControl_ComposeControl$RY(lV, nd) {
    this.lR('ComposeControl', 'RY', lV.id + ',' + nd);
    if (!this.na) {
        return true;
    }
    return this.pg.Cu(lV, nd);


 },

我不知道这段代码中发生了什么。我试图在 JS RY 中添加属性更改。 .但这没有用。这是我尝试过的:

    RY: function  Rockliffe_MailSite_Web_UI_Client_ComposeControl_ComposeControl$RY(lV, nd) {
    this.lR('ComposeControl', 'RY', lV.id + ',' + nd);
    if (!this.na) {
        return true;
    }
    return this.pg.Cu(lV, nd);

    document.getElementById('ToTextBox').readOnly = true;
 },

如果我找不到使文本框 ReadOnly 的方法。.由于按键事件,如何禁用按键事件的发生?从理论上讲,如果文本框是只读的,则永远不会有按键事件??


使用 Archer 提供的解决方案 . . . .这是我更新的代码,仍然无法正常工作

        <div class="ComposeHeaderLine">
            <WebUtils:IconButton runat="server" id="ToComposeButton" style="float:left"/>
            <span class="ComposeHeaderValue">
                <asp:TextBox runat="server" ID="ToTextBox" TabIndex="1" ReadOnly ="true" />
            </span>
        </div>

在页面的最底部,我添加了以下内容

<script type="text/javascript">

function onKeyPress(textbox, event) {
textbox.value += event.key;
}

document.getElementById("ToTextBox").removeAttribute("onkeypress");
</script>

不确定我是否正确配置了 JS ????


新建编辑

好吧,所以......在我的 asp 代码中,文本框没有任何 onkeypress 事件。但是,当我在 Web 浏览器上查看源代码时,它确实显示了一个 onkeypress 事件。 。我想知道这是否有什么关系。

"return TheControl.RY(this, event);"

<input name="TheControl$ToTextBox" type="text" readonly="readonly"   id="TheControl_ToTextBox" tabindex="1" onkeypress="return TheControl.RY(this,  event);" />

我有两个问题。使用 Archer 提供的示例 . . .

  1. 他的函数名称是 onKeyPress。那么,我应该将我的函数重命名为“return TheControl.RY(this, event);”???

  2. getElement 代码行应该在括号内还是在括号后面?Archer 在 之后显示它。..但我不明白为什么它不在括号内?

JavaScript jQuery asp.net

评论

2赞 William Bright 4/11/2019
你试过禁用吗?
1赞 Asons 4/11/2019
仅供参考,您永远不会在声明之后执行。document.getElementById('ToTextBox').readOnly = true;return
0赞 ExecChef 4/11/2019
@WilliamBright - 我还没有尝试禁用,因为我读过,如果表单将数据保存到表格中,禁用不会携带文本框的值?这是对的吗?
0赞 Asons 4/11/2019
@WilliamBright 和 ExecChef:不能使用 ,就好像该值永远不会在提交时发送到服务器一样。它显然应该使用下拉框进行设置。disabled
0赞 ExecChef 4/11/2019
@LGSon - 我尝试在返回之前将语句向上移动,但没有奏效。这引起了我的思考。我是否在寻找正确的 js 代码?我还添加了一个警报 - 也没有在按键时触发。我迷路了。“onkeypress=”return TheControl.RY(this, event)“ 我是否在看正确的js代码。.瑞?

答:

0赞 Reinstate Monica Cellio 4/11/2019 #1

如果您无法删除或退格,那么这听起来确实像是按键处理程序正在更新值,但忽略了该属性。如果 readonly 属性存在,我不希望光标闪烁,但我不知道第三方代码在做什么。readonly

但是,您可以删除按键处理程序,它可能与某些第三方代码冲突,也可能不冲突。这是最简单、最合理的解决方案,不涉及拆解别人的库。

下面是 2 个文本框的示例,我使用 Javascript 从其中一个文本框中删除了按键处理程序。

function onKeyPress(textbox, event) {
  textbox.value += event.key;
}

// remove the event handler from textbox2
document.getElementById("textbox2").removeAttribute("onkeypress");
<input id="textbox1" type="text" readonly="readonly" onkeypress="onKeyPress(this, event)" placeholder="You can type in me" />
<br /><br />
<input id="textbox2" type="text" readonly="readonly" onkeypress="onKeyPress(this, event)" placeholder="You can't type in me" />

您只需要将一行 Javascript 添加到您的页面(并修改 ID 以适合您)。

唯一需要注意的是,删除按键事件处理程序的代码行必须在第三方代码添加处理程序之后进行。理想情况下,只需将其粘贴在正文最底部的脚本标签中即可。

评论

0赞 ExecChef 4/11/2019
弓箭手 - 我已经进行了更改.但有些不对劲。一切都没有改变。我可能没有正确配置JS代码?我已经更新了我的原始问题,以显示我是如何实现您的代码的(很可能是错误的)
0赞 Reinstate Monica Cellio 4/11/2019
不要添加函数 - 那只是为了演示之前和之后。只需在有关删除处理程序的注释下方添加 1 行即可。如果仍然没有任何变化,那么这是由于第三方代码造成的,因此几乎没有人可以提供帮助。难道你不能随便去掉那是什么吗?onKeyPress()
0赞 ExecChef 4/16/2019
感谢您的帮助。我删除了onkeypress()。这样做会在第三方代码中生成错误,但不会使文本框为只读。可能关键是在结束 body 标签之后的最后添加“remove attribute”js。但是,问题是第三方代码有些哭泣。.并且该网站是动态构建的,因此没有实际的关闭正文标签。我们已经没有东西可以尝试了,所以他们决定联系供应商。谢谢大家的帮助。