Почему курсор перескакивает в начало строки
Перейти к содержимому

Почему курсор перескакивает в начало строки

  • автор:

Почему курсор переходит в начало строки в моем компоненте?

Прошу прощения за «простыню», специально ничего не убирал.
Собственно проблема — при вводе данных в элемент с contentEditable курсор после каждого ввода данных перескакивает в начало строки. Проблема известная, вот к примеру та же история, хоть и 6-летней давности вопрос.
Насколько я понял, проблема в изменении стейта и ререндерах. Окей. Я решил вопрос использованием рефов вместо стейта(костыли, откровенно говоря). Еще нормально работает, если повесить обработчик на onBlur вместо onInput.
Вопрос вот в чем — почему тогда в этом примере не происходит перескакивания курсора?
Есть ли аксакалы которые сталкивались с чем-то подобным?

  • Вопрос задан 27 янв.
  • 67 просмотров

Double Commander

Курсор перескакивает на следующий файл при его изменении во внешней программе

Здесь обсуждаем возможные ошибки. Подтвержденные ошибки отправляем в баг трекер.
GenuZ Posts: 2 Joined: Thu Mar 30, 2017 1:09 am

Курсор перескакивает на следующий файл при его изменении во внешней программе

#1 Post by GenuZ » Sun Sep 19, 2021 10:47 am

В некоторых случаях курсор файловой панели перескакивает с открытого во внешней программе файла на другой, когда открытый файл изменяется во внешней программе.

Например, есть папка с несколькими документами, которые надо последовательно открыть в текстовом редакторе и в каждый внести изменения. Я открываю первый файл по Ctrl+Enter и во внешнем редакторе его изменяю. Закрываю редактор, а курсор уже на другом файле. Не том, который я только что открывал.

Это люто неудобно, так как сбиваешься, какой файл уже был открыт и изменён, а какой нет. Проявляется например на документах odt и LibreOffice. Когда LibreOffice закрылся с сохранением изменений файла, я снова оказываюсь в окне DoubleCMD, где вижу анимацию изменения файла (имя файла мигает и как бы на время пропадает) и из-за этого курсор соскакивает на следующий файл.

Я думаю проблема кроется где-то в момент, когда курсор в DoubleCMD перестаёт сопоставляться с именем файла при его переписывании/изменении внешним редактором. Получается, что файл по мнению DoubleCMD пропадает и курсор переносится на следующий доступный, а потом появляется изменённый файл, а курсор остаётся на том месте, ранее куда перенёсся.

GenuZ

AlexxL Posts: 123 Joined: Wed Mar 21, 2018 9:04 am

Курсор перескакивает на следующий файл при его изменении во внешней программе

#2 Post by AlexxL » Mon Sep 20, 2021 7:32 am

Подтверждаю, такая же история. Часто имею дело со списками файлов, открываю файл в Notepad++, редактирую, закрываю, а текстовой курсор уже на другом файле. Зачастую переходит вообще в конец списка.

AlexxL

Grishanenko Posts: 149 Joined: Sun Aug 18, 2013 7:17 am

Курсор перескакивает на следующий файл при его изменении во внешней программе

#3 Post by Grishanenko » Tue Oct 12, 2021 5:43 pm

Да, у меня тоже перескакивает, но я все никак не обращал внимание в какой момент это происходит. А сейчас появился повод.
Открыт файл *.xls, я делаю экспорт части таблицы в 123.pdf. При этом, хочу заменить существующий файл 123.pdf на котором и находится курсор.
На примере SoftMaker Free Office PlanMaker:

Создает файл tmp*.tmp (проверяется возможность записи на этот носитель?)
Удаляет файл tmp*.tmp
Выскакивает окошко «Заменить файл». Подтверждаю.
Запись в файл 123.pdf — файл еще есть, но размер становится нулевым.
Удаление файла 123.pdf
Вот в этот момент курсор в DC перескакивает на соседний файл.
Создается файл 123.pdf

Зачем такие сложности — не понятно.

Для решения проблемы, прежде всего, нужно продумать алгоритм действий.
Я вижу 2 варианта.

1)
1. При удалении файла под курсором, запомнить его имя.
2. Перенести курсор на соседний файл. Вот здесь главная засада, которая есть и сейчас: сместить выше или ниже? Потом будет путаница.
2. Убрать файл из списка.
4. В цикле мониторить наличие файла. Если он появится — вернуть на него курсор.

2)
1. При удалении файла под курсором, изменить цвет текста и фона под курсором. Можно даже включить мигание раз в секунду.
2. В цикле мониторить наличие файла. Если он появится — вернуть цвет, убрать мигание.
3. Если я переместил курсор с этого файла — убрать его из списка.
Смысл второго варианта в том, что я увижу что файл, который я запускал или на котором просто оставлял курсор, куда-то пропал.
Естественно, если он потом не вернется на свое место. Тогда будет возможность увидеть его имя, дату последнего изменения и почесать репу (почему так произошло?).
А если файл вернется на свое место, то я ничего и не замечу.

Перескакивает курсор в input при добавлении текста

Всем добрый день, хочу сделать живой поиск как у Яндекса, все уже почти получилось, но если «переходить» клавишами клавиатуры вверх и вниз по списку предложенных вариантов поиска, то курсор в input переходит то в конец текста, то в начало. Соответственно если нажимать клавишу вниз, то курсор встает в конец текста в поле input, если нажать клавишу вверх, то курсор встанет сначала в начало текста в поле input , а только при повторном нажатии будет «переходить» по списку. Переходить в кавычках потому как просто имитируется выбор словосочетания в списке путем выделения цвета. Если убрать код вставки выбранного текста в поле input , то все нормально, курсор стоит на прежнем месте. $(‘#search’).val($(«li:eq(«+poz+»)»).text()); Вот часть кода для «перемещения» по списку вариантов словосочетания:

$('#search').keydown(function(e)< $("ul#resSearch").children().each(function() < $(this).css( "color", "black" ); >); razmer=$("ul#resSearch li").length; if (poz==-1) else if (poz==razmer) if (e.keyCode == '40') < $('ul#resSearch').find("li:eq("+poz+")").css( "color", "red" ); $('#search').val($("li:eq("+poz+")").text()); poz++;>if (e.keyCode == '38') < poz--; $('ul#resSearch').find("li:eq("+poz+")").css( "color", "red" ); $('#search').val($("li:eq("+poz+")").text()); >>); 

Отслеживать

22.4k 11 11 золотых знаков 57 57 серебряных знаков 121 121 бронзовый знак

Перескакивает курсор в начало строки, в строке поиска динамического списка

Есть самописная конфигурация по учету товаров в рознице. Для справочника товаров через дополнение формы добавлена строка поиска динамического списка. Проблема в следующем: иногда при поиске(наборе текста), после нескольких введенных символов, курсор уходит в начало строки. Например, пользователь хочет найти «товар1», после ввода «тов» курсор переходит в начало строки, а пользователь не видя этого продолжает печатать и получается в итоге «ар1тов». Случается такое не всегда. При попытках увидеть эту проблему воочию, случилось 1 раз за час. Тестирование и исправление не помогает, удаление и восстановление индексов поиска тоже. База используется в файловом режиме. Программ типа punto switcher не установлено. Пока думается, что виноват код конфигурации. Только непонятно, что именно не так. Нужна помощь по решению этой проблемы.

Версия приложения: от 8.3.8.1652 до 8.3.8.2027

По конфигурации:
используется внешний вид «такси» и «8.2»
В справочнике товаров есть событие «ПриАктивизацииСтроки» в котором следующий код.

ТекДан = Элементы.Список.ТекущиеДанные; Если ТекДан <> Неопределено Тогда Если Строка(ТекДан.Штрихкод)<>СтарыеТекДан Тогда //Количество в упаковках Делимость = ТекДан.Делимость; КО = ТекДан.КоличествоОстаток; Цена = ТекДан.Цена; Если ДелимостьНеопределено Тогда Для каждого стрС Из ДанСк Цикл СтрокаСкидки = Скидки.Добавить(); СтрСтрукт = стрС.Значение; СтрокаСкидки.Количество = СтрСтрукт.Количество; СтрокаСкидки.Процент =СтрСтрукт.Процент; СтрокаСкидки.Скидка =СтрСтрукт.Скидка; Если СтрСтрукт.Скидка= "Централизованная" Тогда ВключитьКнопкуПечатиЦенникаСоскидкой=Истина; КонецЕсли; СтрокаСкидки.СоСкидкойУп =СтрСтрукт.СоСкидкойУп; СтрокаСкидки.СоСкидкойШт =СтрСтрукт.СоСкидкойШт; СтрокаСкидки.Приоритет =СтрСтрукт.Приоритет; КонецЦикла; КонецЕсли; СтарыеТекДан = ТекДан.Штрихкод; Если ВключитьКнопкуПечатиЦенникаСоскидкой Тогда Элементы.ФормаПечатьЦенникаДляТекущегоТовараСоСкидкой.Видимость=Истина; Иначе Элементы.ФормаПечатьЦенникаДляТекущегоТовараСоСкидкой.Видимость=Ложь; КонецЕсли; КонецЕсли; КонецЕсли;

Также есть обработчик ожидания в модуле управляемого приложения, запускается раз в 5 сек.
Код обработчика ожидания:

// Проверка Завершения приложения ПроверкаВыходаИзСистемы = Общий.ПроверкаВыходаИзСистемы(); Если ТипЗнч(ПроверкаВыходаИзСистемы)=Тип("Структура") Тогда Если ПроверкаВыходаИзСистемы.ЗавершениеРаботы Тогда ЗавершитьРаботуСистемы(Ложь); ИначеЕсли ПроверкаВыходаИзСистемы.ОткрытьФорму Тогда ОткрытьФорму("ОбщаяФорма.ФормаВыходаИзСистемы". РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); КонецЕсли; КонецЕсли; //Запуск регламентированных заданий Если Общий.РольДоступнаНаСервере("Заведующий") Тогда //Завершение работы Заведующих Между 5:00 И 5:15 Если (Число(Формат(ТекущаяДата(), "ДФ=ЧЧмм"))>600) И (Число(Формат(ТекущаяДата(), "ДФ=ЧЧмм"))<615) Тогда ЗавершитьРаботуСистемы(); КонецЕсли; //Показать новые загруженные утвержденные товары заведующим Если ПоказыватьНовыеУтвержденныеТовары И Общий.ЕстьНовыеУтвержденныеТовары() Тогда ОткрытьФорму("РегистрСведений.УтвержденныеТовары.Форма.ФормаСпискаНовыхУтвержденныхТоваров", . РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); КонецЕсли; //Вывод информации о разногласии цен //Запускать раз в час Если (глВремяПоследнегоПоказаИнформацииОРазногласииЦен =Неопределено) ИЛИ (глВремяПоследнегоПоказаИнформацииОРазногласииЦен<(ТекущаяДата()-(60*60))) Тогда Если ПоказыватьИнформациюОРазногласииЦен Тогда глВремяПоследнегоПоказаИнформацииОРазногласииЦен = ТекущаяДата(); ОткрытьФорму("Документ.АктРазногласияЦен.Форма.ФормаТоваровСРазногласиемЦен"); КонецЕсли; КонецЕсли; //Централизованная переоценка, Загрузка и вывод информации о переоцененных товарах Если ЗапускатьЦентрализованнуюПереоценку Тогда ОбменСервер.ЗагрузкаЦентрализованнойПереоценкиВФоне(); Если Общий.ПолучитьКонстанту("ПоказатьИнформациюОЦентрализованнойПереоценке") Тогда ОткрытьФорму("РегистрСведений.ТоварыОбработанныеЦентрализованнойПереоценкой.Форма. ФормаИнформацииОТоварахОбработанныхЦентрПереоценкой", . ВариантОткрытияОкна.ОтдельноеОкно. РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Общий.УстановитьКонстанту("ПоказатьИнформациюОЦентрализованнойПереоценке",Ложь); КонецЕсли; Если ((Общий.ПараметрыСеанса("ДатаИнфОТоварахПереоценки")+(60*30))<ТекущаяДата()) И Общий.ЕстьТоварыТоварыОбработанныеЦентрализованнойПереоценкой() Тогда ОткрытьФорму("РегистрСведений.ТоварыОбработанныеЦентрализованнойПереоценкой.Форма. ФормаИнформацииОТоварахОбработанныхЦентрПереоценкой", . РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); Общий.ПараметрыСеанса("ДатаИнфОТоварахПереоценки",Ложь,ТекущаяДата()); КонецЕсли; КонецЕсли; //Запуск регламентных заданий Если НЕ ЗапускатьВыполнениеРегламентныхЗаданийВОдномПроцессе Тогда ВыполнитьОбработкуЗаданий(); КонецЕсли; КонецЕсли; Если ЗапускатьВыполнениеРегламентныхЗаданийВОдномПроцессе и ВыполнятьРегламентныеЗадания Тогда ВыполнитьОбработкуЗаданий(); КонецЕсли; Если ТекущийПользовательРобот Тогда Робот2.ОтветНаЗапросыИзвне(); КонецЕсли; //Завершение работы после 22:00 Если (Число(Формат(ТекущаяДата(), "ДФ=ЧЧ"))>22) И (НЕ ВыполнятьРегламентныеЗадания) И ЗапускатьВыполнениеРегламентныхЗаданийВОдномПроцессе И (Не Общий.РольДоступнаНаСервере("ПолныеПрава")) Тогда ЗавершитьРаботуСистемы(); КонецЕсли;

Также выполняются регламентные задания, для запуска регламентных заданий используется отдельный процесс.

p.s. На просторах интернета такой проблемы не нашел.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *