将带有新行的文本复制到 <input type="text"/> 在 IE 中不起作用

Copying text with a new line to <input type="text"/> not working in IE

我的问题如下:

我有一个输入,就这么简单:

<input type="text"/>

当我尝试粘贴一些包含新行的文本时,新行之后的所有文本都没有出现。

现在我知道这种类型的输入不应该支持这种行为,最好的方案是使用 textarea 但这在我目前正在进行的项目中很难实现。

但是,其他浏览器会将新行转换为 space 字符并在新行之后附加文本,这样您最终可以在一行中获得整个文本。 IE 不会那样做。

我找到了以下 solution to intercept paste event,我想也许我可以用它来将字符串转换为单行字符串,但它在 firefox 中不起作用。我可以尝试浏览器检测,但恐怕它在许多其他情况下也会失败。

我还能做些什么来使 IE 的行为与其他浏览器一样吗?我最好的选择是什么?

我发现这个答案可能是您问题的解决方案: JavaScript get clipboard data on paste event (Cross browser)

它应该适用于 IE6+、FF 22+、Chrome 和 Safari。

HTML

<input id='editableDiv' contenteditable='true' type="text"/>

JavaScript

function handlePaste (e) {
    var clipboardData, pastedData;

    // Stop data actually being pasted into input field
    e.stopPropagation();
    e.preventDefault();

    // Get pasted data via clipboard API
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text');

    // Remove new line characters
    alert(pastedData);
    var res = pastedData.replace(/\r?\n|\r/g, );
}

document.getElementById('editableDiv').addEventListener('paste', handlePaste);

希望这对朋友有帮助。

感谢您的回答 George K - 您的回答是我解决方案的基础。我还有一些问题需要解决:

  1. addEventListener 给我 'element not found'
  2. 连接值未填充字段

所以我最终对你的 javascript 进行了这些细微的修改:

function handlePaste(e) {
    var clipboardData, pastedData;

    // Stop data actually being pasted into input field
    e.stopPropagation();
    e.preventDefault();

    // Get pasted data via clipboard API
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text');

    // Remove new line characters
    var res = pastedData.replace(/\r?\n|\r/g, ' ');
    document.getElementById(e.target.id).value = res; // <- added this to populate value
}

// added this also - this fixed my 'element not found' error
window.addEventListener('load', function () {
    document.getElementById('editableDiv').addEventListener('paste', handlePaste);
})

顺便说一句,我使用的是 <asp:textbox> 而不是 <input> 元素。 这在 IE (11) 和 Chrome (83.x) 中对我都有效。