Javascript 仅当不在div中时才需要运行指令
我有一个名为Javascript 仅当不在div中时才需要运行指令,javascript,angularjs,angular-directive,Javascript,Angularjs,Angular Directive,我有一个名为menu的指令,只有当它们不是menu元素的子元素时,我才需要执行它们的代码 HTML 对我来说,有两个不同的指令更有意义(例如,有一个指令和一个指令用于嵌套菜单) 但是如果您坚持使用同一指令,有几种方法可以区分根菜单和嵌套菜单(例如,您可以遍历元素的父菜单,直到找到父菜单或文档元素) 我更喜欢的另一种方法(主要是因为它的“直截了当”)是为根菜单指定一个额外的属性: <menu type="context"> <menuitem>Test 1</
menu
的指令,只有当它们不是menu元素的子元素时,我才需要执行它们的代码
HTML
对我来说,有两个不同的指令更有意义(例如,有一个
指令和一个
指令用于嵌套菜单)
但是如果您坚持使用同一指令,有几种方法可以区分根菜单和嵌套菜单(例如,您可以遍历元素的父菜单,直到找到父菜单或文档元素)
我更喜欢的另一种方法(主要是因为它的“直截了当”)是为根菜单指定一个额外的属性:
<menu type="context">
<menuitem>Test 1</menuitem>
<menuitem>Test 2</menuitem>
<menu> <!-- The directive should not run inside of another menu -->
<menuitem>SubTest 1</menuitem>
<menuitem>SubTest 2</menuitem>
</menu>
</menu>
...
link: function(scope, el, attrs) {
if (!attrs.type) return;
// This is a root menu
console.log('I am executing !');
var el = el[0];
...
测试1
测试2
子测验1
子测验2
...
链接:功能(范围、el、属性){
如果(!attrs.type)返回;
//这是根菜单
log('我正在执行!');
var el=el[0];
...
另请看,这个看起来像是将元素保留为“菜单”,所以您只想跳过事件侦听器?您可以检查el的父标记吗?您的菜单应该是什么样子的,您的子菜单应该在其中一个菜单项中,不是吗?菜单可以到处都是,并且可以嵌套
querySelector
也会在元素的子菜单中查找,因此我不知道如何区分根菜单和具有其他子菜单的子菜单。很抱歉,我想得太晚了……:/但是我不想实现任何附加属性(以区别于HTML5标准)您的意思是什么“区别于HTML5标准”?我的目标是使其尽可能类似于HTML5标准。这意味着没有额外的属性,没有DOM差异。现在,我明白你的意思了。甚至HTML5标准也定义了一个类型属性。那么,类型属性呢?
app.directive('menu', function() {
document.addEventListener('contextmenu', function(){event.preventDefault()}, false);
return {
restrict: 'E',
priority: 800,
link: function(scope, el, attrs) {
var el = el[0];
el.addEventListener("contextmenu", function(){
event.preventDefault();
}, false);
el.parentNode.addEventListener('contextmenu', function(){
menu.style.display = "block";
menu.style.top = event.layerY+"px";
menu.style.left = event.layerX+"px";
}, false);
}
}
});
<menu type="context">
<menuitem>Test 1</menuitem>
<menuitem>Test 2</menuitem>
<menu> <!-- The directive should not run inside of another menu -->
<menuitem>SubTest 1</menuitem>
<menuitem>SubTest 2</menuitem>
</menu>
</menu>
...
link: function(scope, el, attrs) {
if (!attrs.type) return;
// This is a root menu
console.log('I am executing !');
var el = el[0];
...