2010-10-06 59 views
0

這是有可能得到的任何用戶與使用Javascript鼠標選中,就像這樣:http://www.motyar.info/2010/02/get-user-selected-text-with-jquery-and.htmlJavascript:圍繞用戶選擇獲取html?

我的問題是,我不只是需要這樣的文字,但我也需要:

  1. (例如,如果用戶選擇「hello」,並且這個hello在源代碼中產生爲:「<div><span>hello</span></div>」,那麼它應該返回)。

  2. 做同樣的圖形

任何人都可以引導我通過這個過程,還是有選擇,如果無法做到這一點?

回答

2

這將在所有主流瀏覽器中完成。對於IE和更多符合標準的瀏覽器,有單獨的分支。在IE中,它稍微容易一些,因爲根據選擇創建的專有TextRange對象具有方便的htmlText屬性。在其他瀏覽器中,您必須使用DOM Range的cloneContents()方法創建一個包含所選內容副本的DocumentFragment,並通過將片段附加到元素並返回元素的innerHTML屬性來從中獲取HTML。

function getSelectionHtml() { 
    var html = ""; 
    if (typeof window.getSelection != "undefined") { 
     var sel = window.getSelection(); 
     if (sel.rangeCount) { 
      var container = document.createElement("div"); 
      for (var i = 0, len = sel.rangeCount; i < len; ++i) { 
       container.appendChild(sel.getRangeAt(i).cloneContents()); 
      } 
      html = container.innerHTML; 
     } 
    } else if (typeof document.selection != "undefined") { 
     if (document.selection.type == "Text") { 
      html = document.selection.createRange().htmlText; 
     } 
    } 
    return html; 
} 

alert(getSelectionHtml()); 
+0

謝謝,這似乎很有希望。但是,當我僅選擇文本時,我通常不會收到文本所包含的標籤。如果我選​​擇了更多(例如,某些空白),它似乎會返回包含文本的標籤。基本上,我只想獲取選定的文本,然後選擇高於我收到的文本的howmany級別。例如。

test

應該返回測試,

測試

test

取決於給定的水平(分別爲0,1,2)。那可能嗎? – Tom 2010-10-12 12:19:39

+0

@Tom:你想在'

o|ne

tw|o

'這樣的情況下做什麼?(管道表示選擇邊界)?在這裏,你有一個選擇,其邊界在不同的層次。 – 2010-10-12 13:22:15

+0

好評。考慮一下,我可能應該改述我的問題/需求。我需要的是一個包含選擇左側的html,選擇的html和選擇右側的html的數組。所以在你的情況下:arr [0] =

o, arr[1] = ne

tw, arr[2] = o

。另一方面,我在http://www.quirksmode.org/dom/range_intro.html上讀到,如果瀏覽器在選擇時遇到了html的一部分,那麼瀏覽器會自動添加結束標記,但不確定這是否爲真(在所有情況下)雖然。 – Tom 2010-10-12 14:10:23