要在textarea文本框中粘贴图片怎么办?

本文介绍了一种实现图文混排编辑功能的方法,通过使用contenteditable属性的div元素,结合自定义事件处理,实现了既能展示预设图文信息,又支持用户编辑和粘贴图文的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目需求:

有一条描述信息(文字 + 图片),点击编辑,文本框中显示描述信息,并且可以对描述信息做出修改

拆解需求:
  1. 文本框里要能显示预设的值(文字 + 图片)
  2. 文本框里还要能支持粘贴文字与图片
实际做法

最开始我试图直接使用input元素或者el-input组件,但是在网上找了很多方法,也无法实现图片的显示,后来看到某个大大分享的文章里提到【一个元素比如div加上contenteditable = ‘true’,这个元素就跟textarea文本框一样是可编辑的了】,于是开始从这里着手去解决,将解决方法分享给大家,希望对大家有帮助,啾咪~

template中

<div @edit(desc)>
	{{desc.description}}
	<img v-for=(item,index) in  desc.figure : key="index" src="item">
</div>
<el-dialog title="提示":visible.sync="dialogVisible">
		<div class="img-textarea" @paste="descImgPaste($event)" contenteditable="true" ></div>
		<el-button  @click="confirm">确定</el-button>
</el-dialog>

data中

dialogVisible: false,
desc: {
	description: '描述文字' ,
	figure:['http://pic2.sc.chinaz.com/files/pic/pic9/202004/bpic20079.jpg' ] 
}

methods中 点击编辑时要做的操作

eidt(data){ //data是描述信息,类似于{description: '描述文字' ,figure:[ 图片数组 ] }
    this.dialogVisible= true
	this.$nextTick(() => {
		   let elem = document.getElementsByClassName('img-textarea')[0]
		   let imgs = ''
		   if(data.figure.length > 0){
		       for(let item of data.figure){
		           let img= `\n<img src="${item}">`  //css样式中加入white-space:pre-line之后,\n换行才会生效
		           imgs += img
		       }
		   }
		   elem.innerHTML =  data.description + imgs 
	})
}

methods中 在文本框内粘贴图片触发的操作
(这步操作是借鉴了某个大大分享的文章,但是当时看的太多,偶找不到啦!)

descImgPaste(event){
        if (event.clipboardData || event.originalEvent) {
            let clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
            if(clipboardData.items){
                let  blob;
                for (let i = 0; i < clipboardData.items.length; i++) {
                    if (clipboardData.items[i].type.indexOf("image") !== -1) {
                        blob = clipboardData.items[i].getAsFile();
                    }
                }
                let render = new FileReader();
                render.onload = function (evt) {
                    //输出base64编码
                    let base64 = evt.target.result;
                    let imgElem = document.createElement('img')
                    imgElem.src = base64
                    document.getElementsByClassName('img-textarea')[0].appendChild(imgElem)
                }
                if(blob){
                    render.readAsDataURL(blob);
                }
            }
        }
    },

methods中编辑后点击确定做的操作

confirm(){
    this.dialogVisible= false
	let result= document.getElementsByClassName('img-textarea')[0].innerHTML
}
以下是一个简单的实例页面,实现了通过粘贴图片直接使用Ajax上传到服务器: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>粘贴图片上传</title> </head> <body> <h3>粘贴图片上传</h3> <p>请在下面的输入框中粘贴您要上传的图片:</p> <textarea id="pasteArea" rows="10" cols="50"></textarea> <br> <button onclick="upload()">上传</button> <script> function upload() { var data = new FormData(); var blob = new Blob([pasteImage]); data.append('file', blob, 'image.png'); var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onload = function() { if (xhr.status === 200) { alert('上传成功'); } else { alert('上传失败'); } }; xhr.send(data); } var pasteImage; document.getElementById('pasteArea').addEventListener('paste', function(e) { var items = e.clipboardData.items; for (var i = 0; i < items.length; i++) { if (items[i].type.indexOf('image') !== -1) { pasteImage = items[i].getAsFile(); break; } } }); </script> </body> </html> ``` 解释一下代码: 1. 首先,我们创建了一个文本框和一个上传按钮。 2. 在 `upload()` 函数中,我们创建了一个 `FormData` 对象,将粘贴图片转换成 `Blob` 对象,然后将它添加到 `FormData` 中。 3. 创建了一个 `XMLHttpRequest` 对象,并使用 `POST` 方法将 `FormData` 发送到服务器上的 `/upload` 路径。 4. 在 `XMLHttpRequest` 的 `onload` 回调函数中,判断服务器返回的状态码,如果是 `200`,则上传成功,否则上传失败。 5. 最后,在文本框的 `paste` 事件中,我们检查粘贴板中是否有图片,如果有,则将其转换成 `Blob` 对象,并保存在 `pasteImage` 变量中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值