仅将纯文本粘贴到可编辑 div 中

发布于 2024-09-16 01:18:59 字数 205 浏览 10 评论 0原文

我需要能够允许用户粘贴到可编辑的 div 中(通过用户选择的任何方式:右键单击并粘贴、快捷键等),但我想放弃格式设置,只采用纯文本。

我无法使用文本区域,因为如果由用户启动的事件应用,div 将允许基本格式(粗体和斜体)。

onbeforepaste 事件看起来很有希望,但根据 quirksmode 的说法,支持非常有限,以至于无法使用。

I need to be able to allow a user to paste into an editable div (via whatever the user chooses: right-click and paste, shortcut key, etc), but I want to discard formatting and only take the plain text.

I can't use a textarea since the div will allow basic formatting (bold and italic) if applied by user-initiated events.

The onbeforepaste event looked promising, but according to quirksmode the support is so limited as to be unusable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

绮筵 2024-09-23 01:18:59

这很棘手,但并非不可能。您可以做的事情非常复杂,并且需要一些技巧,可以在 Firefox 2+、IE 5.5+ 和最新的 WebKit 浏览器(例如 Safari 4 或 Chrome)中工作(在旧版本上未经测试)。 TinyMCE 和 CKEditor 的最新版本在其基于 iframe 的编辑器上使用了此技术:

  1. 使用按键事件处理程序检测 ctrl-v / shift-ins 事件
  2. 在该处理程序中,保存当前用户选择,在屏幕外添加一个 textarea 元素(比如说在文档的左侧-1000px),关闭 contentEditable 并在文本区域上调用 focus() ,从而移动插入符并有效地重定向粘贴
  3. 在事件处理程序中设置一个非常短的计时器(比如 1 毫秒)来调用另一个函数存储 textarea 值,从文档中删除 textarea,重新打开 contentEditable,恢复用户选择并粘贴文本。

请注意,这仅适用于键盘粘贴事件,不适用于从上下文或编辑菜单粘贴。 paste 事件会更好,但当它触发时,将插入符号重定向到文本区域(至少在某些浏览器中)为时已晚。

This is tricky but not impossible. What you can do is quite involved and a bit of a hack that will work in Firefox 2+, IE 5.5+ and recent WebKit browsers such as Safari 4 or Chrome (untested on older versions). Recent versions of both TinyMCE and CKEditor use this technique on their iframe-based editors:

  1. Detect a ctrl-v / shift-ins event using a keypress event handler
  2. In that handler, save the current user selection, add a textarea element off-screen (say at left -1000px) to the document, turn contentEditable off and call focus() on the textarea, thus moving the caret and effectively redirecting the paste
  3. Set a very brief timer (say 1 millisecond) in the event handler to call another function that stores the textarea value, removes the textarea from the document, turns contentEditable back on, restores the user selection and pastes the text in.

Note that this will only work for keyboard paste events and not pastes from the context or edit menus. The paste event would be better but by the time it fires, it's too late to redirect the caret into the textarea (in some browsers, at least).

爱格式化 2024-09-23 01:18:59

对于 Ctrl+v 我检查了 keyup 上可编辑 div 的内容。您可以修改该事件中的内容。我正在使用 nicedit 文本编辑器。
这不适用于从右键单击粘贴 ->粘贴。
对于“粘贴”,我必须使用 settimeout 修改内容。

.addEvent('paste', function(e) {
        setTimeout(function(){
            if(condition){
                //modify content
            }
        },350);
    });

For Ctrl+v I checked the content of the editable div on keyup. You can modify the content in that event. I was using nicedit text editor.
This did not work for paste from right click-> paste.
For 'paste' I had to modify the content using settimeout.

.addEvent('paste', function(e) {
        setTimeout(function(){
            if(condition){
                //modify content
            }
        },350);
    });
抠脚大汉 2024-09-23 01:18:59

也可以使用 javaScript 对其进行攻击。希望这有助于

此处创建了一个示例

<div contentEditable="true" id="clean-text-div"> </div>
<div id="clean-btn"> Clean Me</div>
<div id="message"> paste html content and clean background HTML for pure text</div>


$("#clean-btn").click(function(){
    $("#clean-text-div").text($("#clean-text-div").text());
    $("#message").text("Your text is now clean");
});

It can also be hacked by using javaScript. Hope this helps

I created an example here

<div contentEditable="true" id="clean-text-div"> </div>
<div id="clean-btn"> Clean Me</div>
<div id="message"> paste html content and clean background HTML for pure text</div>


$("#clean-btn").click(function(){
    $("#clean-text-div").text($("#clean-text-div").text());
    $("#message").text("Your text is now clean");
});
别理我 2024-09-23 01:18:59

您是否尝试过“粘贴”或“输入”等事件?然后你可以使用正则表达式来删除所有html标签

$(document).bind('paste', function(e){ alert('pasting!') })

http://www. hscripts.com/scripts/JavaScript/remove-html-tag.php

有一个关于粘贴事件的讨论,您还应该阅读:
捕获粘贴输入

Did you try the event such as "paste" or "input" ? Then you can use regex to trip all html tag

$(document).bind('paste', function(e){ alert('pasting!') })

http://www.hscripts.com/scripts/JavaScript/remove-html-tag.php

There is a discussion on paste event you should also read :

Catch paste input

一腔孤↑勇 2024-09-23 01:18:59

您可以使用:

yourContentEditable.addEventListener('paste', handlePaste)

function handlePaste(e) {
    e.preventDefault()
    let text = e.clipboardData.getData("text/plain")
    document.execCommand("insertText", false, text)
}

execCommand 现在似乎已被弃用。所以要小心。但主要浏览器继续支持它。

You can use:

yourContentEditable.addEventListener('paste', handlePaste)

function handlePaste(e) {
    e.preventDefault()
    let text = e.clipboardData.getData("text/plain")
    document.execCommand("insertText", false, text)
}

execCommand seems to be deprecated nowaday. So be careful with it. But main browsers continue to support it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文