Выбор располагается в WebKit (Safari/Chrome)

Я использую довольный доступный для редактирования iframe для создания маркера синтаксиса в JavaScript, и одна из самых важных вещей состоит в том, чтобы смочь форматировать код правильно.

Следующий код работает, как он должен в Firefox:

// Create one indent character
var range = window.getSelection().getRangeAt(0);
var newTextNode = document.createTextNode(Language.tabChar);
range.insertNode(newTextNode);
range.setStartAfter(newTextNode);

Это создает символ вкладки и перемещает курсор в правую сторону символа. В Chrome и Safari вставляется символ, но курсор не переместится направо от него.

Я осмотрел объект диапазона и в Chrome и в Firefox, и затем заметил, что объект диапазона Firefox намного более богат, чем Chrome. Я был неспособным ro, находят любые спецификации объекта диапазона в WebKit.

Как я могу заставить этот код работать и на WebKit и на Firefox?

Спасибо!

10
задан Christoffer 6 February 2010 в 17:30
поделиться

1 ответ

Необходимо вызвать (), чтобы можно было дождаться возврата функции и получить ее возвращаемое значение. Также потребуется другой тип делегата. Это должно работать:

public static string readControlText(Control varControl) {
  if (varControl.InvokeRequired) {
    return (string)varControl.Invoke(
      new Func<String>(() => readControlText(varControl))
    );
  }
  else {
    string varText = varControl.Text;
    return varText;
  }
}
-121--1223598-

Объекты Firefox и WebKit Range полностью соответствуют спецификации DOM Range . Если Firefox имеет больше свойств, то они будут собственными расширениями Mozilla, но, как правило, спецификация предоставляет все, что вам может понадобиться.

В любом случае, проблема заключается в том, что вам необходимо повторно выбрать диапазон после его изменения:

// Create one indent character
var sel = window.getSelection();
var range = sel.getRangeAt(0);
var newTextNode = document.createTextNode(Language.tabChar);
range.insertNode(newTextNode);
range.setStartAfter(newTextNode);
sel.removeAllRanges();
sel.addRange(range);

Обратите внимание, что это не будет работать в ранних версиях Safari (до версии 3, я думаю), потому что его объект выбора не поддерживает getRireAt . Есть обходной путь для этого, который я могу предоставить, если вам это нужно.

23
ответ дан 3 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: