【问题标题】:HTML: cursor showing in readonly input text?HTML:光标显示在只读输入文本中?
【发布时间】:2011-12-16 14:02:07
【问题描述】:

假设我们有一个只读文本框,如下所示:

<input type="text" readonly />

在 IE 9 和 FF 4 中,当我单击该字段时,该字段中会出现一个(不闪烁的)光标。但是,在 Chrome 中,光标不显示。 (请参阅http://jsfiddle.net/hqBsW/。)

我想我理解为什么 IE/FF 选择显示光标——这样用户就知道他或她仍然可以选择字段中的值。

尽管如此,这显然让我们的用户感到困惑,我们希望将 IE/FF 更改为不显示光标,就像 Chrome 对 readonly 字段所做的那样。

有没有办法做到这一点?

【问题讨论】:

标签: html input readonly


【解决方案1】:

我的解决方案,来自 nikmd23 的 jQuery sn-p,但使用 blur() 函数似乎效果更好

$('input[readonly]').focus(function(){
    this.blur();
});

Example here: http://jsfiddle.net/eAZa2/

不要使用“disabled”属性,因为输入是表单的一部分时不会提交

【讨论】:

  • 我想知道如何使用 readonly 是否重要:jsfiddle.net/m7saqqpL 似乎没有什么区别。
  • 是的,它们看起来一样,因为两个字段都不可编辑(另一个小的区别是文本的颜色,在禁用字段上它是深灰色,但可能取决于浏览器)。主要区别在于,当您将表单发布到服务器时,根本不会提交具有“已禁用”属性的输入,而“只读”输入将不会提交。
  • onfocus="this.blur()" 似乎在 IE11 中不起作用
  • 动态改变“只读”属性时,使用:$('input').focus(function(){ if ($(this).is('[readonly]')) this.blur()});
【解决方案2】:

听起来像个错误!

a similar bug (396542) 用 Mozilla 打开,说光标应该在 readonly 输入中闪烁——但这种行为感觉不对,闪烁的光标应该意味着,“你可以在这里输入。”

您应该评论该错误和/或提交新错误(Mozilla here 和 Microsoft here)!

与此同时,按照@nikmd23 的建议,使用disabled 或使用JavaScript 更改行为似乎是最好的解决方法。

【讨论】:

  • 关于禁用字段的一个注意事项是,禁用字段不会在表单发布中发布到服务器。
  • 关于上述评论 - 当然有在表单中放置隐藏和禁用元素的肮脏技巧。
  • 禁用只读列表框/组合框的字段是不可取的。因此,您需要只读状态而不禁用它。 w3c.github.io/aria/#listbox 和 w3c.github.io/aria/#combobox
  • 为该输入字段编写pointer-events: none; CSS 属性。
【解决方案3】:

如果将readonly属性更改为disabled,将无法点击输入框,因此不会有光标。

根据浏览器的不同,您也可能无法选择文本。

我在这里提供了各种输入状态的示例:http://jsfiddle.net/hqBsW/1/

另一种选择是,当用户关注给定的输入元素时,您可以强制进行文本选择。控制行为的这种变化将更容易让用户了解输入受到限制的事实,并且如果这是最终用例,则允许他们非常轻松地进行复制。

使用 jQuery,您可以这样编写选择代码:

$('input[readonly]').focus(function(){
    this.select();
});

我已更新示例以显示此行为的实际效果:http://jsfiddle.net/hqBsW/2/

【讨论】:

  • 有时您需要只读属性而不是禁用。在 HTML5 中,您无法验证禁用的字段,但可以验证只读字段。
【解决方案4】:

可以使用html和javascript来完成

<input type="text" onfocus="this.blur()" readonly >

或全局使用 jQuery

$(document).on('focus', 'input[readonly]', function () {
        this.blur();
    });

【讨论】:

    【解决方案5】:

    对于仅CSS 的修复,请使用:

    input[readonly] {
      pointer-events: none;
    }
    

    【讨论】:

      【解决方案6】:

      我找到的唯一方法是

      //FIREFOX
      $('INPUT_SELECTOR').focus(function () {
                      $(this).blur();
                  });
      //INTERNET EXPLORER
      $('INPUT_SELECTOR').attr('unselectable', 'on');
      KENDO
      $('.k-ff .k-combobox>span>.k-input').focus(function () {
                      $(this).blur();
                  });
      $('.k-ie .k-combobox>span>.k-input').attr('unselectable', 'on');
      

      【讨论】:

        【解决方案7】:

        你可以使用css:

        input {pointer-events:none;}
        

        参考:https://developer.mozilla.org/pt-BR/docs/Web/CSS/pointer-events

        【讨论】:

        • 欢迎来到 SO。回答问题时,请提供与您的代码相关的解释。有些人可能不理解您的代码或看不到它如何回答问题。见how to write a good answer
        【解决方案8】:

        您可以设置标签的样式属性,也可以通过设置 class 属性的值向标签添加 css 类。您的问题可以通过设置光标来解决。你可以阅读更多here。此外,如果您有一些设置此标签光标的规则,您可以将 !important 添加到您的 css 规则中。您可以阅读有关 !important here 的更多信息。

        【讨论】:

        • 问题是询问文本光标,而不是鼠标光标。
        猜你喜欢
        • 2014-10-24
        • 2013-03-03
        • 1970-01-01
        • 2019-07-09
        • 2019-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多