亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

江门市| 永修县| 东城区| 通海县| 张掖市| 曲麻莱县| 平乐县| 东平县| 温州市| 志丹县| 金乡县| 手游| 临朐县| 凤翔县| 霍林郭勒市| 黎平县| 根河市| 孝义市| 余江县| 湖南省| 米泉市| 玉树县| 綦江县| 大城县| 岳普湖县| 安塞县| 仁化县| 东平县| 新泰市| 文安县| 廉江市| 涿鹿县| 金川县| 余干县| 海淀区| 溆浦县| 达尔| 荥阳市| 乃东县| 吉安市| 镇雄县|