2012-06-07 76 views
0

我有這個html:<span>some words here</span>。當點擊span時,它會變成一個帶有該字符串的文本框。有沒有辦法找出發生點擊的是哪個字符,並且一旦出現帶有字符串的文本框,就將光標放在字符串中的那個點上?你可以得到一個字符串中使用Javascript的確切位置嗎?

+0

你可以以編程方式用每個字符圍繞自己的span,然後將事件監聽器應用於每個角色或使用'document.getElementFromPoint'。 –

+0

您正在尋找的是[在Javascript中設置光標位置](http://stackoverflow.com/questions/512528/set-cursor-position-in-html-textbox)與[介紹'range's](http://www.quirksmode.org/dom/range_intro.html)。請注意,Quirksmode鏈接有點舊,但它提供了一個很好的概述。請參閱MDN獲取更多更新信息。 –

+1

這裏是一個我只在Firefox 12中測試過的簡單演示程序:http://jsfiddle.net/sQduu/瀏覽器支持各不相同,所以除非您只針對Firefox,否則您應該只將其視爲您可以做的一個演示。 –

回答

2

這裏有一個快速小提琴(在Chrome測試),對於<span>包括換行符,其中上述方案上哽咽的工作原理:

http://jsfiddle.net/x2dLW/1/

摘要如下:

function swapArea(baseEl) { 
    // Display <textarea> element, hide the <span> 
} 

function getCursorLoc (nodes, range) { 
    var prevChars = 0; 
    var clickContent = range.startContainer.textContent; 
    var clickLine; 

    //iterate backwards through nodes constituting <span> element contents 
    for (x = nodes.length - 1; x >= 0; x--) { 
    node = nodes[x]; 

    if (clickContent == node.textContent) { 
     clickLine = node; //this is the line user clicked in 
    } 
    else if (clickLine && (node.nodeName == "#text")) { 
     //sum up length of text lines prior, +1 for the NewLine 
     prevChars += node.textContent.length + 1; 
    } 
    } 

    //return offset in line clicked + sum length of all previous lines' content 
    return range.startOffset + prevChars; 
} 

function replaceAndSet(e) { 
    //Capture the click target as Selection(), convert to Range(); 
    var userRange = window.getSelection().getRangeAt(); 

    newArea = swapArea(source); 

    //spanLines holds siblings (nodeName #Text or <BR>) constituting <span> contents 
    var spanLines = userRange.startContainer.parentElement.childNodes; 
    var clickChar = getCursorLoc(spanLines, userRange); 

    newArea.focus(); 
    newArea.setSelectionRange(clickChar, clickChar);  
} 

var source = someSpan; //the span user clicks on 
source.onclick = replaceAndSet; 
+0

請記住,您不必在您的答案中要求提供贊成票。保持它的直接和正確的答案(在合理的範圍內)。您將很快獲得評論的特權,這也會有所幫助。但不要求提供讚揚。 ':)'如果這是一個高質量的答案(在大多數情況下),你會得到它們。 –

相關問題