【问题标题】:Allow Copy/Paste in a disabled input text box in Firefox browsers允许在 Firefox 浏览器中禁用的输入文本框中复制/粘贴
【发布时间】:2012-02-11 05:05:41
【问题描述】:

我禁用了一个输入文本框:

   <input type="text" name="name" disabled="disabled" />

在 IE 和 Chrome 中,您可以复制并粘贴该输入字段中填充的值,但在 Firefox 中则不能。

出于安全考虑,Firefox 不允许通过 JavaScript 操作剪贴板。

有什么建议吗?有解决办法吗?

【问题讨论】:

标签: javascript


【解决方案1】:

tl;dr:支持在禁用字段中选择和复制文本是不可靠的;如果需要此功能,请改用readonly 属性或非input 元素,例如&lt;span&gt;。使用 JavaScript 修改 readonly 输入的行为,以防止出现不需要的行为,例如当有人在 readonly 输入具有焦点时按下 backspace 键时返回页面。

*更新:2018.12.24

自最初发布此答案以来,规范已更改(感谢 Wrightboy 指出这一点);它现在包括以下关于禁用字段的警告:

本标准未定义与禁用控件的用户交互相关的任何其他行为,例如是否可以选择或复制文本。

——https://html.spec.whatwg.org/multipage/input.html#the-readonly-attribute

禁用的字段仍然无法接收焦点或点击事件。

因为标准没有定义是否可以选择或复制禁用控件中的文本,并且至少有一个主流浏览器不支持该功能,所以最好避免依赖该行为。

原答案

这是禁用字段的预期行为(截至本答案的原始日期)。 IE 和 Chrome 很慷慨,但 Firefox 表现得恰到好处。

如果您想阻止用户更改字段的值,但您仍然希望他们能够读取它,和/或复制它的值,那么您应该使用readonly attribute。这将允许他们将焦点设置到元素(复制所必需的),并且还可以通过 tab 按钮访问该字段。

如果您担心用户不小心点击只读字段内的退格按钮并导致浏览器返回页面,您可以使用以下代码来防止这种行为:

document.addEventListener("DOMContentLoaded", function() {
  var inputs = document.querySelectorAll('[readonly]');
  for(var i=0; i < inputs.length; i++){
    inputs[i].addEventListener('keydown', function(e){
      var key = e.which || e.keyCode || 0;
      if(key === 8){
        e.preventDefault();
      }
    })
  }
});
&lt;input value="Hello World" readonly=readonly /&gt;

【讨论】:

  • 您的代码不适用于动态添加到表单的字段,或者动态更改样式的字段。另外,我不能用鼠标选择文本并按Ctrl-C复制它,这不是一个错误吗???我可以选择页面上其他任何地方的文本并复制它,即使它根本不在输入字段中。您是说防止从禁用字段复制文本是一项功能吗?对不起CAPS,但我很震惊。
  • 实际上,代码适用于动态更改的字段;您只需使其适应您的应用程序的需求。例如,您可以在动态 DOM 更改后而不是在DOMContentLoaded 上触发代码。我不认为这种行为是错误的原因是因为它遵守spec,根据定义这是正确的行为。该规范禁止关注 disabled 字段,并且焦点是键盘或鼠标输入(例如复制和粘贴)的必要条件。
  • This is the expected behavior for a disabled field 这完全不正确,Firefox 目前是这种情况下的异常值。请参阅此处的 spec for readonly 引用禁用控件 - Any other behavior related to user interaction with disabled controls, such as whether text can be selected or copied, is not defined in this standard.
【解决方案2】:

作为快速回答,您可以使用另一个未禁用的元素来启用 + 复制/粘贴 + 重新禁用您的输入文本,如下所示:

$('#btnCopy').click(function(){
   $('#txtInputDisabled').removeAttr('disabled');  
   $('#txtInputDisabled').select();
   document.execCommand("copy");
   $('#txtInputDisabled').attr('disabled','disabled');  
});

你可以看到我对这个post的完整回复

【讨论】:

  • 假设 OP 使用 JQuery
  • 聪明的解决方案!
【解决方案3】:

您可以通过使用 jquery 的 contenteditable 属性在共享点中完成此操作,如下所示。

$("#fieldID").attr("contenteditable", "false");

这将允许用户突出显示文本并复制它,但不允许他们在字段中输入任何内容。

【讨论】:

    【解决方案4】:

    请参阅我的帖子以解决相同的问题。它执行以下操作:

    1. 在不使用输入标签上的只读属性的情况下使文本框像只读一样,但会尊重标签索引并设置焦点
    2. 支持win和mac鼠标或键盘的所有剪贴板功能
    3. 允许撤消、重做和全选

    Restrict HTML input to only allow paste

    【讨论】:

      【解决方案5】:

      我不喜欢使用 readonly="readonly",永远。它使该字段可以通过 Tab 键获得焦点和访问,如果上帝禁止,用户在只读字段获得焦点时点击退格键,那么大多数浏览器将其视为用户点击“后退”按钮并调出以前浏览过的页面。 不是当您填写大型表单时,您希望看到的情况会发生,尤其是当您使用一些在您点击时不保留表单数据的过时浏览器时“下一步”按钮返回到它。在使用一些单页 Web 应用程序时也非常非常糟糕,“返回”会将您带到另一个世界,而“下一步”甚至不会恢复您的表单,更不用说它的数据了。

      当我需要禁用字段(或 PRE 而不是 textarea)时,我通过呈现 DIV 而不是输入字段来解决此问题。动态执行并不总是那么容易,但我已经设法使用 AngularJS 模板完成了相当短的工作。

      如果你有时间,head over to the Mozilla Bugzilla and ask them to fix it

      【讨论】:

      • 您描述的行为正是我对只读控件的期望。我希望它可以通过选项卡获得焦点和访问。如果这不是所需的行为,那么使用“禁用”属性可能会更好。至于退格问题,如果有必要,您可以阻止keydown 事件中的默认行为。
      • 实际上,你是对的,“只读”控件的行为与我期望的完全一样,跨浏览器的行为是一致的,而且我从不喜欢我曾经工作过的任何应用程序的含义,所以我从不使用它们。我要求修复的“错误”是阻止在禁用控件中复制/粘贴的 FF 错误。如果已解决,那么我可以使用“禁用”并获得我正在寻找的行为。
      • 我在 Mac 上,Firefox 47 不会将只读输入中的退格解释为“向后导航”。此外,光标不会像可编辑输入那样闪烁,所以这是另一个指标。不过,我确实同意“禁用”应该允许复制文本。 (此外,在页面上查找文本时,禁用的输入不匹配,这也很烦人。)
      • 完全同意@Derek。此评论是为了通知您 Chrome Canary(测试版 chrome)开始禁止用户选择禁用的输入...这会让我头疼并迫使我按照您的建议写一些 &lt;div&gt;&lt;pre&gt; ,而不是说“去丁目”
      • 现代浏览器不再有退格键向后导航(例如当前的 Chrome 和 Firefox)。使用只读并忽略这个 3 岁的 FUD。
      【解决方案6】:

      readonly="readonly" 将完成这项工作

      主流浏览器应该是supported

      【讨论】:

      • 永远,永远,永远不要使用 readonly="readonly"。请参阅我的解决方案了解原因。
      • 我可以理解您为什么选择不使用readonly,但我不认为这是某人永远不应该做的事情。这当然不是反模式。
      • 我认为这是一种反模式。将两个字段放在一个表单上,每个字段都包含一些默认数据,并将第二个设置为只读。编辑第一个并点击标签。第二个字段的默认样式几乎与可编辑字段的样式相同,几乎没有迹象表明现在选择的文本是只读的。在替换它之前按退格键删除它是非常诱人的。多年来,无论是我自己的还是其他人的,这在任何数量的 Web 应用程序中都困扰着我,并导致我丢失了需要重新输入的整个表单。
      • 好吧,Chrome 现在已经禁用了退格按钮来向后导航,所以至少这个老问题消失了。就只读而言,缺少的是浏览器提供了一些视觉指示,表明该字段无法编辑。我知道,我可以轻松设置样式,但默认样式应该给我一些东西
      • @Derek 你能不能把只读字段的样式设置为禁用,这样用户就不会认为它是可编辑的?我知道它在技术上不在范围内,但它可以解决可读性问题。
      猜你喜欢
      • 2012-04-15
      • 2017-07-15
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      相关资源
      最近更新 更多