2010-10-22 86 views
2

當文檔上的某些文本突出顯示時,只要單擊文檔,默認瀏覽器突出顯示就會丟失。始終保持所選文本瀏覽器突出顯示

我想一直保持瀏覽器突出顯示,就像apture http://www.apture.com/。突出顯示一些文字,它會彈出一個「瞭解更多」的氣泡,點擊「瞭解更多」按鈕,它仍然不會失去默認瀏覽器的高光焦點。

我該怎麼做?

我基本上想獲得所選文本的位置而不添加一個範圍,並保持瀏覽器在單擊按鈕時突出顯示。

回答

5

下面是如何在用戶單擊特定元素時保留選區的簡單示例。它在元素的mousedown事件中存儲選擇Range(s)或TextRange(IE < = 8),並在mouseup事件中重新選擇這些範圍。

<script type="text/javascript"> 
    var saveSelection, restoreSelection; 
    if (window.getSelection) { 
     // IE 9 and non-IE 
     saveSelection = function() { 
      var sel = window.getSelection(), ranges = []; 
      if (sel.rangeCount) { 
       for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
        ranges.push(sel.getRangeAt(i)); 
       } 
      } 
      return ranges; 
     }; 

     restoreSelection = function(savedSelection) { 
      var sel = window.getSelection(); 
      sel.removeAllRanges(); 
      for (var i = 0, len = savedSelection.length; i < len; ++i) { 
       sel.addRange(savedSelection[i]); 
      } 
     }; 
    } else if (document.selection && document.selection.createRange) { 
     // IE <= 8 
     saveSelection = function() { 
      var sel = document.selection; 
      return (sel.type != "None") ? sel.createRange() : null; 
     }; 

     restoreSelection = function(savedSelection) { 
      if (savedSelection) { 
       savedSelection.select(); 
      } 
     }; 
    } 

    window.onload = function() { 
     var specialDiv = document.getElementById("special"); 
     var savedSel = null; 

     specialDiv.onmousedown = function() { 
      savedSel = saveSelection(); 
     }; 

     specialDiv.onmouseup = function() { 
      restoreSelection(savedSel); 
     }; 
    }; 
</script> 

<p> 
    Select something up here and click on one of the areas below. 
    <b>The first will lose the selection</b>, while the second will keep it. 
</p> 
<div style="border: solid blue 1px">Normal div</div> 
<div id="special" style="border: solid blue 1px">Special div. 
    Press me and keep the selection</div> 
+1

Downvoter:請解釋。這個答案可以解決問題。 – 2010-10-28 10:29:13

+0

它在FF上不起作用。 – Haris 2010-11-01 09:35:33

+1

它適合我。哪個版本?它以什麼方式不起作用? – 2010-11-01 09:58:39

0

您可能需要查看JavaScript中的選擇範圍,然後使用CSS爲CSS添加跨度類。

span.highlight { 
    background: red; 
} 
+0

我已經使用瘦長http://code.google.com/p/rangy/包裹在一個跨度選定的文本。問題是我不想爲跨度添加自定義背景顏色。我希望它只使用默認瀏覽器高亮樣式。 – Haris 2010-10-22 08:30:29

+0

@Haris這可能不是一個選項。 – alex 2010-10-22 08:33:28

+0

Apture如何設法做到這一點? – Haris 2010-10-22 08:44:06

3

我用代碼from here並有在http://jsfiddle.net/jrdGW/

工作示例選擇頂部的段落一些文本,然後點擊下方的段落。選擇將在1秒後恢復(以顯示它存儲它)。

經過Chrome,FF和IE測試。

代碼(在情況下的jsfiddle向下):

var RNG = null; 

function GSel() { 
    var d = document; 
    if (d.selection) { 
     return d.selection.type == "Text" ? d.selection : null; 
    } 
    if (window.getSelection) { 
     return window.getSelection(); 
    } 
    return null; 
} 

function CRng() { 
    var sel = GSel(); 
    if (sel) { 
     if (sel.createRange) { 
      return sel.createRange(); 
     } 
     if (sel.rangeCount && sel.getRangeAt) { 
      return sel.getRangeAt(0); 
     } 
    } 
    return null; 
} 

function Sel(rng) { 
    if (rng.select) { 
     rng.select(); 
    } 
    else { 
     var s = GSel(); 
     if (s.removeAllRanges && s.addRange) { 
      s.removeAllRanges(); 
      s.addRange(rng); 
     } 
    } 
} 


$(document).ready(function() { 
    $('#learn').mousedown(function() { 
     RNG = CRng(); 
     setTimeout(function() { 
      if (RNG) { 
       Sel(RNG); 
      } 
     }, 1000); 
    }); 
}); 
+0

這與我的答案基本相同,現在已經收到了完全不合理的downvote。使用jsfiddle現在需要所有答案嗎? – 2010-10-28 10:31:40

+0

我發佈了它,因爲我無法在任何瀏覽器中獲得您的答案(我沒有投票)。 – 2010-10-28 10:43:32

+0

真的嗎?適用於所有瀏覽器。如果您僅將代碼逐字複製到空文件中,而無需將''和''標籤放入。 – 2010-10-28 11:05:52

相關問題