2013-02-26 98 views
2

曾经有一个人写了一个脚本,可以让他对一个范围的内容进行“一键式选择”。他的代码依赖于全能的$,使用jQuery的浏览器检测。它像一个魅力。功能检测支持DOM范围(Modernizr)

然后一个灾难性的一天,的jQuery 1.9被释放,并打破了他的代码,和心脏。浏览器检测被降级到传奇的东西,永远不会再被看到。于是他寻找新的途径,他走上了图书馆。这很酷,很彻底,看起来像是他想要的。唉,事实并非如此。

图书馆缺乏一个功能,他想,以特色检测,如果他的浏览器支持DOM范围对象。他被这种奇怪的疏忽所困惑。当然,他在某处失踪了。

你能帮他找到合适的工具来做的功能检测DOM范围

回答

1

只要检测你需要什么。以下确实做出了一些假设(例如document.createRange()window.getSelection()的存在意味着存在范围和选择方法),但是是合理的折衷。

演示:http://jsfiddle.net/dCvgU/

代码:

$("span").click(function() { 
    var body = document.body, range, sel; 
    if (typeof document.createRange != "undefined" && 
      typeof window.getSelection != "undefined") { 
     range = document.createRange(); 
     range.selectNode(this); 
     sel = window.getSelection(); 
     sel.removeAllRanges(); 
     sel.addRange(range); 
    } else if (typeof body.createTextRange != "undefined") { 
     range = body.createTextRange(); 
     range.moveToElementText(el); 
     range.select(); 
    } 
}); 
1

此代码是否足够?

var supportsRange = typeof Range === 'object' && typeof document.createRange === 'function' && typeof Selection === 'object' && typeof Selection.prototype.getRangeAt === 'function'; 

if (supportsRange) { 
    // 
} 
+0

只是重新再更新。它可能接近需要 – whitneyit 2013-02-26 13:20:27

+0

嗯...非常接近,有一个小小的问题: 旧版本的IE有TextRange,这里没有说明。 另外,在其他浏览器中是否还有更多的Range对象变体(比如说Opera) – 2013-02-26 13:24:39

+0

您可以继续添加该测试。这将是漫长的,但它应该做到这一点。对于歌剧,你可以只测试window.Opera – whitneyit 2013-02-26 13:28:44

0

为了完整性,这里是两个答案更完整的版本,包装成一个jQuery插件。 该插件支持所有主流浏览器。

(它在coffescript,对于JS代码,头js2coffee

$.fn.selectText =() -> 
    @each -> 
    text = this 
    # FF, Chrome, IE9+, and hopefully Opera 
    if document.createRange? and window.getSelection? 
     selection = window.getSelection() 
     range = document.createRange() 
     range.selectNodeContents text 
     selection.removeAllRanges() 
     selection.addRange range 
    # <= IE8 
    else if document.body.createTextRange? 
     range = document.body.createTextRange() 
     range.moveToElementText text 
     range.select() 
    # Safari 
    else if window.getSelection? 
     selection = window.getSelection() 
     selection.setBaseAndExtent text, 0, text, 1