2014-12-22 21 views
0

在我的頁面中,用戶選擇一個文本,一旦他們選擇我將選定的對象傳遞給函數。在函數中,我想使用jquery獲得適當的文本註釋..如何獲取?如何從核心JavaScript選擇獲取jquery元素?

這裏是我的功能:

var manipulator = function (coreObject) { 
    console.log(coreObject);//i would like find the text node using this object and like to wrap in to a element say 'span'... 
} 

function highlight() { 
    var range, sel; 
    var span = document.createElement("span"); 
    span.style.fontWeight = "bold"; 
    span.style.color = "green"; 
    // IE case 
    if (document.selection && document.selection.createRange) { 
     range = document.selection.createRange(); 
     manipulator(range) 
    } else if (window.getSelection) { 
     // Non-IE 
     sel = window.getSelection(); 
     manipulator(sel) 
    } 
} 

$("#addText").on('click', function(event) { 
    event.preventDefault(); 
    highlight(); 
}); 

Live Demo

我正在尋找所有的瀏覽器友好的方式。

+0

http://stackoverflow.com/questions/10055806/jquery-get-html-source-of-selected-text- in-div – Indra

回答

1

selectiongetSelection返回的值是選定的文本字符串,而不是DOM中的元素。這就是爲什麼你不能將它作爲jQuery對象的原因。

但是,您可以執行的操作是使用Range.surroundContents()方法(Ref:https://developer.mozilla.org/en-US/docs/Web/API/range.surroundContents)將文本選擇包裝到任何元素中。

您還需要使用Selection.getRangeAt()方法(參考號:https://developer.mozilla.org/en-US/docs/Web/API/Selection.getRangeAt)從所選文本中創建一個範圍。

下面是一個示例代碼段

var manipulator = function (coreObject) { 
 
    var span = document.createElement("span"); 
 
    span.style.fontWeight = "bold"; 
 
    span.style.color = "blue"; 
 
\t coreObject.getRangeAt(0).surroundContents(span); 
 
} 
 

 
function highlight() { 
 
    var range, sel; 
 
    if (document.selection && document.selection.createRange) { // IE 
 
     range = document.selection.createRange(); 
 
     manipulator(range) 
 
    } else if (window.getSelection) { // Non-IE 
 
     sel = window.getSelection(); 
 
     manipulator(sel) 
 
    } 
 
} 
 

 
$("#addText").on('click', function(event) { 
 
\t event.preventDefault(); 
 
\t highlight(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<p>Lorem ipsum dolor sit amet, <strong>consectetur</strong> adipisicing elit. Error ipsa quo illum excepturi autem voluptatem, maiores tempora quasi temporibus architecto ratione delectus modi qui cum earum, omnis itaque nam iure!</p><br/> 
 
<input type="button" id="addText" value="Surround" />

+0

沒關係。但你可以檢查這個問題...萬一如果我使用你的解決方案:http://stackoverflow.com/questions/27602239/not-able-to-add-the-span-container-to-element-selection – 3gwebtrain

+0

@ 3gwebtrain:(1)是的。如果你閱讀了我鏈接到的ref,它說*但是,如果範圍只用一個邊界點分割一個非文本節點,就會拋出異常*(2)[官方規格](http: //www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/ranges.html#Level2-Range-method-surroundContents)(3)這意味着'surroundContents'只會起作用如果所選範圍在執行後將生成有效的HTML標記。所以,如果你選擇重疊區域,它會發出異常。只要你不重疊,就可以。 – Abhitalks

+0

@ 3gwebtrain:如果您需要重疊選擇,那麼最好的選擇是使用HTML編輯API [規格](https://dvcs.w3.org/hg/editing/raw-file/tip/editing)。 HTML)。另外,看看我剛纔給出的這個答案:http://stackoverflow.com/a/27442159/1355315 – Abhitalks

相關問題