Angular中使用MathJax遇到的一些问题


Posted in Javascript onDecember 15, 2017

前言

话说我本来是倾向于 KaTeX 的,因为我感觉他很快,而且 MathJax 似乎很难配。但是大家表示对缺少功能的 KaTeX 并无好感,给我提供了一些钻研 MathJax 的动力。

MathJax简介

MathJax是一款运行在浏览器中的开源数学符号渲染引擎,使用MathJax可以方便的在浏览器中显示数学公式,不需要使用图片。目前,MathJax可以解析Latex、MathML和ASCIIMathML的标记语言。MathJax项目于2009年开始,发起人有American Mathematical Society, Design Science等,还有众多的支持者,个人感觉MathJax会成为今后数学符号渲染引擎中的主流,也许现在已经是了。

个人其实也不算钻研,因为实际上 MathJax 很简单,调用 MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.element.nativeElement]); 就可以渲染一个元素(这个 this.element.nativeElement 是从 Angular 中调用它 DOM 的语法),这个 .Queue 实际上是 MathJax 自己实现的回调格式,语法非常清奇,参数个数不定,每个都是数组,代表一个回调,顺序执行。比如这个 ['Typeset', MathJax.Hub, this.element.nativeElement] ,第一个元素是方法名,第二个元素是 this ,之后的元素都是参数……

我们可以看到这个就相当于执行 MathJax.Hub.Typeset(this.element.nativeElement) ,那为啥不执行这个?因为这方法是同步的,会导致页面十分卡。于是 MathJax 就自己封装了一个异步队列(它的 API 可能几百年没改了)

我们说回 Angular。因为要用 markdown,我的思路是用 marked 封装一个 directive。那么我们就应该在 marked 渲染完成之后用 MathJax 去 Typeset 这个组件。但真的这样做了,却产生了奇妙的效果——切换页面之后,要等将近一分钟才开始渲染。我在它的队列里放了几个 log,发现每个元素都被 queue 了 4 次,几十个元素,难怪要一分钟才开始渲染下一页的内容,即使大部分 markdown 里面根本没有数学。

这时候我开始灰心了,这个问题就没有解决办法了吗?绝望之时,我想到能不能直接 Typeset document,结果是可以的,而且十分快。所以渲染并不慢,可能是渲染的初始化过程比较慢。那么这时候方案就出来了,我们可以尽量减少渲染次数,同时只渲染 document。只要这个渲染还在进行,那么有再多的元素 queue 上来,我们也只当作 queue 了一次。

于是我就写了这么个 service:

@Injectable()
export class MathjaxService {
 public isQueued = false;
 public isRunning = false;
 window: any;
 constructor(@Inject(PLATFORM_ID) private platformId: Object) {
 if (isPlatformBrowser(this.platformId)) {
 this.window = window as any;
 }
 }
 finishRunning() {
 this.isRunning = false;
 if (this.isQueued) {
 this.queueChange();
 }
 }
 queueChange() {
 if (this.isRunning) {
 this.isQueued = true;
 } else {
 this.isQueued = false;
 this.isRunning = true;
 if (isPlatformBrowser(this.platformId)) {
 if (this.window.MathJax) {
  this.window.MathJax.Hub.Config({
  messageStyle: 'none',
  tex2jax: {
  // preview: 'none',
  inlineMath: [['$', '$']],
  processEscapes: true
  }
  });
  this.window.MathJax.Hub.Queue(['log', console, 'start'], ['Typeset', this.window.MathJax.Hub, document], ['log', console, 'end'], ['finishRunning', this]);
 }
 } else {
 this.finishRunning();
 }
 }
 }
}

事实证明,它能圆满完成任务,它也就是现在运行在 这个网站 上的代码。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
基于jquery的页面划词搜索JS
Sep 14 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
Aug 28 Javascript
JavaScript的代码编写格式规范指南
Dec 07 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
Nov 25 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
解决vue单页面应用中动态修改title问题
Jun 09 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 Javascript
Vue全局事件总线你了解吗
Feb 24 Vue.js
vue实现验证码输入框组件
Dec 14 #Javascript
基于滚动条位置判断的简单实例
Dec 14 #Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
Dec 14 #Javascript
ES6/JavaScript使用技巧分享
Dec 14 #Javascript
Django与Vue语法的冲突问题完美解决方法
Dec 14 #Javascript
浅析JS抽象工厂模式
Dec 14 #Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
Dec 14 #Javascript
You might like
php将会员数据导入到ucenter的代码
2010/07/18 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
各浏览器中querySelector和querySelectorAll的实现差异分析
2012/05/23 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
Python中请使用isinstance()判断变量类型
2014/08/25 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python测试人员需要掌握的知识
2018/02/08 Python
python实现简单学生信息管理系统
2020/04/09 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
自我鉴定范文300字
2013/10/01 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
开会迟到检讨书
2014/01/08 职场文书
庆八一活动方案
2014/01/25 职场文书
小学美术教学反思
2014/02/01 职场文书
毕业生求职自荐书范文
2014/03/27 职场文书
法人代表委托书
2014/04/04 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
优秀家长自荐材料
2014/08/26 职场文书
安全生产协议书
2016/03/22 职场文书
CSS3 菱形拼图实现只旋转div 背景图片不旋转功能
2021/03/30 HTML / CSS
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
vue3获取当前路由地址
2022/02/18 Vue.js
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers