虽然我们会讲解用程序创建范围对象,但是我们把精力主要集中在如何将用户的选取范围转换成为W3C 范围或者微软的文档范围对象。
范围是指HTML文档中的任意一部分内容。一个范围的开始和结束点都可以是随意的,甚至是相同的(一个空范围)。最常见的范围就是用户选取的文本。当用户在页面上选取了一部分,你就可以他的选取部分转换为范围对象。然而,你也可以让程序自动选择范围。
让我们以下面的代码为例。假设用户选择了下面的文字:
href="http://radar.oreilly.com/archives/2007/03/call_for_a_blog_1.html"
class="external">Call for a Blogger's Code of ConductTim O'Reilly calls for a Blogger Code of Conduct. His proposals are:
- Take responsibility not just for your own words, but for the
comments you allow on your blog.
- Label your tolerance level for abusive comments.
- Consider eliminating anonymous comments.
你可以将用户选择转换为一个包含用户选择范围的文本的范围对象(后面讲)。根据范围对象,你能找到开始和结束的范围点。如果你愿意你可以删除它拷贝它或者用其他文本代替,甚至用HTML代码来代替。
这是范围对象最简单的例子了,因为他只包含文本。下面我们来看一个复杂的例子:
href="http://radar.oreilly.com/archives/2007/03/call_for_a_blog_1.html"
class="external">Call for a Blogger's Code of ConductTim O'Reilly calls for a Blogger Code of Conduct. His proposals are:
- Take responsibility not just for your own words, but for the
comments you allow on your blog.
- Label your tolerance level for abusive comments.
- Consider eliminating anonymous comments.
另外一个范围对象被创建了,而且还包含HTML。问题在于用户的选择范围跨越了几个元素。去掉其他的内容,就剩下:
calls for a Blogger Code of Conduct. His proposals are:
- Take responsibility not just for your own words, but for the
comments you allow on your blog.
- Label your toleran
这是一段不完整的HTML。幸好所有的浏览器都会转化一下:
calls for a Blogger Code of Conduct. His proposals are:
- Take responsibility not just for your own words, but for the
comments you allow on your blog.
- Label your toleran
正如你所看到的,浏览器会添加最少的元素让这段HTML完整,如果你复制的话,那么这些添加的东西也会被复制。
在我们继续之前,有必要看看浏览器的兼容性。主要问题在于这里有不下3个范围对象的类型,你必须都有所了解才行。
Module |
Explorer 6/7 |
Firefox 2 | Safari 1.3 | Opera 9 |
W3C Range | no | yes | yes | yes |
Mozilla Selection | no | yes | incomplete | yes |
Microsoft Text Range | yes | no | no | incomplete |
要处理用户的选择就必须先访问到用户的选区。这会立马又一个代码分支:IE使用微软的方法,其他浏览器使用Mozilla的方法:
理想情况下,我们通过选择对象的getRangeAt()来访问W3C范围对象。这个方法会在给定的位置返回一个范围对象:就像平常一样第一个范围对象的编号是0。(getRangeAt()已经设计好如果有多处选择的情况下怎么办。在那种情况下你的代码也很简单)
不幸的是Safari1.3不支持getRangeAt()。因此我们需要创建一个跟用户选择一样的范围对象。这是一个很好的练习机会,可以让你知道如何创建自己的范围对象。
很明显的从创建一个对象开始:
var range = document.createRange();
现在我们已经有了一个空对象。为了把他插入到文档里面去我们需要使用setStart()函数和setEnd()函数。
这两个方法需要两个参数:
1、在哪个DOM节点上开始或者结束的?
2、从哪个文本偏移上开始或者结束的?文本偏移就是指范围对象的第一个或者最后一个字符的位置。
让我们再来看一遍第二个例子:
href="http://radar.oreilly.com/archives/2007/03/call_for_a_blog_1.html"
class="external">Call for a Blogger's Code of ConductTim O'Reilly calls for a Blogger Code of Conduct. His proposals are:
- Take responsibility not just for your own words, but for the
comments you allow on your blog.
- Label your tolerance level for abusive comments.
- Consider eliminating anonymous comments.
范围从
节点开始,并且文字偏移量是13,因为第14个字符已经是包含在范围里面的了(和通常一样,编号从0开始的)。
范围从
如何创建这个范围对象: