久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      H5編輯器核心思想的實(shí)例分析

      代碼和特性在chrome49下測(cè)試有效。

      文本渲染的本質(zhì)是對(duì)文本節(jié)點(diǎn)的渲染,通過瀏覽器內(nèi)置的對(duì)象Range可以獲得選擇的起始點(diǎn)、與終止點(diǎn)

      var range = getRangeObject();var start = range.startOffset,  end = range.endOffset;var startContainer = range.startContainer;var endContainer = range.endContainer;

      getRangeObjec代碼如下

      function getRangeObject(){if(window.getSelection)  {var selection = window.getSelection();if(selection.rangeCount > 0)  {return selection.getRangeAt(0);  }  }else if(document.selection)  {return document.selection.createRange();   }return null;  };

       起始點(diǎn)始終在左面,終止點(diǎn)始終在右面,不受選擇方向的影響。

        只有當(dāng)起始點(diǎn)的開頭或終止點(diǎn)的末尾是<br/>時(shí),返回的不是文本節(jié)點(diǎn),可以通過start,end確定br元素的位置分別是startContainer.childNodes[start],endContainer.childNodes[end-1]。返回的是文本節(jié)點(diǎn)start表示光標(biāo)相對(duì)于起始文本節(jié)點(diǎn)所在的起始位置,end表示光標(biāo)相對(duì)于終止文本節(jié)點(diǎn)所在的終止位置。

      獲得下一個(gè)文本節(jié)點(diǎn)的算法為

      function getNextTextNode(startNode,dir = "nextSibling"){//記錄startNode變化之前的狀態(tài),startNode變化后無效時(shí)便于狀態(tài)的回滾let unchangeNode = startNode;if(startNode.nodeType == 3){          startNode = startNode[dir];      }while (true){if(startNode == undefined){if(unchangeNode == undefined){//保護(hù)機(jī)制throw new Error("程序會(huì)陷入死循環(huán)");break;              }/*startNode所在的父元素所有選中節(jié)點(diǎn)遍歷完畢,將sartNode指向父元素的兄弟節(jié)點(diǎn)*/let parent = unchangeNode.parentElement;              unchangeNode = parent;              startNode = parent[dir];          }else if(startNode.nodeType == 3){//文本節(jié)點(diǎn)則退出循環(huán)break;          }else if(startNode.tagName == "BR"){//處理單標(biāo)簽,避免不必要的迭代unchangeNode = startNode;              startNode = startNode[dir];          }else if(startNode.nodeType == 1){/*如果是雙標(biāo)簽元素則進(jìn)入*/unchangeNode = startNode;if(dir == "previousSibling"){                    startNode = $(startNode).contents().last().get(0);              }else if(dir == "nextSibling"){                  startNode = $(startNode).contents().first().get(0);              }else {//便于錯(cuò)誤的定位throw new Error("錯(cuò)誤的遍歷方向:"+dir);              }          }else {//便于錯(cuò)誤的定位throw new Error("不期待的元素類型=》"+startNode);            }      }    return startNode;        }

        //上述函數(shù)用外部變量+while循環(huán)的方式取代遞歸,加入的保護(hù)機(jī)制減少誤用、潛在bug導(dǎo)致極差的體驗(yàn)。
      獲得起始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)之間的所有文本節(jié)點(diǎn)

      function getTextNodes(startTextNode,endTextNode){      let textNodeArray = [];      let node = startTextNode;while (true) {          node = getNextTextNode(node);if(node == endTextNode){break;          }          textNodeArray.push(node);      }    return textNodeArray;  }

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)