Страницы: 1
здраствуйте, моё расширение добавляет пару пунктов в контекстное меню. В обработчике выпадания контекстного меню я меняю видимость моих пунктов меню в зависимомти от того есть ли выделение. Выделение определяю по gContextMenu.isTextSelected. С задизабливанием всё ок.
Также, по долгу службы расширение меняет innerHTML для body на отображаемой в браузере странице. По прошествии нескольких операций замены innerHTML, у меня начинают неправильно дизаблится пункты меню, а точнее при выделенном тексте gContextMenu.isTextSelected даёт false, причём иногда после какого-то времени снова начинает работать, а иногда не начинает.....
вообщем никакой закономерности я не выявил.
у меня есть подозрение что при замене innerHTML у всего body ФФ не парсит новый код для постоения DOM(может его нужно попросить это сделать??) или может я ему такой HTML даю, что у него планка съезжает?????...
есть идеи?
спасибо.
Отсутствует
Может, перед изменением innerHTML попробовать удалять выделение:
?
или проверять наличие выделения через
Отредактировано Anton (15-05-2006 17:10:42)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Может, перед изменением innerHTML попробовать удалять выделение:
?
или проверять наличие выделения через
честно говоря я не очень понял идею.. что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось
нашёл некоторые закономерности, пожалуй распишу поподробнее чего творю, может и сам лучше пойму
я пишу расширение-перводчик страниц в браузере (не TransBar , работает на локальном ядре промта). Страницы я перевожу так: беру
, передаю его в свою компоненту(XPCOM), оттуда получаю переведённый текст и строкой
запихиваю его обратно. В контекстном меню у меня команда "перевести выделенный фрагмент", которую я хотел показывать или скрывать в зависимости от наличия выделенного текста. Если ничего не переводить(то бишь не менять innerHTML), то gContextMenu.isTextSelected и getSelection() всегда возвращают то что есть на самом деле, если же начать переводить проявляются глюки, вот мои наблюдения:
-) Вариант 1.
перевожу простую (без фреймсетов) страницу, то есть меняю innerHTML только у content.document.body, после чего выделяю текст на этой же странице (с изменённым innerHTML) - gContextMenu.isTextSelected возвращает true. Загружаю исходную страницу, gContextMenu.isTextSelected продолжает работать нормально. Загружаю страницу с фреймсетом, выделяю текст - gContextMenu.isTextSelected даёт false при выделенном тексте, document.commandDispatcher.focusedWindow.getSelection().toString() даёт пустую строку.
-) Вариант 2.
перевожу фреймсетовую страницу(рекурсивно прохожусь по коллекции content.frames и у каждого фрейма заменяю content.frames[i].document.body.innerHTML на переведённыйй) - gContextMenu.isTextSelected - и getSelection() перестают работать (то есть возвращают false и "" при реально выделенном тексте) на любых страницах.
самый прикол, что я нашёл как это "лечить" - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.
вообщем нифига не понимаю, пойду покурю
Отсутствует
...
честно говоря я не очень понял идею...
После замены innerHTML выделение сохраняется, хотя его и не видно; может, в связи с этим и глючит gContexMenu.isTextSelected.
... что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось ...
Удаляет все области выделения из окна.
А других идей у меня нет.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
самый прикол, что я нашёл как это "лечить" - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.
А там компонента (или чего-там-ещё) сама не влияет на фокус окна? Я к тому, что в gContextMenu::isTextSelection вызывается gContextMenu::searchSelected, а там есть focusedWindow. М.б. где-то фокус сбивается? Попробуйте посмотреть в эту сторону. Правда, к вечеру уже башня не варит, но как вариант...
Отредактировано Mash (15-05-2006 22:29:25)
Отсутствует
ну да, я тоже по browser.js прошёлся и у меня такое же подозрение возникло. В компоненте происходит смена фокуса. При старте перевода я дизаблю окно ФФ (хендл получаю через виндовую GetActiveWindow), создаю на фоне задизабленного ФФ диалог прогресса по закрытии которого раздизабливаю ФФ и устананавливаю фокус на полученный ранее хендл. Сейчас уже не на работе, не проверить, завтра напишу чё вышло.
Отсутствует
гы, всё было из-за фокуса
заменил GetActiveWindow/SetFocus на Get\SetForegroundWindow и всё вылечилось
только хотел спросить, а focusedWindow - это фрейм HTML-документа в котором фокус ввода? я правильно допёр?
p.s. спасибо всем огромное!
Отредактировано cesspit (16-05-2006 11:15:45)
Отсутствует
Страницы: 1