Xpoint
   [напомнить пароль]

Создать элементы в контекстном меню

Метки: [без меток]
2007-07-13 15:02:40 [обр] Evgheny[досье]

Есть 2 расширения. Оба создавал давно.
В одном из них, есть кнопка в контекстном меню по правой кнопке:

<!-- Right Click menu -->
        <popup id="contentAreaContextMenu" onpopupshown = "todowhenpopup(event)">
         <menuitem class="menuitem-iconic xxtags-icon-pencil" hidden="true" id="xxQuote" label="xx &quote;" oncommand="xx_quote();" />
        </popup>

Всё работает, срабатывает todowhenpopup, копирует выделенный текст и т.д.
Тут мне понадобилось и в другом расширении добавить свою кнопочку в контекст меню по правому клику. И в том расширении я добавляю такое:

    <popup id="contentAreaContextMenu" onpopupshown = "toDoWhenPopup(event)">
         <menuitem hidden="true" id="this_search" label="this Search" oncommand="thisSearch();" />
     </popup>

Тоже всё работает, но эти расширения конфликтуют теперь.
Они работают только по отдельности - т.е. если выключено одно, то я могу увидеть кнопку в контекст меню второго расширения, и наоборот.
А когда они оба включены - то ничья кнопка не появляется в контекст-меню. Как исправить?

спустя 2 часа 13 минут [обр] Cube(2/2)[досье]
Может быть id'ы оверлеев одинаковые у обоих расширений ?
спустя 5 минут [обр] Evgheny[досье]

Нет, id у оверлеев отличаются.

Только теперь картинка немножко другая, не так как я изначально писал.
Первое расширение (первый код листинга) у меня уже давно было с кнопкой в контексте. Я добавил во второе расширение, и теперь оно видно только во-втором (в новом), а в старом нету. Есть только если я отключаю это новое расширение.

спустя 2 минуты [обр] Cube(2/2)[досье]
p.s. желательно бы посмотреть на оба оверлея в любом случае, а также на код todowhenpopup/toDoWhenPopup
спустя 1 час 2 минуты [обр] Evgheny[досье]

Первый оверлей:

<overlay id="jjtagsOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="..."/>
<script type="application/x-javascript" src="..."/>

<!-- for localization area -->
<hbox style="display:none">
 <label value="&toquote;" id="lbl_toquote" />
 <label value="&quote;" id="lbl_quote" />
</hbox>
<!--       end area        -->
<!-- Right Click menu -->
        <popup id="contentAreaContextMenu" onpopupshown = "todowhenpopup(event)">
         <menuitem class="menuitem-iconic jjtags-icon-pencil" hidden="true" id="xxQuote" label="xx &quote;" oncommand="xx_quote();" />
        </popup>
<!-- Tools menu (For Options) -->
    <menupopup id="menu_ToolsPopup">
   <menuitem class="menuitem-iconic xxtags-icon-pencil" label="&q_options;" oncommand="open_options();" insertafter="prefSep" />
   </menupopup>
</overlay>

Первая функция todowhenpopup:

function todowhenpopup(event){
txt = grabSelect(); //то что мы выделили
if ((window._content.document.location.href.indexOf("some_site")== -1)|| (txt == "")) { //мы не на сайте
// Прячем кнопки из контесктного меню
document.getElementById("xxQuote").hidden = true;
} else {
 var txt2 = txt; //копия
  //
  // Тут разные преобразование с выделенным текстом
  //
  
//Показываем кнопку
document.getElementById("xxQuote").hidden = false; 
   //изменяем лейбл на кнопке
document.getElementById("jjQuote").label= txt2;
}
}

В этом оверлее и функции я ничего не менял - всё работало.
Вот новый оверлей:

<overlay id="showprofOverlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/x-javascript" src="chrome://showprof/content/showprof.js" />
<script type="application/x-javascript" src="chrome://showprof/content/badwords.js" />
   
   <popup id="contentAreaContextMenu" onpopupshown = "toDoWhenPopup(event)">
         <menuitem hidden="true" id="this_search" label="This Search" oncommand="thisSearch();" />      
     </popup>
      <popupset id="mainPopupSet">
      <!-- Подсказки -->
       <tooltip id="showprof-popup" insertafter="backMenu">
          <vbox flex="1">
               <label id="showprof-popup-label" value="Опции" />
            </vbox>
       </tooltip>
   <!-- Всплывающее меню -->   
       <popup id="showprof-context-menu">
           <!-- Опции -->
         <menuitem oncommand="show_options();">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/key.png" align="left"/>
              <label value="Опции" align="right" />
              </hbox> 
         </menuitem>
      <menuseparator />
           <!-- Ответы -->
         <menuitem oncommand="openTemplates();">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/responces.png" align="left"/>
              <label value="Ответы" align="right" />
              </hbox> 
         </menuitem>
           <!-- Найти -->
         <menuitem oncommand="findProf();">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/find.png" align="left"/>
              <label value="Найти" align="right" />
              </hbox> 
         </menuitem>
           <!-- Отписать мыло -->
         <menuitem oncommand="unsubscribe();">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/letter.png" align="left"/>
              <label value="Отписать Мыло" align="right" />
              </hbox> 
         </menuitem>
      <menuseparator />
         <!-- Зайти как он -->
         <menuitem oncommand="urlModificatePrepare(2);">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/enter.png" align="left"/>
              <label value="Зайти как он" align="right" />
              </hbox> 
         </menuitem>
         <!-- Switch -->
          <menuitem oncommand="urlModificatePrepare(1);">
           <hbox class="menu-iconic-left">
                 <image class="menu-iconic-icon" src="chrome://showprof/content/pics/switch.png" align="left"/>
              <label value="Switch    " align="right" />
              </hbox> 
         </menuitem>
        </popup>
    </popupset>
   
   <!-- Главная иконка в статусбаре -->
   <statusbar id="status-bar">
      <statusbarpanel id="showprof-statusbar" insertafter="page-report-button" tooltip="showprof-popup" context="showprof-context-menu">
         <hbox tooltip="showprof-popup" context="showprof-context-menu">
            <image src="chrome://showprof/content/pics/main.png" />
         </hbox>
      </statusbarpanel>
   </statusbar>
    
   
</overlay>

и вот toDoWhenPopup():

function toDoWhenPopup(event){
txt = grabSelect(); //то что мы выделили
if ( (window._content.document.location.href.indexOf("other_site")==-1) || (txt=="") ) { //мы не на сайте
// Прячем кнопк из контесктного меню
document.getElementById("this_search").hidden = true;
} else {
 var t_mem = txt;

  //
  //Тут преобразования над выделенным текстом
  //

 //Показываем кнопку 
document.getElementById("this_search").hidden = false;
   //изменяем лейбл на кнопк
document.getElementById("this_search").label= t_mem;

}
}
спустя 1 час 57 минут [обр] Cube(2/2)[досье]
Судя по коду функций todowhenpopup/toDoWhenPopup (обе вызывают grabSelect), я попробую сделать предположение, что в обоих расширениях имеются по-разному реализованные функции с одинаковыми именами.
спустя 21 минуту [обр] Evgheny[досье]

Ну в обоих случаях grabSelect одинаковая. Я её скопировал просто из первого расщирения.
Ну посмотрим, она мне всё равно не нравится - не выделяет в некоторых местах, напишу другую, поищу.

А вообще, если у разных разрешениях функция называется поодинаковому, то они могут конфликтовать?

спустя 2 часа 6 минут [обр] Cube(2/2)[досье]
А вообще, если у разных разрешениях функция называется поодинаковому, то они могут конфликтовать?
Если два оверлея в одно окно будут определять одну и ту же функцию, будет определена только одна из них. Оба оверлея будут видеть только одну из функций, а не каждый свою собственную.
спустя 15 минут [обр] Evgheny[досье]

А почему так будет?
Ведь я указываю у первого оверлея - свой .js файл, а другому оверлею свой...

Но у меня-то они одинаковые эти функции) В чём же тогда дело(((

спустя 1 час 12 минут [обр] Cube(2/2)[досье]
А почему так будет?

Видимо, одно определение функции перекрывает другое.

Но у меня-то они одинаковые эти функции) В чём же тогда дело(((

Может быть, они ссылаются на другие, специфичные для каждого из расширений определения ? Глобальные переменные, другие функции ?
Проверьте внимательно всю программную логику.

спустя 3 дня [обр] Владимир Палант(434/4445)[досье]
сообщение промодерировано

Evgheny[досье]
Я правильно понимаю, что вы дважды определяете атрибут onpopupshowing для одного и того же меню? Причем меню это стандартное, и у него этот атрибут уже и так есть? Так как же это по вашему должно работать?

Пользуйтесь атрибутами on... только в том случае, если вы уверены, что никто другой не попытается туда залезть. Более надежный способ — addEventListener:

var menu = document.getElementById('contentAreaContextMenu');
menu.addEventListener("popupshowing", todowhenpopup, false);

Выполняйте это при загрузке окна и все будет в порядке. Хотя я бы вам порекомендовал в оверлеях окна браузера использовать такие названия функций и переменных, чтобы вероятность конфликта с другими расширениями была меньше — ведь именное пространство у них одно и то же, и если другое раширение определит функцию todowhenpopup, то ваша будет просто переписана. Вместо этого можно к примеру писать: myExtension_todowhenpopup, где myExtension название вашего расширения.

спустя 2 дня 10 часов [обр] Evgheny[досье]
Спасибо большое. Ошибку понял
Powered by POEM™ Engine Copyright © 2002-2005