Я использую довольный доступный для редактирования 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?
Спасибо!
Необходимо вызвать (), чтобы можно было дождаться возврата функции и получить ее возвращаемое значение. Также потребуется другой тип делегата. Это должно работать:
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
. Есть обходной путь для этого, который я могу предоставить, если вам это нужно.