📄 range.js
字号:
if(!dojo._hasResource["dijit._editor.range"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dijit._editor.range"] = true;dojo.provide("dijit._editor.range");dijit.range={};dijit.range.getIndex=function(/*DomNode*/node, /*DomNode*/parent){// dojo.profile.start("dijit.range.getIndex"); var ret=[], retR=[]; var stop = parent; var onode = node; var pnode, n; while(node != stop){ var i = 0; pnode = node.parentNode; while((n=pnode.childNodes[i++])){ if(n===node){ --i; break; } } if(i>=pnode.childNodes.length){ dojo.debug("Error finding index of a node in dijit.range.getIndex"); } ret.unshift(i); retR.unshift(i-pnode.childNodes.length); node = pnode; } //normalized() can not be called so often to prevent //invalidating selection/range, so we have to detect //here that any text nodes in a row if(ret.length>0 && onode.nodeType==3){ n = onode.previousSibling; while(n && n.nodeType==3){ ret[ret.length-1]--; n = n.previousSibling; } n = onode.nextSibling; while(n && n.nodeType==3){ retR[retR.length-1]++; n = n.nextSibling; } }// dojo.profile.end("dijit.range.getIndex"); return {o: ret, r:retR};}dijit.range.getNode = function(/*Array*/index, /*DomNode*/parent){ if(!dojo.isArray(index) || index.length==0){ return parent; } var node = parent;// if(!node)debugger dojo.every(index, function(i){ if(i>=0&&i< node.childNodes.length){ node = node.childNodes[i]; }else{ node = null; console.debug('Error: can not find node with index',index,'under parent node',parent ); return false; //terminate dojo.every } return true; //carry on the every loop }); return node;}dijit.range.getCommonAncestor = function(n1,n2,root){ var getAncestors = function(n,root){ var as=[]; while(n){ as.unshift(n); if(n!=root && n.tagName!='BODY'){ n = n.parentNode; }else{ break; } } return as; }; var n1as = getAncestors(n1,root); var n2as = getAncestors(n2,root); var m = Math.min(n1as.length,n2as.length); var com = n1as[0]; //at least, one element should be in the array: the root (BODY by default) for(var i=1;i<m;i++){ if(n1as[i]===n2as[i]){ com = n1as[i] }else{ break; } } return com;}dijit.range.getAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){ root = root || node.ownerDocument.body; while(node && node !== root){ var name = node.nodeName.toUpperCase() ; if(regex.test(name)){ return node; } node = node.parentNode; } return null;}dijit.range.BlockTagNames = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|DT|DE)$/;dijit.range.getBlockAncestor = function(/*DomNode*/node, /*RegEx?*/regex, /*DomNode?*/root){ root = root || node.ownerDocument.body; regex = regex || dijit.range.BlockTagNames; var block=null, blockContainer; while(node && node !== root){ var name = node.nodeName.toUpperCase() ; if(!block && regex.test(name)){ block = node; } if(!blockContainer && (/^(?:BODY|TD|TH|CAPTION)$/).test(name)){ blockContainer = node; } node = node.parentNode; } return {blockNode:block, blockContainer:blockContainer || node.ownerDocument.body};}dijit.range.atBeginningOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){ var atBeginning = false; var offsetAtBeginning = (offset == 0); if(!offsetAtBeginning && node.nodeType==3){ //if this is a text node, check whether the left part is all space if(dojo.trim(node.nodeValue.substr(0,offset))==0){ offsetAtBeginning = true; } } if(offsetAtBeginning){ var cnode = node; atBeginning = true; while(cnode && cnode !== container){ if(cnode.previousSibling){ atBeginning = false; break; } cnode = cnode.parentNode; } } return atBeginning;}dijit.range.atEndOfContainer = function(/*DomNode*/container, /*DomNode*/node, /*Int*/offset){ var atEnd = false; var offsetAtEnd = (offset == (node.length || node.childNodes.length)); if(!offsetAtEnd && node.nodeType==3){ //if this is a text node, check whether the right part is all space if(dojo.trim(node.nodeValue.substr(offset))==0){ offsetAtEnd = true; } } if(offsetAtEnd){ var cnode = node; atEnd = true; while(cnode && cnode !== container){ if(cnode.nextSibling){ atEnd = false; break; } cnode = cnode.parentNode; } } return atEnd;}dijit.range.adjacentNoneTextNode=function(startnode, next){ var node = startnode; var len = (0-startnode.length) || 0; var prop = next?'nextSibling':'previousSibling'; while(node){ if(node.nodeType!=3){ break; } len += node.length node = node[prop]; } return [node,len];}dijit.range._w3c = Boolean(window['getSelection']);dijit.range.create = function(){ if(dijit.range._w3c){ return dojo.doc.createRange(); }else{//IE return new dijit.range.W3CRange; }}dijit.range.getSelection = function(win, /*Boolean?*/ignoreUpdate){ if(dijit.range._w3c){ return win.getSelection(); }else{//IE var id=win.__W3CRange,s; if(!id || !dijit.range.ie.cachedSelection[id]){ s = new dijit.range.ie.selection(win); //use win as the key in an object is not reliable, which //can leads to quite odd behaviors. thus we generate a //string and use it as a key in the cache id=(new Date).getTime(); while(id in dijit.range.ie.cachedSelection){ id=id+1; } id=String(id); dijit.range.ie.cachedSelection[id] = s; }else{ s = dijit.range.ie.cachedSelection[id]; } if(!ignoreUpdate){ s._getCurrentSelection(); } return s; }}if(!dijit.range._w3c){ dijit.range.ie={ cachedSelection: {}, selection: function(win){ this._ranges = []; this.addRange = function(r, /*boolean*/internal){ this._ranges.push(r); if(!internal){ r._select(); } this.rangeCount = this._ranges.length; }; this.removeAllRanges = function(){ //don't detach, the range may be used later// for(var i=0;i<this._ranges.length;i++){// this._ranges[i].detach();// } this._ranges = []; this.rangeCount = 0; }; var _initCurrentRange = function(){ var r = win.document.selection.createRange(); var type=win.document.selection.type.toUpperCase(); if(type == "CONTROL"){ //TODO: multiple range selection(?) return new dijit.range.W3CRange(dijit.range.ie.decomposeControlRange(r)); }else{ return new dijit.range.W3CRange(dijit.range.ie.decomposeTextRange(r)); } }; this.getRangeAt = function(i){ return this._ranges[i]; }; this._getCurrentSelection = function(){ this.removeAllRanges(); var r=_initCurrentRange(); if(r){ this.addRange(r, true); } }; }, decomposeControlRange: function(range){ var firstnode = range.item(0), lastnode = range.item(range.length-1) var startContainer = firstnode.parentNode, endContainer = lastnode.parentNode; var startOffset = dijit.range.getIndex(firstnode, startContainer).o; var endOffset = dijit.range.getIndex(lastnode, endContainer).o+1; return [[startContainer, startOffset],[endContainer, endOffset]]; }, getEndPoint: function(range, end){ var atmrange = range.duplicate(); atmrange.collapse(!end); var cmpstr = 'EndTo' + (end?'End':'Start'); var parentNode = atmrange.parentElement(); var startnode, startOffset, lastNode; if(parentNode.childNodes.length>0){ dojo.every(parentNode.childNodes, function(node,i){ var calOffset; if(node.nodeType != 3){ atmrange.moveToElementText(node); if(atmrange.compareEndPoints(cmpstr,range) > 0){ startnode = node.previousSibling; if(lastNode && lastNode.nodeType == 3){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -