Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

移动端富文本实践篇(一) #32

Open
laizimo opened this issue Sep 18, 2017 · 0 comments
Open

移动端富文本实践篇(一) #32

laizimo opened this issue Sep 18, 2017 · 0 comments

Comments

@laizimo
Copy link
Owner

laizimo commented Sep 18, 2017

前言

本篇文章之前,有一篇前言篇,如果你还未读过,建议你花一分钟的时间,先读一下前言篇。前言篇,篇幅较少,并不会花费你太多的时间,但是概括了接下来几篇文章的主要内容。

本篇文章主要是讲一些移动端富文本开发之前,所需要了解的基础内容。基础内容可以分成三部分。我们首先考虑的是webView与js之间的交互,之后就是原生富文本功能,最后就是Selection和Range的概念。所以,本篇会根据这三部分来详细阐述基础内容。欢迎关注我的github博客。同时也希望你关注和支持我们的项目,github项目地址,谢谢支持。

正文

聊聊webView和js的那点事

我这里并不具体聊webView的具体使用,而是讲一下我们在项目中会使用的js与webView之间的一些信息交互。在这个项目中,我们主要使用了两种方式进行通信:

  1. url拦截

所谓的url拦截,在我的理解中,就是网页可以通过跳转url的方式,将内部信息填入url中,然后webView在其跳转前,将它的url获取到,然后阻断这个过程。然后在对url进行解密,之后拆分里面的信息。都知道url其实是base64编码的,在传输信息的过程,js需要去调用encodeComponentURI函数加密整个信息的。

这里的表达方式有一点俗气,哈哈,也没啥办法,因为通俗易懂吧

  1. 对象映射的方式

对象映射的方式就是,在Android建立一个对象,并添加上webView中提供的注解,然后在内部添加方法,这些添加的方法是可以被js使用的。但是,似乎这种对象映射的方式,并不是特别的安全,容易遭到注入攻击。

  1. alert弹窗方式

这种方式,并没有在我们的项目中使用到。只是,当时使用的是比较老的版本的webview,那里还是具备之前的两种方法的。看过很多的博文,似乎这种方法或许是目前最常用的一种方式,而另外两种已经在新版本的webView中被淘汰了。所以,我们或许会在下个版本去考虑更新这种机制。

交互通信这一方面就聊这么多吧,毕竟我是一个研究js的小渣渣,具体的webView的操作,网上的大佬们已经书写万字了,也并不需要我去多做讲解。之后,会有具体的参考博文赋上。

富文本都会谈到的东西

说到富文本应用的开发,你或许会直接考虑到contenteditable这个属性。因为它可以使得一个块可编辑。但是富文本应用并不仅仅如此。接下来,我们来看看一些我在项目中会经常使用到的API接口:

最重要的接口一定是execCommand函数,这个函数是富文本的灵魂。因为之后所需要去完成的功能——加粗、斜体、删除线、引用、标题h1、h2、h3、h4等,当然也包括图片、链接、分割符,都是需要通过这个函数去进行的。

这个函数接收三个参数:

  1. command => 就是命令,因为原生的函数已经定义了一部分的命令在函数的内部,例如加粗:

    document.execCommand('bold', false, null);
  2. showDefaultUI => 是否展示用户界面,一般都会使用false,项目中并未对这个属性进行设置(忽略)

  3. value => 一些特殊的命令需要插入值时,需要用到这个参数。之后在讲解项目细节时会详细说明。

第二个会使用到的API是——queryCommandState();

它接受一个参数command,然后返回boolean。主要是去判断当前的焦点是否具备command。打个比方,你在使用富文本的时候,你需要去点击内容中的一个部分进行编辑,但是,当你点击时,你需要去做一下底栏按钮间的状态同步。可能这一部分是bold,但是你加粗按钮却没有被激活的话,就非常尴尬了。

第三个会使用的API是——queryCommandValue():

这里也是接受一些特定的命令的插入内容是否存在。我们可以来详细的举个例子:

**场景:**我们需要去插入一个h1标签元素,之后我们又需要去获取到当前位置是否具备h1标签

//插入h1

document.execCommand('formatBlock', false, 'h1');

//获取状态时

var isExist = document.queryCommandValue('formatBlock');

这样我们就可以去,获取当前是否具备h1标签

你可能从来没听过我

最后,我们来看一下,我们之后会涉及到的知识点Selection和Range。

Selection,可以解释为选区。讲的通俗点,整个选区就是文本可以编辑的区块。一般整个窗口只有一个选区。

如何取得选区?可以通过window.getSelection()来获得选区。

讲到选区的话,就必须牵扯到一个概念——Range。Range:字面意思是范围。这个东西大家都见识过。当你在屏幕上,选择复制块的时候,那块全部被蓝色包裹的区域。(底色也可能不是蓝色的,颜色可以修改)。这种块往往可以具备多个,通过ctrl键来增加多个范围块。在富文本的开发中,对于这个运用的也非常之多。

同时,其实焦点也是Range。只是这个Range的start和end重合在了一起。在聚焦的过程中,也会对这一概念进行运用。详情可见

总结

富文本开发的基础内容,就简单的介绍这么一点。后续会随着js的源码一步步的展开分析。

本篇的内容可概括为:

  • js的webView交互
  • 富文本开发基础API
  • Selection和Range简述

这些内容,都是我在富文本开发中会使用到的知识点。

如果你对我写的有疑问,可以评论,如我写的有错误,欢迎指正。你喜欢我的博客,请给我关注Star~呦。大家一起总结一起进步。欢迎关注我的github博客

@laizimo laizimo changed the title 移动端富文本实践篇(二) 移动端富文本实践篇(一) Jan 15, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant