Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№115-05-2006 16:25:56

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

gContextMenu

здраствуйте, моё расширение добавляет пару пунктов в контекстное меню. В обработчике выпадания контекстного меню я  меняю видимость моих пунктов меню в зависимомти от того есть ли выделение. Выделение определяю по gContextMenu.isTextSelected. С задизабливанием всё ок.
Также, по долгу службы расширение меняет innerHTML для body на отображаемой в браузере странице. По прошествии нескольких операций замены innerHTML, у меня начинают неправильно дизаблится пункты меню, а точнее при выделенном тексте gContextMenu.isTextSelected даёт false, причём иногда после какого-то времени снова начинает работать, а иногда не начинает.....
вообщем никакой закономерности я не выявил.
у меня есть подозрение что при замене innerHTML у всего body ФФ не парсит новый код для постоения DOM(может его нужно попросить это сделать??) или может я ему такой HTML даю, что у него планка съезжает?????... :dumb:

есть идеи?

спасибо.

Отсутствует

 

№215-05-2006 16:41:50

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: gContextMenu

Может, перед изменением innerHTML попробовать удалять выделение:

Выделить код

Код:

window. getSelection (). removeAllRanges ();

?

или проверять наличие выделения через

Выделить код

Код:

window. getBrowser (). contentDocument. defaultView. getSelection () != ""

Отредактировано Anton (15-05-2006 17:10:42)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№315-05-2006 18:34:46

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: gContextMenu

Anton пишет

Может, перед изменением innerHTML попробовать удалять выделение:

Выделить код

Код:

window. getSelection (). removeAllRanges ();

?

или проверять наличие выделения через

Выделить код

Код:

window. getBrowser (). contentDocument. defaultView. getSelection () != ""

честно говоря я не очень понял идею.. что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось :(
нашёл некоторые закономерности, пожалуй распишу поподробнее чего творю, может и сам лучше пойму :)

я пишу расширение-перводчик страниц в браузере (не TransBar :), работает на локальном ядре промта). Страницы я перевожу так: беру

Выделить код

Код:

content.document.body.innerHTML

, передаю его в свою компоненту(XPCOM), оттуда получаю переведённый текст и строкой

Выделить код

Код:

content.document.body.innerHTML = str

запихиваю его обратно. В контекстном меню у меня команда "перевести выделенный фрагмент", которую я хотел показывать или скрывать в зависимости от наличия выделенного текста. Если ничего не переводить(то бишь не менять 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 и "" при реально выделенном тексте) на любых страницах.

самый прикол, что я нашёл как это "лечить" :) - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.

вообщем нифига не понимаю, пойду покурю :)

Отсутствует

 

№415-05-2006 21:36:55

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
Веб-сайт

Re: gContextMenu

cesspit пишет

...
честно говоря я не очень понял идею...

После замены innerHTML выделение сохраняется, хотя его и не видно; может, в связи с этим и глючит gContexMenu.isTextSelected.

... что даёт window. getSelection (). removeAllRanges ();? попробовал, ничего не поменялось :(...

Удаляет все области выделения из окна.

А других идей у меня нет.


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№515-05-2006 22:27:22

Mash
Участник
 
Группа: Extensions
Зарегистрирован: 09-04-2005
Сообщений: 620
Веб-сайт

Re: gContextMenu

самый прикол, что я нашёл как это "лечить"  - достаточно переключится на другое окно (не ФФ) и вернуться обратно, всё сразу начинает работать нормально.

А там компонента (или чего-там-ещё) сама не влияет на фокус окна? Я к тому, что в gContextMenu::isTextSelection вызывается gContextMenu::searchSelected, а там есть focusedWindow. М.б. где-то фокус сбивается? Попробуйте посмотреть в эту сторону. Правда, к вечеру уже башня не варит, но как вариант...

Отредактировано Mash (15-05-2006 22:29:25)

Отсутствует

 

№615-05-2006 23:18:05

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: gContextMenu

ну да, я тоже по browser.js прошёлся и у меня такое же подозрение возникло. В компоненте происходит смена фокуса. При старте перевода я дизаблю окно ФФ (хендл получаю через виндовую GetActiveWindow), создаю на фоне задизабленного ФФ диалог прогресса по закрытии которого раздизабливаю ФФ и устананавливаю фокус на полученный ранее хендл. Сейчас уже не на работе, не проверить, завтра напишу чё вышло.

Отсутствует

 

№716-05-2006 11:11:47

cesspit
Участник
 
Группа: Members
Откуда: СПб
Зарегистрирован: 08-02-2006
Сообщений: 80

Re: gContextMenu

гы, всё было из-за фокуса :)
заменил GetActiveWindow/SetFocus на Get\SetForegroundWindow и всё вылечилось
только хотел спросить, а focusedWindow - это фрейм HTML-документа в котором фокус ввода? я правильно допёр? :)

p.s. спасибо всем огромное! :)

Отредактировано cesspit (16-05-2006 11:15:45)

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]