貌似我没有像QQ邮箱之类的装知乎的插件

是用HTML5的新功能实现的吗?

看了@朱利安 的回答,发现我描述的不够清楚

我是用QQ截图之类的工具截的图,然后图片本身是保存在剪切板里的,剪切板中保存的*不是*图片的地址

大家可以自己试一下,用QQ截张图,然后在下面的编辑框里 Ctrl+V 一下

回复内容:

呵呵,刚发现知乎编辑器有这么强的功能,赶紧研究一下,记录如下抓包

截个图,然后粘贴到编辑器,查看 HTTP 包,发现有对upload.zhihu.com/upload 的请求

request 的格式是multipart/form-data; 图片的内容作为request body 的一部分一起传了过去

这里大概就能推测出基本原理了:监听粘贴 → 获取粘贴内容 → 将内容上传

搜索代码

在 rich_text_editor.js 里面搜索 /upload 字样,搜到了这么一段this.Vz = "http://upload." + Ak.Sl + ":" + location.port + "/upload";

估计是设置属性,那么再搜 .Vz 看看哪里用到了,于是看到function zE(a, b) {

var c = new FormData;

c.append("via", "xhr2");

c.append("upload_file", b);

var d;

d = $.ajaxSettings.xhr();

d.withCredentials = i;

var f = $.ajax({url: a.Vz,data: c,processData: l,contentType: l,xhr: function() {

return d

},type: "POST"}).done(function(a) {

啊,找到了,这里应该就是发送图片数据的地方,而且用了 FormData 这个 HTML5 特性

简单说就是 ajax 以前只能向服务器发送文本,而 HTML5 提供的 XMLHttpRequest Level2 现在支持发送二进制数据了,这里的 c.append("upload_file", b) 里面 b 应该就是那个图片的二进制数据

打断点

继续追踪就容易多了,只要在这个地方打个断点,然后往编辑器里面粘贴一个截图

Chrome 调试工具的 Call Stack 就会告诉你,程序的上一步在哪里

看一看 a 对象的属性基本可以断定它是一个 Event 对象,而且这里的这段 function 就是对粘贴事件的处理,为了验证,搜索一下 .rw 就会看到这样一段a.f().addEventListener("paste", u(this.rw, this));

确定推断无误,可以看到上面的处理函数中,通过 a.clipboardData 就能取到剪贴板中的数据,并且可以通过 clipboardData.types 来判断数据是不是图片。

这么高级的 API 是哪里来的呢?搜一下就知道了 Clipboard API and events

可以看到这个 API 属于 W3C 的标准(当然还是草案阶段),但是不属于 HTML5

另外代码中的重点是这么一段c.type.indexOf("image") && (zE(b, c.getAsFile()), a.preventDefault())

zE 就是上面的那个 ajax 发送函数,而通过 c.getAsFile() 可以从剪贴板中获取二进制的数据

结论

通过 Clipboard API 可以在用户粘贴时获知粘贴的内容,包括内容的格式(是否为图片),内容的二进制数据等等

通过 XMLHttpRequest Level2 可以实现将二进制数据以 ajax 的方式发送到服务器,即实现了上传功能

当然以上都需要浏览器的支持,估计IE下就悲剧了

最后,我现在迫切期待新浪微博的发布框能支持这个功能

这个和 HTML5 没有太大关系,网页浏览器很早就有这个标准了,不同浏览器下的实现接口略有区别。

粘贴(包括富文本、图片等各种格式的内容)是利用了 contentEditable p 的 onPaste 事件。

知乎的 JavaScript 源代码经过了混淆和压缩,非人类可阅读的,所以我就不扒他的代码了。

当在编辑器上执行粘贴的时候,onPaste 事件被触发,同时有一个事件参数 event,包含 clipboardData 的属性。

简单来说,代码逻辑可能是这样的:function onPasteEvent (e) {

if (e && e.clipboardData && e.clipboardData.getData)

{

if (/image/.test(e.clipboardData.types))

{

//粘贴图片

var imageContent = e.clipboardData.getData('image/xxxx');

//检测图片来源

//如果是最原始的 data,比如 QQ 截图、Word 里复制所产生,直接把 data 上传

//这一部分可能用了是 HTML5 中 HTTP_CONTENT_DISPOSITION 上传机制

//除了 HTML5,非显式的 input[type="file"] 应该是无法上传文件的

//如果是 file,上传到知乎服务器

//如果是外部网站 URL,后台 curl get 转移到知乎服务器

//最后生成一个知乎的 URL,作为 img 标签插入到 contentEditable div 中

}

else if (/text\/plain/.test(e.clipboardData.types)) {

//粘贴简单文本 ....

}

else

{

//....

}

if (e.preventDefault)

{

e.stopPropagation();

e.preventDefault();

}

return false;

}}

以上就是关于知乎回答问题编辑框用Ctrl+V 粘贴图片是如何实现的详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php编译工具 知乎,关于知乎回答问题编辑框用Ctrl+V 粘贴图片是如何实现的详解...相关推荐

  1. Java--使用反编译工具,打开jar包,查看源码

    操作系统:Windows 1.反编译工具: 链接:https://pan.baidu.com/s/1GwglWXc_lj5Q60g1t16lTA 提取码:tf5l  2.下载好后,解压至自己存放的路径 ...

  2. 微信开发者工具 / 反编译工具CrackMinApp 下载安装

    微信开发者工具 / 反编译工具CrackMinApp 下载安装 文章目录 微信开发者工具 / 反编译工具CrackMinApp 下载安装 前言 一.微信开发者工具下载安装 二.反编译工具CrackMi ...

  3. CMake使用详解一(单文件编译)

    文章目录 1 什么是CMake 2 单个源文件编译 2.1 编写单个cpp文件 2.2 编写CMakeLists.txt 2.3 使用`cmake .`和`make`编译项目 2.3.1 执行`cma ...

  4. 【PC工具】更新在线流程图绘制工具bullmind,免费云存储流程图绘制,可直接粘贴图片...

    上次推荐了bullmind,今天谈谈使用感受,再推荐一款类似的软件. 先发个bullmind快捷键: 每次进入都会提示上边的快捷键,为什么我要发呢?因为"创建标签"(快捷键t)和双 ...

  5. 【PC工具】推荐在线流程图绘制工具,免费云存储流程图绘制,可直接粘贴图片...

    如题,今天发现一个免费好用的流程图在线绘制工具.推荐给大家,今天简单用了一下,出了有点卡顿和需要双击输入文本框,没发现什么大问题,重点是,这貌似(可能)是唯一一个免费的可以直接粘贴图片的流程图在线绘制 ...

  6. JVM性能调优篇07-阿里巴巴Arthas工具详解

    Arthas工具 Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具.支持 JDK6+, 采用命令行交互模式,可以方便的定位和诊断线上程序运行问题.Arthas 官方 ...

  7. c语言编译过程详解,预处理,编译,汇编,链接(干货满满)

    楔子 我们在各自的电脑上写下代码,得明白我们代码究竟是如何产生的,不想了解1,0什么的,但这几个环节必须掌握吧. 我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令 ...

  8. 反编译工具java知乎_GDA反编译器更新至3.66:支持污点传播分析、方法签名、python脚本...

    本帖最后由 gjden 于 2019-9-24 16:44 编辑 GDA3简介(下载链接: www.gda.wiki:9090) GDA是一款由本人对反编译理论的长期研究和实践而形成的全交互式反编译器 ...

  9. 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 )

    文章目录 一.Oboe 简介 二.Oboe 特点 三.Oboe 编译工具 四.Oboe 文档 五.Oboe 测试 一.Oboe 简介 Oboe 简介 : ① 函数库 : Oboe 是 C++ 函数库 ...

最新文章

  1. mysql表恢复报错binlog_mysql数据恢复,利用binlog2sql快速闪回
  2. 跨域策略文件crossdomain.xml的配置方法
  3. 编程之美-子数组之和的最大值(二维)方法整理
  4. OpenCV circle函数
  5. 顶级c程序员之路 基础篇 - 第一章 关键字的深度理解 number-1
  6. 在博客园的博客插入代码块(高亮、行号、缩进、着色)
  7. 关于 jMeter 结果报表里的 APDEX (Application Performance Index)
  8. cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧
  9. 勾股定理python思路_趣叮咚编程数学揭秘:为什么勾股定理a+b=c?
  10. (二)深入了解机器翻译
  11. Spring学习总结(23)——Spring Framework 5.0 新特性
  12. ServiceStack.Redis 连接有密码的Redis问题解决
  13. Family.Show:一个很好玩的东东
  14. 四、矩阵特征值与特征向量的计算
  15. python最全画地图,可视化数据
  16. 使用Windbg分析蓝屏原因
  17. python人流热力图_高德地图热力图插件实现人流量监控,如何实现人流数据实时刷新...
  18. 6 种 Python 数据可视化工具
  19. 考研笔记——王道C语言
  20. Wordpress红色财经股票外汇网站主题 pron-red

热门文章

  1. IBM押注沃森人工智能技术 未来6年或达170亿美元
  2. Npm 包版本知识总结
  3. DB2数据库常用工具
  4. ffmpeg流文件合并concat
  5. python接口自动化(二十四)--unittest断言——中(详解)
  6. Androidstudio SVN安装与使用
  7. 线性递推式+求第N项,用矩阵快速幂 如何构造初始矩阵
  8. Markov Decision Processes
  9. as用百度地图不联网就gg
  10. Uva5009 Error Curves