createRange:ie_ff区别

firefox
irange = window.getSelection().getRangeAt(0);
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的测试。

加支付宝好友偷能量挖...


评论(0)网络
阅读(121)喜欢(1)JavaScript/Ajax开发技巧