解決wangEditor使用keep-alive緩存后,調用editor.cmd.do()失敗

前提:wangeditor版本:4.7.11? ? ?vue版本:vue2?

問題:在使用wangeditor富文本編輯器時,需求需要通過點擊一個按鈕,手動插入定義好的內容,所以使用了 editor.cmd.do('insertHTML', '....') 方法新增內容。但當頁面使用keep-alive緩存后,切換到其他頁面再切換回編輯器,此時直接調用手動插入內容,Console報錯:Uncaught TypeError: Cannot read properties of undefined (reading 'parentNode')

解決

方式一:可以發現,如果手動點擊編輯器,使光標置于編輯器內,再通過 editor.cmd.do() 方法插入內容是不會出錯的,但嘗試手動設置focus后并未解決問題。于是通過檢測錯誤,提示用戶手動確認插入位置,但因為錯誤發生在插入編輯器時,前置的一些請求等操作已經發生了,所以在這兒做一些額外的業務操作:比如調用接口刪除數據庫中剛剛未成功插入的內容等。

public activated() {window.addEventListener('error', this.watchErrorEvent);
}public deactivated() {window.removeEventListener('error', this.watchErrorEvent);
}public watchErrorEvent() {const msg = error.message;if(error.message.includes('Uncaught TypeError') &&error.message.includes(`'parentNode'`)) {this.$Message.info('請確認插入位置!');// 額外操作......}
}

方式二:方式一其實并未真正解決問題,現在從代碼層面去分析和查找問題所在。

分析:

  1. 首先定位發生錯誤的代碼:提示在geDom方法中的 var $parent = dom_core_1["default"]($node, parentNode) 出錯,一頓操作后,好吧我沒找出來原因。
  2. 那就直接查看 editor.cmd.do() 方法內部,通過debugger對比正常調用和調用出錯的情況,發現selection._currentRange中的值不同。
  3. 查看selection的內容:查看源碼 wangeditor/src/editor/selection.ts 中的?selection._currentRange,發現?_currentRange 是私有屬性,并且在 saveRange(range?:Range) 方法中賦值的。
  4. 既然 _currentRange 是私有屬性,我們就不好直接修改,而且用于賦值的range是通過Selection對象得到的range對象,那么猜測是選區出錯,那有方式可以重新設置一下selection嗎?發現 index.ts 中,有一個初始化選區的方法,查看調用的 initSelection() 方法的作用是 初始化編輯器選區,將光標定位到文檔末尾。感覺就是它了!
  5. 在組件的activated函數中調用此方法,測試后發現未報錯了,內容也成功插入。

最終代碼:

public activated() {// this.editor = new Editor(...) 對象if(this.editor) {this.editor.initSelection();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10676.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

青少年軟件編程(Python)等級考試試卷(二級)2024年3月

2024.03電子學會青少年軟件編程 Python二級 等級考試試卷 一、單選題 1.期末考試結束了,全班的語文成績都儲存在列表score 中,班主任老師請小明找到全班最高分,小明準備用Python 來完成,以下哪個選項,可以獲取最高分…

較難題 鏈表的回文結構

本題來自鏈表的回文結構_牛客題霸_牛客網 (nowcoder.com) 234. 回文鏈表 - 力扣(LeetCode) 題面: 對于一個鏈表,請設計一個時間復雜度為O(n),額外空間復雜度為O(1)的算法,判斷其是否為回文結構。 給定一個鏈表的頭…

03.Linux文件操作

1.操作系統與Linux io框架 1.1 io與操作系統 1.1.1 io概念 io 描述的是硬件設備之間的數據交互,分為輸? (input) 與輸出 (output)。 輸?:應?程序從其他設備獲取數據 (read) 暫存到內存設備中;輸出:應?程序將內存暫存的數據…

FANUC機器人基本保養概述

對于工業機器人來說,定期保養機器人可以延長機器人的使用壽命。對于FANUC機器人來說,FANUC機器人的常規保養周期可以分為日常、三個月、六個月、一年、兩年、三年。以下是FANUC機器人的基本保養周期概覽: 在實際生產應用中,可以參…

具身智能論文

目錄 1. PoSE: Suppressing Perceptual Noise in Embodied Agents for Enhanced Semantic Navigation2. Embodied Intelligence: Bionic Robot Controller Integrating Environment Perception, Autonomous Planning, and Motion Control3. Can an Embodied Agent Find Your “…

7.STL_string(詳細)

1. 什么是STL STL(standard template libaray-標準模板庫):是C標準庫的重要組成部分,不僅是一個可復用的組件庫,而且 是一個包羅數據結構與算法的軟件框架。 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普實驗室完成的原始版…

maven遠程倉庫訪問順序

首先需要了解一下各個配置文件,主要分為三類: 全局配置文件(${maven.home}/conf/settings.xml),maven安裝路徑下的/conf/settings.xml用戶配置文件(%USER_HOME%/.m2/settings.xml),windows用戶文件夾下項目配置文件:p…

C/C++ 入門(10)list類(STL)

個人主頁:仍有未知等待探索-CSDN博客 專題分欄:C 歡迎來指教! 目錄 一、標準庫中的list 1、了解 2、常用接口說明 a.常見的構造函數 b.迭代器 c. Capacity?編輯 d.Element access e.Modifiers 二、實現 1、框架 a.節點 b.迭代器 …

簡單易懂的Java Queue入門教程!

哈嘍,各位小伙伴們,你們好呀,我是喵手。運營社區:C站/掘金/騰訊云;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點,并以文字的形式跟大家一起交流,互相學習,一…

如何建設智慧黨校

隨著信息技術的飛速展開,特別是近年移動互聯網技術,物聯網技術,人工智能技術,大數據數據的深入展開,我國快速的進入信息化社會,信息化對各行各業的改造越來越深入,任何職業,任何安排…

SSM【Spring SpringMVC Mybatis】—— Spring(一)

目錄 1、初識Spring 1.1 Spring簡介 1.2 搭建Spring框架步驟 1.3 Spring特性 1.5 bean標簽詳解 2、SpringIOC底層實現 2.1 BeanFactory與ApplicationContexet 2.2 圖解IOC類的結構 3、Spring依賴注入數值問題【重點】 3.1 字面量數值 3.2 CDATA區 3.3 外部已聲明be…

淺談ArrayList和LinkedList的區別

ArrayList和LinkedList在Java中都是常用的List接口的實現類,但它們之間存在一些顯著的區別。 實現方式: ArrayList:基于數組實現。內部使用一個動態數組來存儲元素,這意味著可以通過索引快速訪問元素,時間復雜度為O(1)…

算法學習筆記(Nim游戲)

N i m Nim Nim游戲 n n n堆物品,每堆有 a i a_i ai?個,每個玩家輪流取走任意一堆的任意個物品,但不能不取,取走最后一個物品的人獲勝。 N i m Nim Nim游戲是一種經典的公平組合游戲。現在對它進行分析。 首先定義兩個博弈中的狀…

【Chisel】chisel中怎么處理類似verilog的可變位寬和parameter

在 Chisel 中處理可變位寬和參數的方式與 Verilog 有一些不同,因為 Chisel 是建立在 Scala 語言之上的。以下是如何在 Chisel 中處理這些概念的方法: 參數化(Parameters) 在 Chisel 中,參數化是通過在模塊構造函數中定…

VUE使用餓了么的上傳組件時實現圖片預覽

創作靈感 最近在寫項目時,遇到了上傳頭像的需求,我使用的是element組件中的upload組件。但是在使用時,我需要實現預覽、手動上傳頭像等功能。然而在使用餓了么組件時,這些功能還是需要我們自己去手動實現的,在手動實現…

Linux makefile進度條

語法 在依賴方法前面加上就不會顯示這一行的命令 注意 1.make 會在當前目錄下找名為“makefile” 或者 “Makefile” 的文件 2.為了生成第一依賴文件,如果依賴文件列表有文件不存在,則會到下面的依賴關系中查找 3..PHONY修飾的依賴文件總是被執行的 …

Redis——RDB、AOF和混合持久化機制

Redis提供了三種持久化機制來確保數據的持久保存,分別是RDB(Redis DataBase)、AOF(Append Only File)和混合持久化。 RDB(Redis DataBase) RDB持久化機制是將Redis在內存中的數據保存到磁盤上的…

xss-lab 1-18關payload

Less-1 ?name<script>alert()</script> Less-2 "><script>alert()</script> "οnclick"alert() " οnfοcus"alert() " οnblur"alert() Less-3 οnfοcusalert() οnbluralert() οnfοcusjavascript:aler…

Spring AopUtils深度解析:從入門到精通的全方位指南

1. 概述 AopUtils是Spring框架中的一個工具類&#xff0c;主要用于處理AOP&#xff08;面向切面編程&#xff09;相關的操作。它提供了一系列靜態方法&#xff0c;幫助開發者更方便地處理AOP中的對象、代理以及通知&#xff08;Advice&#xff09;等。 2. 用途 AopUtils的主要…

操作系統原理與系統——實驗十三多道批處理作業調度(作業可移動)

關鍵代碼 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct data{int hour;//當前小時int min;//當前分鐘 }time; struct node{char name[20];//進程名time arrive;//到達就緒隊列時間int zx;//執行時間(預期時間)int size;int ta…