2013-01-22 32 views
7

Mam ten Markuppozycja przesuwać kursor po zagnieżdżonego 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> 

The daszek jest obecnie w przedziale .field.

Muszę go przenieść z powrotem po.field w rodzica contentEditable.

Example

Jak można to osiągnąć poprzez javascript (przy użyciu jQuery, jeśli to konieczne)?

Będzie próbowała wyzwolić go na zdarzeniu kluczowym, gdy karetka znajduje się w polu .value, jak pokazano.

+0

* Kiedy * chcesz zrobić ve to po '.field'? –

+0

@ExplosionPills Ilekroć chcę, za pośrednictwem javascript ... Najprawdopodobniej skończy się na zdarzeniu 'keydown', gdy karetka znajduje się w zakresie' .value'. – jondavidjohn

+0

Nie jestem pewien, czy jest to możliwe, chyba że masz niepuste węzły po '.field' div –

Odpowiedz

3

Aktualizacja poprzedniej odpowiedzi. http://jsfiddle.net/GLzKy/4/

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

UPDATE

Updated odpowiedź z prawidłową odpowiedź w komentarzach

do przenoszenia bezpośrednio po zakończeniu bieżącego pola, można użyć range.setStartAfter i range.setEndAfter: http://jsfiddle.net/GLzKy/5

+0

Nie do końca jestem tym, czego szukam, jeśli przeczytasz komentarze w HTML, zobaczysz, czego szukam. Nie przeskakiwanie do następnego pola, ale przeniesienie go bezpośrednio za bieżącym polem. – jondavidjohn

+2

Aby przejść bezpośrednio po bieżącym polu, możesz użyć range.setStartAfter i range.setEndAfter: http://jsfiddle.net/GLzKy/5/ –

3

Zakładam, że chcesz przejść do następnej sekcji. Aby było jasne, dodałem tekst "Tutaj!" w demo, aby pokazać, że idzie do końca.

W poniższej prezentacji naciśnij Wprowadź klucz z .field .value, aby przejść do końca.

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

Poniżej znajduje się funkcja od https://stackoverflow.com/a/4238971/297641 który faktycznie wykonuje całą pracę.

$('.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(); 
    } 
} 

Testowany w FF, IE8 i Chrome

referencyjny:https://stackoverflow.com/a/4238971/297641

+0

Zamknij, ale moje modyfikacje powinny wyjaśnić problem z tym rozwiązaniem ... http://jsfiddle.net/GLzKy/3/ ... Muszę przejść do następnej sekcji natychmiast po elemencie z fokusem, a nie na samym koniec rodzica. – jondavidjohn

+0

http://jsfiddle.net/farrukhsubhani/GLzKy/6/ dodano alert do przetestowania i wydaje się, że trafił on we właściwe miejsce, ale jeśli usuniesz alert, to nie.Coś do zabawy z przynajmniej jeśli nie ostatecznym rozwiązaniem. –

+0

Działa dobrze. Przetestowano za pomocą chrome. –