2011-08-31 53 views
3

我使用window.getSelection()來獲取選定的文本。 但是,如果我也選擇一個圖像,它也返回一個圖像的altof。getSelection沒有alt屬性和腳本在裏面?

例:

<img src="someSrc.jpg" alt="image_alt" /> My text here ... 

,如果我選擇一個圖像也將返回

image_alt我在這裏的文字...

但我只需要

我的文字在這裏...

有沒有什麼辦法只有文本,沒有alt?

感謝很多

+0

你有沒有考慮改變其使用'alt'屬性? –

+0

我將在開源項目中使用它,所以我需要去掉所有需要的屬性。 – Simon

+0

瀏覽器正在做什麼?在Firefox中測試了 –

回答

1

最簡單的方法是使用toString()選擇範圍的方法,即指定window.getSelection().toString() t o在WHATWG's new Range spec的當前版本中做(儘管這是contrary to what some browsers do,可能會改變也可能不改變)。下面將與多個選擇的工作範圍(其Mozilla的支持),並且還在IE < 9.

的jsfiddle:http://jsfiddle.net/timdown/HkP2S/

代碼:

function getSelectionRangeText() { 
    var selText = ""; 
    if (window.getSelection) { 
     var sel = window.getSelection(), rangeCount = sel.rangeCount; 
     if (rangeCount) { 
      for (var i = 0, rangeTexts = []; i < rangeCount; ++i) { 
       rangeTexts.push("" + sel.getRangeAt(i)); 
      } 
      selText = rangeTexts.join(""); 
     } 
    } else if (document.selection && document.selection.type == "Text") { 
     selText = document.selection.createRange().text; 
    } 
    return selText; 
} 

UPDATE

該解決方案包括<script><style>元素中的文字。要除去這些,可以在選擇範圍上使用cloneContents(),並遍歷生成的文檔片段的DOM,僅從文本節點收集文本,該文本節點不包含在<script><style>元素中。你也可以擴展它以刪除CSS display: none中的元素內的文本。

的jsfiddle:http://jsfiddle.net/timdown/HkP2S/2/

代碼:

function getSelectionRangeText() { 
    var selText = "", selTextParts = []; 

    function getNodeText(node) { 
     if (node.nodeType == 3) { 
      selTextParts.push(node.data); 
     } else if (node.hasChildNodes() 
     && !(node.nodeType == 1 && /^(script|style)$/i.test(node.tagName))) { 
      for (var child = node.firstChild; !!child; child = child.nextSibling) { 
       getNodeText(child); 
      } 
     } 
    } 

    if (window.getSelection) { 
     var sel = window.getSelection(), rangeCount = sel.rangeCount; 
     if (rangeCount) { 
      for (var i = 0; i < rangeCount; ++i) { 
       getNodeText(sel.getRangeAt(i).cloneContents()); 
      } 
      selText = selTextParts.join(""); 
     } 
    } else if (document.selection && document.selection.type == "Text") { 
     selText = document.selection.createRange().text; 
    } 
    return selText; 
} 
+0

非常感謝。但內聯腳本(javascript,css)存在問題。它也支持它。 Whan可以做到防止它? – Simon

+0

@Syom:的確如此。在另一個答案中,您會遇到與'cloneContents()'/'textContent'解決方案相同的問題。如果這對你是一個問題,那麼你可以使用'cloneContents()'手動遍歷DOM。我會擴大我的答案。 –

+0

@Syom:...完成。 –

7

試試這個:

window.getTextSelection = function() { 
    //First get HTML Fragment of selection 
    var html = window.getSelection().getRangeAt(0).cloneContents(); 
    //Return only the text 
    return html.textContent||html.innerText; 
} 

在某些情況下,你可以簡單地通過CSS禁用用戶的選擇: 願你還可以通過禁用用戶爲圖像選擇實現這一目標:

img { 
     -webkit-user-select: none; 
     -khtml-user-select: none; 
     -moz-user-select: none; 
     -o-user-select: none; 
     user-select: none; 
} 
+0

+1我喜歡這個想法。 –

+0

嗯,它返回[對象DocumentFragment] – Simon

+0

是的,我現在正在修復它。 – cvsguimaraes