问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何实现图片和颜色和完整的代码复制粘贴到自己的网站上html代码?

发布网友 发布时间:2022-04-23 02:37

我来回答

2个回答

懂视网 时间:2022-04-23 06:59

这次给大家带来vue-simplemde实现图片拖拽粘贴功能(附代码),vue-simplemde实现图片拖拽粘贴功能的注意事项有哪些,下面就是实战案例,一起来看一下。

项目使用的是vue框架,需要一个markdown的编辑框,就在npm上找了一下,发现simplemde挺不错的,由于我比较懒,就顺便在npm又搜了一下,找到了vue-simplemde这个 package ,那就开始使用它吧。

但是这个 vue-simplemde 不支持图片拖拽上传、粘贴上传,也不能说是因为这个 vue-simplemde ,因为 vue-simplemde 只是对 simplemde 的基础上封装成一个Vue插件。所以最后还是由于 simplemde 没有提供相关的功能,但是为了用户体验考虑,这个功能时必要的,除非不使用markdown编辑器。而去使用富文本编辑器,那样的话,项目很多的代码都要进行更改。所以就在网上查了文章,及在github上查了一些代码。下面将进行分析

拖拽

拖拽的API核心是 drop 这个事件,就是当我们从桌面拖动一个文件到浏览器里时,松开的时候,而触发的事件名。

我们都知道,你随便拖动一个图片到浏览器里,会直接打开这个图片,这是因为浏览器默认你拖动文件到浏览器里时,将打开这个文件,所以,我们需要阻止原生的操作。

我们现在先写一段代码,让其屏蔽掉默认事件

window.addEventListener("drop", e => {
 e = e || event
 if (e.target.className === 'CodeMirror-scroll') { // 如果进入到编辑器的话,将阻止默认事件
 e.preventDefault()
 }
}, false)

CodeMirror-scroll 这个Class就是 simplemde 编辑框的Class名称。

现在我们拖拽文件到这个编辑框,然后松掉,不会出现任何反应。如果在编辑框之外的地方,还是会继续触发默认事件。

下面就是获取 simplemde 方法,给他 drop 事件处理方法。

// 假设页面一共有三个编辑窗口,所以需要循环监听事件
[ this.$refs.simplemde1,
 this.$refs.simplemde2,
 this.$refs.simplemde3
].map(({simplemde}) => {
 simplemde.codemirror.on('drop', (editor, e) => {
 if (!(e.dataTransfer && e.dataTransfer.files)) {
 // 弹窗说明,此浏览器不支持此操作
 return
 }
 let dataList = e.dataTransfer.files
 let imageFiles = [] // 要上传的文件实例数组
 // 循环,是因为可能会同时拖动几个图片文件
 for (let i = 0; i < dataList.length; i++) {
 // 如果不是图片,则弹窗警告 仅支持拖拽图片文件
 if (dataList[i].type.indexOf('image') === -1) {
 // 下面的continue,作用是,如果用户同时拖动2个图片和一个文档,那么文档不给于上传,图片照常上传。
 continue
 }
 imageFiles.push(dataList[i]) // 先把当前的文件push进数组里,等for循环结束之后,统一上传。
 }
 // uploadImagesFile方法是上传图片的方法
 // simplemde.codemirror的作用是用于区分当前的图片上传是处于哪个编辑框
 this.uploadImagesFile(simplemde.codemirror, imageFiles)
 // 因为已经有了下面这段代码,所以上面的屏蔽默认事件代码就不用写了
 e.preventDefault()
 })
})

诈一看,代码好像有点多,那是因为注释的原因,下面是没有注释的代码。你可以根据下面的代码,有自己的见解和理解:

[ this.$refs.simplemde1,
 this.$refs.simplemde2,
 this.$refs.simplemde3
].map(({simplemde}) => {
 simplemde.codemirror.on('drop', (editor, e) => {
 if (!(e.dataTransfer && e.dataTransfer.files)) {
 return
 }
 let dataList = e.dataTransfer.files
 let imageFiles = []
 for (let i = 0; i < dataList.length; i++) {
 if (dataList[i].type.indexOf('image') === -1) {
 continue
 }
 imageFiles.push(dataList[i])
 }
 this.uploadImagesFile(simplemde.codemirror, imageFiles)
 e.preventDefault()
 })
})

粘贴

粘贴的API是 paste 方法,这个不像上面一样,粘贴不需要禁止默认事件,因为我们可以看到,你复制一个图片,到浏览器里按下 ctrl+v 的时候,是不会发生任何变化的,所以没用必要禁止默认事件。

下面是代码:

simplemde.codemirror.on('paste', (editor, e) => { // 粘贴图片的触发函数
 if (!(e.clipboardData && e.clipboardData.items)) {
 // 弹窗说明,此浏览器不支持此操作
 return
 }
 try {
 let dataList = e.clipboardData.items
 if (dataList[0].kind === 'file' && dataList[0].getAsFile().type.indexOf('image') !== -1) {
 this.uploadImagesFile(simplemde.codemirror, [dataList[0].getAsFile()])
 }
 } catch (e) {
 // 弹窗说明,只能粘贴图片
 }
})

之所以这里写上 try...catch 方法,是因为如果你粘贴的时候,如果是一个文件, items 将是空的,而在下面的if循环里,使用 dataList[0].kind 。也就是 e.clipboardData.items[0].kind 。当 item 为空时,还去访问一个不存的 kind 属性时,就会报错了。所以这里需要使用 try...catch 方法进行判断。

dataList[0].getAsFile().type.indexOf('image') !== -1 这个句话是判断,粘贴的东西确认是图片,而不是其他东西。

if 里的上传图片,不一样的地方是 [dataList[0].getAsFile()] ,因为为了统一格式,方便 uploadImagesFile 函数进行处理,我加上了 [] ,使之成为数组。 dataList[0].getAsFile() 就是获取文件实例了。

上传

上传就有一点麻烦了:

uploadImagesFile (simplemde, files) {
 // 把每个文件实例使用FormData进行包装一下,然后返回一个数组
 let params = files.map(file => {
 let param = new FormData()
 param.append('file', file, file.name)
 return param
 })
 let makeRequest = params => {
 return this.$http.post('/Api/upload', params)
 }
 let requests = params.map(makeRequest)
 this.$http.spread = callback => {
 return arr => {
 return callback.apply(null, arr)
 }
 }
 // 服务端返回的格式是{state: Boolean, data: String}
 // state为false时,data就是返回的错误信息
 // state为true时,data是图片上传后url地址,这个地址是针对网站的绝对路径。如下:
 // /static/upload/2cfd6a50-3d30-11e8-b351-0d25ce9162a3.png
 Promise.all(requests)
 .then(this.$http.spread((...resps) => {
 for (let i = 0; i < resps.length; i++) {
 let {state, data} = resps[i].data
 if (!state) {
 // 弹窗显示data的错误信息
 continue
 }
 let url = `![](${location.origin + data})` // 拼接成markdown语法
 let content = simplemde.getValue()
 simplemde.setValue(content + url + '
') // 和编辑框之前的内容进行拼接
 }
 }))
}

因为我是把 axiox 封装成vue插件来使用,这样会导致, this.$http 是实例化后的,而不是他本身。 axios 维护者说的解决方案是,重新引入 axios 包,来使用。但是我觉得没有必要。 axios.all 内部是 Promise.all 。 axios.spread 实现代码比较少,就直接拿过来,重新赋值给 axios 就好了

所以上面有段代码是

Promise.all(requests)
 .then(this.$http.spread((...resps) => {
 // code
 })

把这段代码翻译一下就是

axios.all(requests)
 .then(axios.spread((...resps) => {
 // code
 })

关于这个问题,请看下官方的解释:axios-all-is-not-a-function-inside-vue-component 。也可以看下 axios 的代码: axios.js#L45-L48

这个问题,暂时就不深究了,我们回到刚刚的话题上。

上面我说到当state为true时,data是文件相对于网站的绝对路径,如: /static/upload/2cfd6a50-3d30-11e8-b351-0d25ce9162a3.png

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

jQuery编码转化base64通过AJAX上传

vue组件写法规范

热心网友 时间:2022-04-23 04:07

你要获取图片和颜色的完整代码,肯定就是源码,内容什么的都是存放在服务器上面的,不获取源码,怎么从服务器上拿
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 银行卡冻结后身份证能买车票? 被起诉了冻结了身份证银行卡会对我的生活造成什么影响呢? 想买一台家用的扫描仪, 佳能110,100和中晶的F60,3870不知道选哪款好,佳能的扫描元件是CIS,中晶的是CCD的 佳能数码相机100、110和120买那个好 佳能110扫描仪的性能怎么样呀?贵不贵? 佳能相机100,还有110和120买哪款比较合算 佳能ixus120和110长沙报价多少? 想买佳能ixus110和ixus120 到底哪个比较好请懂行的作答 佳能IXUS110和IXUS120哪个好? 佳能买110IS好还是120IS好呢???说说他们的优点和缺点 佳能110IS跟120IS有什么区别么? 佳能110 和120哪个好? 佳能相机佳能IXUS110和佳能IXUS120有什么区别,哪个好 佳能IXUS110与佳能IXUS120有什么分别? 用紫砂锅炖银耳汤可以一直通电用小火炖一整晚吗? 求万能的小伙伴告诉下 佳能扫描仪lide110和lide120有什么区别么? 如何用紫砂锅炖鸡汤 紫砂鸡汤煲怎么做好吃 紫砂锅煲汤有啥好处? 请问煲汤用的紫砂锅哪个牌子的好,4-5个人要买多少升的? 会声会影可以剪切合并视频吗? 会声会影10如何剪辑视频? 毛不易特别老实,特别老实的人都有哪些特性? 毛不易自曝很久没谈恋爱,当代青年恋爱现状是怎样的? 毛不易是一个很安静的歌手,他会不会喜欢很跳脱的女生? 毛不易坦言自己没人喜欢,为何大多数人表示自己也是? 史上崛起最快的男歌星,从幕后到台前到做导师到结婚,堪称神速,你怎么看? 手机连wifi,之前都可以连,后面突然就显示:网络已禁用,无法连接。一直在显示“正在获取IP地址” 翻唱别人歌曲,看不起毛不易,惹朴树发火,他还做了多少过分的事情? 手机等设备连接无线WiFi网络后显示已禁用怎么办 我手机上的移动设置的网络运营商,里面手动选择里有中国联通(禁用),什么意思。以前都是可以用的 原装有win7系统的MACmini上安装winserver2012时出现 windows boot manager怎么处理,紧急求救 阿迪达斯有一双鞋子是黑色尖头的,三道白扛延伸到鞋底的是什么鞋子? 阿迪达斯 有一款篮球鞋全黑 鞋后面有三条白竖杠 求型号! 阿迪达斯经典老款 鞋面白色 左右是黑色的三道杠的足球鞋 阿迪达斯有G49120这款鞋吗 三道杠的 黑色白底 鞋 阿迪达斯的,鞋头是白色的,其他是蓝色的,三条杠是白色的,女鞋,以前在网上看到过,还有黑色款的 求adidas pro model 2g 全黑男款篮球鞋(侧面三条杠是白色的)货号和北京购买地址 童鞋白色带黑色三道鞋子脚后跟好像一朵花一样,是什么牌子的 阿迪达斯的白色三条纹,有点脏了,就是有点黑,怎么洗干净??