открытие меню с закрытым vbox после наведения (расширение Firefox)

#javascript #firefox #firefox-addon #xul

#javascript #firefox #firefox-аддон #xul

Вопрос:

             <menu id="list-menu" class="icon-list menu-iconic" label="Menu list">
                <menupopup>
                    <vbox flex="1" class="help">
                        <html:div class="help-text">
                            <label>Here is help text</label>
                        </html:div> 
                    </vbox>
                    <vbox flex="1" class="list" id="list-box">
                        Here is box with default height 300px;
                    </vbox>
                    <vbox flex="1">
                        <button class="button" value="Here is button" />
                        <button class="button" value="Here is button 2" />                          
                    </vbox>
                </menupopup>
            </menu> 
  

Если я резко наведу курсор мыши на элементы в menupopup, он закроется. Как это исправить?

Заранее спасибо.

Комментарии:

1. Я не понимаю человека. Можете ли вы сделать скринкаст и поделиться им? Как вы резко перемещаете мышь? Быстро? Вы имеете в виду быстрое наведение курсора мыши на него? Я не могу изменить размер, когда быстрое наведение курсора на элемент, прохождение и выключение элемента скрывает его. Но почему вы вставляете vbox ‘s в a menupopup , вы должны использовать a panel , если хотите это сделать. ЕСЛИ вам нужен элемент menu xul, то вместо них должны быть menuitem » vbox' s», и html:div элементы or не нужны label . На menuitem вы должны поставить ярлык. Можете ли вы поделиться своим основным кодом, я посмотрю на него и подключу панель для u.

2. @Noitidart, извините за мой плохой английский. Я записываю видео для вас. ( youtube.com/watch?v=Tbq83w5fZ98 )

3. Пожалуйста, не нужно извиняться. Я ценю видео, я проверю его сейчас. 🙂 Хорошо, я видел видео. Есть ли у вас исходный код на github? Я посмотрю и помогу вам. Для этого обязательно следует использовать панель, а не меню.

4. @Noitidart, да, вот мой репозиторий: github.com/Exclumice/firex . Мне просто нужно заменить тег меню на панель?

Ответ №1:

О, теперь я вижу, это не было видно в видео, но это подменю, которое открывается при наведении курсора мыши на элемент меню.

ССЫЛКА НА ИЗОБРАЖЕНИЕ.

Поэтому, когда вы наводите курсор мыши на «Список прокси>» menuitem , который открывает подраздел menuitem , и теперь хотите переместить курсор мыши из этого menuitem в открывшееся подменю, вы ДОЛЖНЫ осторожно перемещать мышь, удерживая ее наведенной на «Список прокси>» menuitem . Если ваша мышь уйдет из этого «Списка прокси>» menuitem до того, как достигнет подраздела menuitem , это приведет к удалению вашего подраздела, menuitem даже если ваша мышь теперь находится над подразделом menuitem . Чтобы обойти это, вы должны предотвратить скрытие всплывающего окна, если мышь находится над вашим подразделом menuitem . Я напишу для вас кое-что здесь, я пойду поработаю над этим. Мое решение будет stopPropogation включено popuphiding , если пользователь наведет курсор мыши на эту панель. Но разместите это здесь, чтобы @nmaier мог увидеть, в чем ваша проблема, может быть, у него есть идеи получше, пока я работаю.


Хорошо, вот решение: в overlay.xul добавлены onmousenter onmouseleave , и onmousedown атрибуты, подобные этому:

 <menupopup onmouseenter="Components.utils.reportError('entered');this.addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmousedown="Components.utils.reportError('downed');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="Components.utils.reportError('left');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)">
  

Затем в overlay.js и эта функция:

 preventHide: function(e) {
    e.preventDefault();
    Components.utils.reportError('PREVENTED HIDE'); //you can remove this, this is just a debug message to tell you when it hides
}
  

Итак, теперь это делает то, что вы хотите, вы можете попробовать, установив аддон из моей вилки: https://github.com/Noitidart/firex /

Редактировать: Хорошо, я понял вашу вторую проблему, в которой она скрывалась, даже после того, как мы реализовали вышесказанное. Теперь произошло обратное. Если вы осторожно перешли из «Список прокси>» в подменю, а теперь отсюда вы быстро перешли из подменю в «Список прокси>», но при наведении курсора мыши на «Отключить прокси» он скроет его, это нормальное ожидаемое поведение, но если вы хотите предотвратить этоя понимаю. Забудьте об этом stopPropogation , я отредактирую код выше. Таким образом, решение этой проблемы заключается в добавлении к <menu> тегу этих атрибутов: onmouseenter="this.childNodes[0].addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="this.childNodes[0].removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)"

Он также вызывал ложные события ввода и оставления при перемещении мыши в подменю. Итак, я исправил это, проверив event.relatedTarget .

Итак, объединив оба решения выше, в overlay.xul у нас есть это сейчас:

     <menu id="proxy-list-menu" class="icon-list menu-iconic" label="amp;proxy-list;" onmouseenter="this.childNodes[0].addEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="this.childNodes[0].removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)">
<menupopup onmouseenter="if (!event.relatedTarget) { Components.utils.reportError('entered');this.addEventListener('popuphiding', ProxyAddonBar.preventHide, false) }" onmousedown="Components.utils.reportError('downed');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false)" onmouseleave="if (!event.relatedTarget) { Components.utils.reportError('left');this.removeEventListener('popuphiding', ProxyAddonBar.preventHide, false) }">
  

Вопрос для @nmaier. После внесения моих изменений, если вы переместите курсор мыши из пункта подменю «Список прокси>» и случайно наведете курсор, но в итоге ваш курсор окажется на вложенном — menuitem это предотвратит скрытие. Если вы затем переместите курсор мыши и нажмете «Отключить прокси» menuitem или «Проверить скорость соединения», он НЕ скроет подменю, даже если я уже удалил preventHide функцию. Он закроется, только если вы снова наведете курсор на «Список прокси>».

ЕСЛИ вы откроете подменю, наведя курсор мыши на «Список прокси>» и осторожно наведите курсор мыши на открывшееся подменю, не выходя случайно из пункта «Список прокси>», то, как только вы дойдете до подменю, а затем покинете его, наведя курсор на «Отключить прокси» или «Проверить скорость соединения», появитсязакройте примерно через секунду. Итак, это нормальное поведение скрытия, почему, когда я открываю скрытие, оно не скрывается как обычно, когда я навожу курсор на эти другие метки?

Комментарии:

1. Попробуйте, какой человек? Я еще не опубликовал решение! : P Дайте мне еще 10 минут

2. Хорошо, чувак, я отредактировал решение. Но у него есть дополнительный вопрос для небольшого qwirk для @nmaier. Это не так уж и важно, но мне нравятся идеальные вещи.

3. О, черт, ты прав. Ок, измените onmouseleave атрибут на этот if (!event.relatedTarget) { Components.utils.reportError('left');this.removeEventListener('popuphiding',ProxyAddonBar.preventHide,false); }

4. Хорошо, я понял вашу проблему. Теперь произошло обратное. Если вы осторожно перешли из «Список прокси>» в подменю, а теперь отсюда вы быстро перешли из подменю в «Список прокси>», но при наведении курсора мыши на «Отключить прокси» он скроет его, это нормальное ожидаемое поведение, но если вы хотите предотвратить этоя понимаю. Забудьте об этом stopPropogation , я отредактирую код выше.

5. Ok отредактировал это выше, проверьте это. Обязательно удалите это stopPropagation