91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular中使用MathJax遇到的問題有哪些

發布時間:2021-07-09 10:08:25 來源:億速云 閱讀:162 作者:小新 欄目:web開發

這篇文章主要介紹了Angular中使用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();
 }
 }
 }
}

事實證明,它能圓滿完成任務,它也就是現在運行在 這個網站 上的代碼。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Angular中使用MathJax遇到的問題有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孝义市| 金平| 故城县| 昌都县| 晋城| 黔西县| 高碑店市| 石嘴山市| 揭阳市| 二连浩特市| 高陵县| 中牟县| 宁武县| 合作市| 亳州市| 晴隆县| 崇信县| 临城县| 太和县| 台山市| 灌阳县| 封丘县| 青川县| 渝中区| 五原县| 文水县| 合水县| 清涧县| 宜丰县| 宿迁市| 收藏| 旬邑县| 邹城市| 宝丰县| 昌邑市| 东辽县| 垣曲县| 建始县| 民丰县| 绥棱县| 敦煌市|