2015-07-23 7 views
0

Мне нужно всплывающее предупреждение, когда я использую средний клик, и он не должен всплывать, если я нажму на ссылку, но на любом другом элементе страницы (или просто на пустом месте).Page Middle Click Listener

var test = { 
pageMiddleClickListener : function(e) { 
    if(e.which === 2) {  
     //if (!gContextMenu.onLink) { 
      alert('ok'); 
     //} 
    } 
} 
window.addEventListener("click",test.pageMiddleClickListener,false); 

оповещений шоу окна, когда я использую Ближний Нажмите на ссылку, но мне нужно, чтобы предотвратить такое поведение в связи

мне нужно что-то вроде «! GContextMenu.onLink», но не для контекстного меню (без)

ответ

2

Есть несколько способов, которые вы можете испытать на target клика, являющегося ссылкой. Одним из способов было бы проверить, есть ли Element.tagNameA, другой - проверить свойство href. Как оказалось, также необходимо проверить, не связаны ли какие-либо из целевых parentNode s.

var test = { 
    pageMiddleClickListener : function(e) { 
     if(e.button === 1) {  
      if (!test.isLinkOrAParentIsLink(e.target)) { 
       e.view.alert('ok'); 
      } 
     } 
    }, 

    isLinkOrAParentIsLink : function(el) { 
     if (el.tagName === "A") { 
      return true; 
     } //else 
     let parent= el.parentNode; 
     while (parent !== null && typeof parent.tagName !== "undefined") { 
      if (parent.tagName === "A") { 
       return true; 
      } //else 
      parent= parent.parentNode; 
     } 
     return false; 
    } 
} 
window.addEventListener("click",test.pageMiddleClickListener,false); 

или

isLinkOrAParentIsLink : function(el) { 
     if (el.hasAttribute("href")) { 
      return true; 
     } //else 
     let parent= el.parentNode; 
     while (parent !== null && typeof parent.tagName !== "undefined") { 
      if (parent.hasAttribute("href")) { 
       return true; 
      } //else 
      parent= parent.parentNode; 
     } 
     return false; 
    } 

Примечание: Я изменил e.which к e.button как то, что в спецификации click events и MouseEvent.which нестандартно. Обратите внимание, что это также требовало тестирования для e.button === 1 вместо 2.

+0

Он работает сейчас, но только несколько ссылок Если ссылка выглядит следующим образом: *** Это работает правильно (предупреждение не всплывающее) Но Уведомления всплывающих окон, если ссылка выглядит следующим образом: <'b>*** ИЛИ *** (Youtube использует его для ссылки на видео) – user25

+0

Я обновил это, чтобы проверить, являются ли какие-либо из 'parent.Narget'' e.target ''ссылками. Это решает проблему YouTube, о которой вы упомянули, и должна учитывать любые другие, у которых есть структура ниже ссылки. Я также удаляю свои старые комментарии, которые больше не актуальны. – Makyen

+0

Я также нашел решение, и это проще: if (! E.target.closest («a»)) {alert ('ok'); } – user25

1

Вы можете проверить, нажали ли вы <a> с помощью метода prop.

$(this).prop("tagName") == "A" 

В прослушивателя событий:

var test = { 
    pageMiddleClickListener : function(e) { 
     if(e.which === 2) {  

     // not an <a> ? 
     if ($(this).prop("tagName") !== "A") { 
      alert('ok'); 
     } 
    } 
} 
window.addEventListener("click",test.pageMiddleClickListener,false); 
+0

Было бы необычно, если jQuery будет доступен в среде дополнения Firefox. – Makyen

+0

Хорошая точка. Я сделал предположение из тега jQuery этого сообщения. – mac

+0

У вас также есть хорошая точка, что тег есть. Должен признаться, что я даже не искал его, поскольку jQuery в дополнении Firefox может немного расстраиваться, чтобы настроить и правильно представить в качестве дополнения к AMO, чтобы большинство людей этого не делали. Учитывая тег, я не должен был комментировать. – Makyen

Смежные вопросы