概述
//if firefox
irange = window.getSelection().getRangeAt(0);
// if ie
irange = document.selection.createRange();
我先说一下代码的目的:要获得当前用户鼠标拖选内容所在的节点类型,我个人的功能目的在于判断当前是否一个A节点,如果是,那么取得他的href。我们先看firefox:
在firefox的dom标准,定义了一个属性我们可以直接使用它来获得所选内容的父节点,同时使用nodeName来获得当前节点的类型:
irange.startContainer.nodeName;
我在firefox里面alert了一下,如果当前你所选择的是一个文本节点,那么他会返回#text,但是如果所选择的正好是一个其他节点,那么,他会返回body,这样第一步要做的就是,假如所选内容正好是一个完整的节点,那么我们来获得它的节点类型,要注意的是,startContainer返回的并不是当前节点,而是高一级的,但是在dom标准下面还提供了一个startOffset属性,如果所选择的不是一个文本节点,那么他返回的是当前节点在父节点中的偏移量,也就是offset了,我们通过它可以获得当前所选的节点:
if(irange.startContainer.nodeName != "#text"){
var nodeOffset = irange.startOffset;
var selectedNode = irange.startContainer.childNodes[nodeOffset];
}
那么我们通过selelectedNode.nodeName便可得到节点类型了。上面所说的仅仅是一种情况,还有一种情况就是用户所选择的内容是<A>标签内的文本内容的一部分,那么,虽然获得的startContainer为#text,但是他的parentNode却是一个A,那么有了上面的知识,这个问题就很容易解决了:
if(irange.startContainer.nodeName == "#text"){
if(irange.startContainer.parentNode.nodeName == "a"){
......do sth // 那么,这里的irange.startContainer.parentNode就是那个A节点了
}
}
这是在firefox中的操作,如果我们要修改获得的那个A节点的href,那么只需要把获得的节点对象存储在一个变量中,然后直接修改他的href就可以了。
在ie下面,上面的两种情况就合二为一了,在ie中获得的range对象,不能直接使用parentNode来获得他的上级节点,而是要使用parentElement()方法的parentNode来获得:
irange.parentElement().parentNode.nodeName
这样我们就可以获得它的节点类型了,在firefox中我们所说的到的两种情况使用这个方法来获得的结果都是一样,所以不需要分情况处理。
我用这个方法是用于在线编辑器,用来定义链接的,简单的办法,在ie下面可以使用execCommand('insertLink')。但是这个方法在firefox下面无效。
在这里推荐一本好书:
O'REILLY 的 <<JavaScript权威指南>>
写到这里,功能我已经写完了,但是测试的不是完全,尚不知道其中是否存在某些错误。仅作笔记之用。
以上方法通过Microsoft Internet Explorer 6.0和Mozilla Firefox 1.5的测试。
IE 和 Firefox中取得createRange()的起点和终点的值
http://www.blogjava.net/sealyu/archive/2010/06/08/323099.html
Range对象详解
http://hi.baidu.com/huominghao/blog/item/e3b127f26ca9e030730eecc2.html
最后
以上就是沉默诺言为你收集整理的转:ie和firefox的区别:range操作的全部内容,希望文章能够帮你解决转:ie和firefox的区别:range操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复