bbbbbspan> => false
isSameStyle
UE.dom.domUtils.isSameStyle(nodeA,nodeB) ⇒ true|false
判断节点nodeA与节点nodeB的元素属性是否一致
isBlockElm
UE.dom.domUtils.isBlockElm(node) ⇒ true|false
检查节点node是否为块元素
isBody
UE.dom.domUtils.isBody(node) ⇒ true|false
检测node节点是否为body节点
breakParent
UE.dom.domUtils.breakParent(node,parent) ⇒ node
以node节点为中心,将该节点的指定祖先节点parent拆分成2块
ooo是node节点
xxxxoooxxx
==> xxx
oooxxx
xxxxxxxxxoooxxxxxx
=> xxxxxxxxx
oooxxxxxx
isEmptyInlineElement
UE.dom.domUtils.isEmptyInlineElement(node) ⇒ 1|0
检查节点node是否是空inline节点
=> 1
u> => 1
=> 1
xx => 0
trimWhiteTextNode
UE.dom.domUtils.trimWhiteTextNode(node)
删除node节点下的左右空白文本子节点
mergeChild
合并node节点下相同的子节点
UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签
xxaaxx
==> UE.dom.domUtils.mergeChild(node,'span')
xxaaxx
getElementsByTagName
UE.dom.domUtils.getElementsByTagName(node,tagName) ⇒ Array //节点集合数组
原生方法getElementsByTagName的封装
mergeToParent
UE.dom.domUtils.mergeToParent(node)
将节点node合并到父节点上
xxx ==> xxx
mergeSibling
UE.dom.domUtils.mergeSibling(node)
UE.dom.domUtils.mergeSibling(node,ignorePre) //ignorePre指定是否忽略左兄弟
UE.dom.domUtils.mergeSibling(node,ignorePre,ignoreNext) //ignoreNext指定是否忽略右兄弟
合并节点node的左右兄弟节点
xxxxooob>xxxx ==> xxxxoooxxxxb>
unSelectable
UE.dom.domUtils.unSelectable(node)
设置节点node及其子节点不会被选中
removeAttributes
UE.dom.domUtils.removeAttributes(node,attrNames)
删除节点node上的属性attrNames,attrNames为属性名称数组
//Before remove
xxxxx
//Remove
UE.dom.domUtils.removeAttributes(node,["id","name"]);
//After remove
xxxxx
createElement
UE.dom.domUtils.createElement(doc,tag,attrs) ⇒ Node //返回创建的节点
在doc下创建一个标签名为tag,属性为attrs的元素
setAttributes
UE.dom.domUtils.setAttributes(node,attrs) ⇒ node
为节点node添加属性attrs,attrs为属性键值对
getComputedStyle
UE.dom.domUtils.getComputedStyle(element,styleName) ⇒ String //返回对应样式名称的样式值
获取元素element的计算样式
getComputedStyle(document.body,"font-size") => "15px"
getComputedStyle(form,"color") => "#ffccdd"
removeClasses
UE.dom.domUtils.removeClasses(element,classNames)
在元素element上删除classNames,支持同时删除多个
//执行方法前的dom结构
xxx
//执行方法
UE.dom.domUtils.removeClasses(element,["test1","test3"])
//执行方法后的dom结构
xxx
addClass
UE.dom.domUtils.addClass(element,classNames)
在元素element上增加一个样式类className,支持以空格分开的多个类名
如果相同的类名将不会添加
hasClass
UE.dom.domUtils.hasClass(element,className) ⇒true|false
判断元素element是否包含样式类名className,支持以空格分开的多个类名,多个类名顺序不同也可以比较
getStyle
UE.dom.domUtils.getStyle(element,name) ⇒ String
获取元素element的某个样式值
setStyle
UE.dom.domUtils.setStyle(element,name,value)
为元素element设置样式属性值
setStyles
UE.dom.domUtils.setStyle(element,styles) //styles为样式键值对
为元素element设置样式属性值
filterNodeList 1.2.4+
UE.dom.domUtils.filterNodeList(nodelist,filter,onlyFirst) ⇒ 节点
对于nodelist用filter进行过滤
UE.dom.domUtils.filterNodeList(document.getElementsByTagName('*'),'div p') //返回第一个是div或者p的节点
UE.dom.domUtils.filterNodeList(document.getElementsByTagName('*'),function(n){return n.getAttribute('src')})
//返回第一个带src属性的节点
UE.dom.domUtils.filterNodeList(document.getElementsByTagName('*'),'i',true) //返回数组,里边都是i节点
UE.dom.Range
依赖
editor.js, UE.Utils, UE.browser, UE.dom.domUtils, core/dom/dtd.js
Range范围实现类,本类是UEditor底层核心类,统一w3cRange和ieRange之间的差异,包括接口和属性
Range
new UE.dom.Range(document) ⇒ Range 实例
创建一个跟document绑定的空的Range实例
startContainer 开始边界的容器节点,可以是elementNode或者是textNode
startOffset 容器节点中的偏移量,如果是elementNode就是childNodes中的第几个,如果是textNode就是nodeValue的第几个字符
endContainer 结束边界的容器节点,可以是elementNode或者是textNode
endOffset 容器节点中的偏移量,如果是elementNode就是childNodes中的第几个,如果是textNode就是nodeValue的第几个字符
document 跟range关联的document对象
collapsed 是否是闭合状态
cloneContents
range.cloneContents() ⇒ DocumentFragment
克隆选中的内容到一个fragment里,如果选区是空的将返回null
deleteContents
range.deleteContents() ⇒ Range
删除当前选区范围中的所有内容并返回range实例,这时的range已经变成了闭合状态
DOM Element :
xx[xxx]x
//执行方法后
xx|x
注意range改变了
range.startContainer => b
range.startOffset => 2
range.endContainer => b
range.endOffset => 2
range.collapsed => true
extractContents
range.extractContents() ⇒ DocumentFragment
将当前的内容放到一个fragment里并返回这个fragment,这时的range已经变成了闭合状态
DOM Element :
xx[xxx]x
//执行方法后
返回的fragment里的 dom结构是
xxx
dom树上的结构是
xx|x
注意range改变了
range.startContainer => b
range.startOffset => 2
range.endContainer => b
range.endOffset => 2
range.collapsed => true
setStart
range.setStart(node,offset) ⇒ Range
设置range的开始位置位于node节点内,偏移量为offset
如果node是elementNode那offset指的是childNodes中的第几个,如果是textNode那offset指的是nodeValue的第几个字符
setEnd
range.setEnd(node,offset) ⇒ Range
设置range的结束位置位于node节点,偏移量为offset
如果node是elementNode那offset指的是childNodes中的第几个,如果是textNode那offset指的是nodeValue的第几个字符
setStartAfter
range.setStartAfter(node) ⇒ Range
将Range开始位置设置到node节点之后
xxx|xx
执行setStartAfter(i)后
range.startContainer =>b
range.startOffset =>2
setStartBefore
range.setStartBefore(node) ⇒ Range
将Range开始位置设置到node节点之前
xxx|xx
执行setStartBefore(i)后
range.startContainer =>b
range.startOffset =>1
setEndAfter
range.setEndAfter(node) ⇒ Range
将Range结束位置设置到node节点之后
xxx|xx
setEndAfter(i)后
range.endContainer =>b
range.endtOffset =>2
setEndBefore
range.setEndBefore(node) ⇒ Range
将Range结束位置设置到node节点之前
xxx|xx
执行setEndBefore(i)后
range.endContainer =>b
range.endtOffset =>1
setStartAtFirst
range.setStartAtFirst(node) ⇒ Range
将Range开始位置设置到node节点内的开始位置
setStartAtLast
range.setStartAtLast(node) ⇒ Range
将Range开始位置设置到node节点内的结束位置
setEndAtFirst
range.setEndAtFirst(node) ⇒ Range
将Range结束位置设置到node节点内的开始位置
setEndAtLast
range.setEndAtLast(node) ⇒ Range
将Range结束位置设置到node节点内的结束位置
selectNode
range.selectNode(node) ⇒ Range
选中完整的指定节点,并返回包含该节点的range
selectNodeContents
range.selectNodeContents(node) ⇒ Range
选中node内部的所有节点,并返回对应的range
xx[xxxx]xxx
执行后
[xxxxxxxxx]
range.startContainer =>b
range.startOffset =>0
range.endContainer =>b
range.endOffset =>3
cloneRange
range.cloneRange() ⇒ Range
克隆一个新的range对象
collapse
range.collapse() ⇒ Range
range.collapse(true) ⇒ Range //闭合选区到头部
让选区闭合到尾部,若toStart为真,则闭合到头部
shrinkBoundary
range.shrinkBoundary() ⇒ Range //range开始位置和结束位置都调整,参见adjustmentBoundary
range.shrinkBoundary(true) ⇒ Range //仅调整开始位置,忽略结束位置
调整range的边界,使其"收缩"到最小的位置
xx[xxxxx] ==> xxb>[xxxxx]
x[xx]xxx> ==> x[xx]xxx>
[xxxxxxxxxxx] ==> [xxxxxxxxxxx]
getCommonAncestor
range.getCommonAncestor([includeSelf, ignoreTextNode]) ⇒ Element
获取当前range所在位置的公共祖先节点,当前range位置可以位于文本节点内,也可以包含整个元素节点,也可以位于两个节点之间
xx[xxxx]xxxx ==>getCommonAncestor() ==> b
[]
range.startContainer ==> b
range.startOffset ==> 0
range.endContainer ==> b
range.endOffset ==> 1
range.getCommonAncestor() ==> b
range.getCommonAncestor(true) ==> img
xxx|xx
range.startContainer ==> textNode
range.startOffset ==> 3
range.endContainer ==> textNode
range.endOffset ==> 3
range.getCommonAncestor() ==> textNode
range.getCommonAncestor(null,true) ==> b
trimBoundary
range.trimBoundary([ignoreEnd]) ⇒ Range //true忽略结束边界
调整边界容器,如果是textNode,就调整到elementNode上
DOM Element :
|xxx
startContainer = xxx; startOffset = 0
//执行后本方法后
startContainer = ; startOffset = 0
Dom Element :
xx|x
startContainer = xxx; startOffset = 2
//执行本方法后,xxx被实实在在地切分成两个TextNode
startContainer = ; startOffset = 1
txtToElmBoundary
如果选区在文本的边界上,就扩展选区到文本的父节点上
Dom Element :
|xxx
startContainer = xxx; startOffset = 0
//本方法执行后
startContainer = ; startOffset = 0
Dom Element :
xxx|
startContainer = xxx; startOffset = 3
//本方法执行后
startContainer = ; startOffset = 1
insertNode
range.insertNode(node) ⇒ Range //node可以是textNode,elementNode,fragment
在当前选区的开始位置前插入一个节点或者fragment,range的开始位置会在插入节点的前边
Range :
xxx[xxxxx
xxxx]xsdfsdfp>
待插入Node :
ssss
执行本方法后的Range :
xxx[ssss
xxxxxp>xxxx]x
sdfsdf
setCursor
range.setCursor([toEnd]) ⇒ Range //toEnd为true时,光标闭合到选区的末尾
设置光标闭合位置,toEnd设置为true时光标将闭合到选区的结尾
createBookmark
range.createBookmark([serialize]) ⇒ Object //{start:开始标记,end:结束标记,id:serialize} serialize为真时,开始结束标记是插入节点的id,否则是插入节点的引用
创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置
moveToBookmark
range.moveToBookmark(bookmark) ⇒ Range //让当前的range选到给定bookmark的位置,bookmark对象是由range.createBookmark创建的
移动边界到书签位置,并删除插入的书签节点
enlarge
range.enlarge() ⇒ Range
调整range的边界,使其"放大"到最近的父block节点
xxxx[xb>xxxxx]
xxxp> ==> [
xxxxxb>xxxxx
]xxxp>
adjustmentBoundary
range.adjustmentBoundary() ⇒ Range //参见shrinkBoundary
调整Range的边界,使其"缩小"到最合适的位置
xx[xxxxx] ==> xxb>[xxxxx]
x[xx]xxx> ==> x[xx]xxx>
applyInlineStyle
range.applyInlineStyle(tagName) ⇒ Range //tagName为需要添加的样式标签名
range.applyInlineStyle(tagName,attrs) ⇒ Range //attrs为属性json对象
给range选区中的内容添加给定的标签,主要用于inline标签
xxxx[xxxx]x
==> range.applyInlineStyle("strong") ==> xxxx[xxxx]x
xx[ddyyyy]x
==> range.applyInlineStyle("strong") ==> xx[ddyyyy]x
xxxx[xxxx]x
==> range.applyInlineStyle("strong",{"style":"font-size:12px"}) ==> xxxx[xxxx]x
removeInlineStyle
range.removeInlineStyle(tagNames) ⇒ Range //tagNames 为需要去掉的样式标签名,支持"b"或者["b","i","u"]
对当前range选中的节点,去掉给定的标签节点,但标签中的内容保留,主要用于处理inline元素
xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z
getClosedNode
range.getClosedNode() ⇒ node|null
得到一个自闭合的节点,常用于获取自闭和的节点,例如图片节点
xxxx[]xxx
select
range.select(); ⇒ Range
根据当前range选中内容节点(在页面上表现为反白显示)
scrollToView
range.scrollToView([win,offset]) ⇒ Range //针对window对象,若不指定,将以编辑区域的窗口为准,offset偏移量
滚动条跳到当然range开始的位置
UE.ajax
依赖
UE.Utils
UEditor内置的ajax请求模块
request
UE.ajax.request(url,ajaxOpt);
发出ajax请求,ajaxOpt中默认包含method,timeout,async,data,onsuccess以及onerror等六个,支持自定义添加参数
UE.ajax.request('http://www.xxxx.com/test.php',{
//可省略,默认POST
method:'POST',
//可以自定义参数
content:'这里是提交的内容',
//也可以直接传json,但是只能命名为data,否则当做一般字符串处理
data:{
name:'UEditor',
age:'1'
}
onsuccess:function(xhr){
console.log(xhr.responseText);
},
onerror:function(xhr){
console.log(xhr.responseText);
}
})
UE
UEditor的顶部命名空间
getEditor 1.2.4+
UE.getEditor(id,[opt]) ⇒ Editor实例
提供一个全局的方法得到编辑器实例
id 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回
opt 编辑器的可选参数
UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例
this.setContent('hello')
}});
UE.getEditor('containerId'); //返回刚创建的实例
编辑器事件接口
ready
editor.addListener("ready",fn)
编辑器加载完成事件(核心),在编辑器准备好所有运行条件时触发,大部分场景可以使用editor.ready(fn)取代。
editor.addListener("ready",function(){
//this为editor实例
this.setContent("欢迎使用UEditor!");
})
//同如下接口方式调用
editor.ready(function(){
this.setContent("欢迎使用UEditor!");
})
selectionChange
editor.addListener("selectionChange",fn)
editor.fireEvent("selectionChange")
选区变化事件(核心),当选区出现变化时触发。
在UEditor中,任何涉及到光标改变的操作都会触发选区变化事件,该事件主要用来实现工具栏状态反射。
editor.addListener("selectionChange",function(){
//this为editor实例
})
contentChange
editor.addListener("contentChange",fn)
editor.fireEvent("contentChange")
内容变化事件(核心),当编辑区域中的文本内容出现变化时触发
(before|after)Paste
editor.addListener("beforePaste",fn)
粘贴事件(核心),当使用ctr+v快捷键粘贴(包括Chrome、FF浏览器的右键粘贴)时会触发本事件
beforePaste 在将粘贴的内容写到编辑器之前触发,这个事件触发时,粘贴的内容还未在编辑器内显示
afterPaste 粘贴的内容已经写到编辑器里边后触发
editor.addListener("beforePaste",function(type,data){
//beforePaste事件监听区别于afterPaste事件监听最主要的一个方面是存在一个data参数,
//该data参数是一个对象,包含属性html。
//若用户在此处更改该html的值时,将会影响粘贴到编辑器中的内容,主要用于粘贴时需要特殊处理的一些场景。
console.log(this.getContent) //this都是当前编辑器的实例
//before事件才用这个参数,用来在写出编辑器之前对粘贴进来的内容进行最后的修改
data.html = "我把粘贴内容改成了这句话";
})
(before|after)SetContent
editor.addListener("beforeSetContent",fn)
设置内容事件(核心),当调用setContent方法时触发
beforeSetContent 在内容写到编辑器之前触发
afterSetContent 内容已经写到编辑器里边后触发
editor.addListener("beforeSetContent",function(type,data){
//beforeSetContent事件监听区别于afterSetContent事件监听最主要的一个方面是存在一个data参数,
//该data参数是一个对象,包含属性html。
//若用户在此处更改该html的值时,将会影响设置到编辑器中的内容,主要用于设置内容时需要特殊处理的一些场景。
data.html = "我把设置内容改成了这句话";
})
getAllHtml
editor.addListener("getAllHtml",fn)
getAllHtml事件,当调用getAllHtml方法时触发
主要用来对于生成的整个html代码中的head内容进行定制,比如你想插入你自己的样式,script标签等,用来在展示时使用
editor.addListener("getAllHtml",function(type,data){
//data是document中head部分html的封装,可通过data.html来获取对应字符串。
//需要修改的话得重新赋值data.html = '