2013-02-26 1 views
2

스팬 내용을 '원 클릭으로'선택할 수있는 스크립트를 작성한 사람이 한 번있었습니다. 그의 코드는 전능하신 $에 jQuery의 브라우저 감지을 사용하여 의존했습니다. 그것은 매력처럼 작동했습니다. 기능 DOM 범위 (Modernizr)에 대한 지원 검색

는 그런 일 운명의 날, jQuery를 1.9이 출시되었고, 그것은 자신의 코드, 그리고 마음을 아프게. 브라우저 감지기는 전설의 물건으로 강등되었지만 다시는 볼 수 없었습니다. 그래서 그는 새로운 길을 모색했고, 그는 Modernizr 라이브러리를 보았습니다. 그것은 차가웠다, 철저했다, 그것은 그가 원했던 것처럼 보였다. 아아, 그렇지 않았습니다. 그의 브라우저가 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

+0

흠 ... 꽤 가깝고 문제의 작은 비트가 하나 있습니다 : IE의 이전 버전에는 여기에 설명되지 않은 TextRange가 있습니다. 또한 다른 브라우저에서 Range 개체의 변형이 더 많습니다 (예 : Opera) –

+0

그 테스트에 계속 추가 할 수 있습니다. 그것은 길어 지지만 그렇게해야합니다. 오페라의 경우 그냥 창문에 대해 테스트 할 수 있습니다 .Opera – whitneyit

0

, 여기에 jQuery 플러그인으로 감싸 두 답변의 더 완전한 버전입니다. 플러그인은 모든 주요 브라우저를 지원합니다.

(이 js2coffee에 JS 코드, 머리를 들어, 커피 스크립트에서의)

$.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