2013-01-22 46 views
7

我有了這個標記後嵌套CONTENTEDITABLE

<div contentEditable="true"> 
    Some other editable content 
    <div class="field" contentEditable="false"> 
     <span class="label">This is the label</span> 
     <span class="value" contentEditable="true">This is where the caret is</span> 
    </div> 
    <!-- This is where I want the Caret --> 
</div> 

插入符號設置光標位置目前在.field跨度。

我需要將其移回.field在父contentEditable

Example

如何(如果需要與使用jQuery的)這個實現通過JavaScript?

當插入符號位於.value跨度時,它將嘗試在keydown事件上觸發它,如圖所示。

+0

*當你想要嗎? '.field'之後呢? –

+0

@ExplosionPills無論何時我想要,通過javascript ...當插入符號位於'.value'範圍內時,它很可能以'keydown'事件結束。 – jondavidjohn

+0

我不確定這是可能的,除非你在'.field' div –

回答

3

到以前的答案更新。 http://jsfiddle.net/GLzKy/4/

placeCaretAtEnd($(this).parent().nextAll('.field').children('value')); 

UPDATE

在評論

對於目前的後場直接動正確答案更新的答案,你可能想使用range.setStartAfter和range.setEndAfter: http://jsfiddle.net/GLzKy/5

+0

不完全是我以後,如果你閱讀HTML中的評論,你會看到我在做什麼。不要跳轉到下一個字段,而是直接在當​​前字段之後移動它。 – jondavidjohn

+2

對於在當前字段之後直接移動,您可能想要使用range.setStartAfter和range.setEndAfter:http://jsfiddle.net/GLzKy/5/ –

3

我假設你想要進入下一節。爲了說清楚,我添加了一個文字「Here!」在演示中告訴你它確實走到了盡頭。

在下面的演示中,按.field .value輸入鍵即可結束。

DEMO:http://jsfiddle.net/GLzKy/1/

下面是https://stackoverflow.com/a/4238971/297641功能實際上做所有的工作。

$('.field .value').keydown(function (e) { 
    if (e.which == 13) { //Enter Key 
     e.preventDefault();    
     placeCaretAtEnd($(this).closest('.parent')[0]); 
    } 
}); 

/** 
    This below function is from https://stackoverflow.com/a/4238971/297641 
    All credits goes to the original author. 
*/ 
function placeCaretAtEnd(el) { 
    el.focus(); 
    if (typeof window.getSelection != "undefined" 
      && typeof document.createRange != "undefined") { 
     var range = document.createRange(); 
     range.selectNodeContents(el); 
     range.collapse(false); 
     var sel = window.getSelection(); 
     sel.removeAllRanges(); 
     sel.addRange(range); 
    } else if (typeof document.body.createTextRange != "undefined") { 
     var textRange = document.body.createTextRange(); 
     textRange.moveToElementText(el); 
     textRange.collapse(false); 
     textRange.select(); 
    } 
} 

測試在FF,IE8和Chrome

參考:https://stackoverflow.com/a/4238971/297641

+0

關閉,但我的修改應該解釋這個解決方案的問題... http://jsfiddle.net/GLzKy/3/ ...我需要在焦點元素後立即去下一節,而不是在非常父母的結尾。 – jondavidjohn

+0

http://jsfiddle.net/farrukhsubhani/GLzKy/6/添加了一個警報測試,它似乎去正確的地方,但如果你刪除警報,那麼它不會。至少如果不是最終的解決方案,可以玩一些東西。 –

+0

工作正常。用鉻進行測試。 –