2010-05-20 3 views
35

Старая версия вопроса ниже, после исследования большего количества, я решил перефразировать вопрос. Проблема по-прежнему заключается в том, что мне нужно сфокусировать контент-контент, не выделяя текст, делая прямое фокус, выделяя текст в Chrome.jquery Установка позиции курсора в контентном значении div

Я понимаю, что люди решили эти проблемы в текстовых средах, сбросив положение каретки в текстовое поле. Как я могу сделать это с помощью элемента contenteditable? Все плагины, которые я пробовал, работают только с текстовыми полями. Благодарю.

Старый Фразировка вопроса:

У меня есть contenteditable элемент, который я хочу сосредоточиться, но лишь постольку, поскольку , чтобы поместить курсор на передней панели элемента, а выбор все.

elem.trigger('focus'); с jQuery выбирает весь текст целиком элемент в хром. Firefox корректно ведет , устанавливая каретку на перед текстом. Как я могу получить Chrome, чтобы вести себя так, как я хочу, или фокус, возможно, не то, что я ищу для.

Спасибо всем.

+0

Это [предыдущий вопрос] (http://stackoverflow.com/questions/499126/ jquery-set-cursor-position-in-text-area) может помочь с позиционированием курсора. –

+0

Вы уверены, что они работают над контент-контентом. Я не смог заставить их работать. – Mark

+0

@Mark: я обновил код до последнего jquery и модифицировал демо для работы с богатым контентом. –

ответ

19

демо: http://so.devilmaycode.it/jquery-setting-cursor-position-in-contenteditable-div/

 <div id="editable" contentEditable="true"> 
      <h2>Lorem</h2> <p>ipsum dolor <i>sit</i> 
       amet, consectetur <strong>adipiscing</strong> elit.</p> Aenean. 
     </div> 

<script type="text/javascript"> 
     $(function() { 
      $('[contentEditable="true"]').on('click', function (e) { 
       if (!$(this).hasClass('editing')) { 
        var html = $(this).html(); 
        if (html.length) { 
         var range = rangy.createRange(); 
         $(this).toggleClass('editing').html('<span class="content-editable-wrapper">' + html + '</span>'); 
         var $last = $(this).find('.content-editable-wrapper'); 
         range.setStartAfter($last[0]); 
         range.collapse(false); 
         rangy.getSelection().setSingleRange(range); 
        } 
       } 
      }).on('blur', function() { 
       $(this).toggleClass('editing').find('.content-editable-wrapper').children().last().unwrap(); 
      }); 
     }); 
    </script> 
+1

Это интересный хак, отличная идея. Спасибо. Но contenteditable - редактор wysiwyg, поэтому я не могу просто заменить текстовое поле. – Mark

+0

посмотреть обновления! ;-) –

+1

Это не работает с текстовым полем :-( –

2

Да это происходит потому, что вы использовали

elem.trigger('focus'); 

попробовать использовать класс или определить элемент, на котором вы хотите, чтобы стрелять событие триггера.

+0

elem - переменная. – Mark

+2

Вы использовали его как input.trigger ('focus'); ??? – Chirag

29

Возможно, я неверно истолковал вопрос, но не сделал бы следующее (при условии, что редактируемый <div> с id "editable")? Таймер есть, потому что в Chrome, родное поведение браузера, который выбирает весь элемент, кажется, чтобы вызвать после focus события, тем самым отменяя действие кода выбора, если не отложено до окончания мероприятия фокус:

var div = document.getElementById("editable"); 

div.onfocus = function() { 
    window.setTimeout(function() { 
     var sel, range; 
     if (window.getSelection && document.createRange) { 
      range = document.createRange(); 
      range.selectNodeContents(div); 
      range.collapse(true); 
      sel = window.getSelection(); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } else if (document.body.createTextRange) { 
      range = document.body.createTextRange(); 
      range.moveToElementText(div); 
      range.collapse(true); 
      range.select(); 
     } 
    }, 1); 
}; 

div.focus(); 
+1

Awe !, это прекрасная вещь! Спасибо Тиму. –

+1

Мой бог, Тим, как ты это сделал. Спасибо. – pilau

+0

это здорово, но как я могу поставить фокус в конце div вместо фронта? Http://jsfiddle.net/bq6 jQ/1/http://stackoverflow.com/questions/22599694/how-can-i-type-inside-the-parent-contenteditable-div – Squirrl

1

мне удалось для решения этой проблемы после некоторого разговора по DOM.

elm.focus(); 
window.getSelection().setPosition(0); 

Это возможно, работает только на WebKit браузерах, но так как он является единственным источником проблемы, я добавил условный (с помощью JQuery)

if(!$.browser.webkit) { 
    elm.focus(); 
} else { 
    elm.focus(); 
    window.getSelection().setPosition(0); 
} 

Надеется, что это решает проблему.

+0

Хм, не знаю, почему, это не работает для меня. Тем не менее, ответ Тима Дауна. – Mark

+0

Я получил это для работы в Chrome, но не в Firefox. – Skitterm

0

Установить положение курсора в предварительно или сНе тега:

function setCursor(pos) { 
 
    var el = document.getElementById("asd"); 
 
    var range = document.createRange(); 
 
    var sel = window.getSelection(); 
 
    range.setStart(el.childNodes[0], pos); 
 
    range.collapse(true); 
 
    sel.removeAllRanges(); 
 
    sel.addRange(range); 
 
    el.focus(); 
 
} 
 

 
$('button').click(function() { 
 
    setCursor(5); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="asd" contenteditable="true" > 
 
asd 
 
two 
 
</div> 
 
<button>Set caret position</button>

Источник: https://social.msdn.microsoft.com/Forums/en-US/f91341cb-48b3-424b-9504-f2f569f4860f/getset-caretcursor-position-in-a-contenteditable-div?forum=winappswithhtml5