多次右键单击上下文菜单 angularjs
multiple right click contextmenu angularjs
我正在尝试在 angularjs 中使用此指令 contextMenu 实现右键单击下拉菜单。该指令在 firefox 中运行良好,但在使用“google chrome”打开另一个菜单时不会关闭旧菜单。知道我该如何更改它。
这是 plunkr
(function(angular) {
var ngContextMenu = angular.module('directive.contextMenu', []);
ngContextMenu.directive('cellHighlight', function() {
return {
restrict: 'C',
link: function postLink(scope, iElement, iAttrs) {
iElement.find('td')
.mouseover(function() {
$(this).parent('tr').css('opacity', '0.7');
}).mouseout(function() {
$(this).parent('tr').css('opacity', '1.0');
});
}
};
});
ngContextMenu.directive('context', [
function() {
return {
restrict: 'A',
scope: '@&',
compile: function compile(tElement, tAttrs, transclude) {
return {
post: function postLink(scope, iElement, iAttrs, controller) {
var ul = $('#' + iAttrs.context),
last = null;
ul.css({
'display': 'none'
});
$(iElement).bind('contextmenu', function(event) {
event.preventDefault();
ul.css({
position: "fixed",
display: "block",
left: event.clientX + 'px',
top: event.clientY + 'px'
});
last = event.timeStamp;
});
//$(iElement).click(function(event) {
// ul.css({
// position: "fixed",
// display: "block",
// left: event.clientX + 'px',
// top: event.clientY + 'px'
// });
// last = event.timeStamp;
//});
$(document).click(function(event) {
var target = $(event.target);
if (!target.is(".popover") && !target.parents().is(".popover")) {
if (last === event.timeStamp)
return;
ul.css({
'display': 'none'
});
}
});
}
};
}
};
}
]);
})(window.angular);
查看(指令的)源代码,我认为这个上下文菜单指令有点太简单了。它只是在 context
属性引用的元素上触发 show/hide 而已。对于编写它的人的用例来说,它可能已经足够了,但对于通用解决方案来说,它似乎太轻了。
指令代码中发生了什么:如果您碰巧在同一行触发上下文菜单(或更一般地引用相同的上下文菜单),它会正常工作,因为它只会在不同的位置显示当前的上下文菜单地方。如果您首先触发 context1
,然后(通过单击第二行)触发不同的上下文菜单 context2
,则根本没有任何代码会触发 context1
上下文菜单的隐藏.
您也可以自己实施,但要跟踪所有已打开的上下文菜单,并在打开另一个菜单之前将其关闭。
顺便说一句:这个上下文菜单在 Firefox(38,Mac OS X)中对我不起作用。它打开上下文菜单并立即再次将其关闭。这可能是因为 contextmenu
(在 table 行上)和 click
(在文档上)都被触发了。
将 .click 事件更改为 .mouseup 事件,它将与 chrome 一起使用。
$(document).mouseup(function(event) {
var target = $(event.target);
if (!target.is(".popover") && !target.parents().is(".popover")) {
if (last === event.timeStamp)
return;
ul.css({
'display': 'none'
});
}
});
我遇到了同样的问题,它对我有用。 :)
我正在尝试在 angularjs 中使用此指令 contextMenu 实现右键单击下拉菜单。该指令在 firefox 中运行良好,但在使用“google chrome”打开另一个菜单时不会关闭旧菜单。知道我该如何更改它。 这是 plunkr
(function(angular) {
var ngContextMenu = angular.module('directive.contextMenu', []);
ngContextMenu.directive('cellHighlight', function() {
return {
restrict: 'C',
link: function postLink(scope, iElement, iAttrs) {
iElement.find('td')
.mouseover(function() {
$(this).parent('tr').css('opacity', '0.7');
}).mouseout(function() {
$(this).parent('tr').css('opacity', '1.0');
});
}
};
});
ngContextMenu.directive('context', [
function() {
return {
restrict: 'A',
scope: '@&',
compile: function compile(tElement, tAttrs, transclude) {
return {
post: function postLink(scope, iElement, iAttrs, controller) {
var ul = $('#' + iAttrs.context),
last = null;
ul.css({
'display': 'none'
});
$(iElement).bind('contextmenu', function(event) {
event.preventDefault();
ul.css({
position: "fixed",
display: "block",
left: event.clientX + 'px',
top: event.clientY + 'px'
});
last = event.timeStamp;
});
//$(iElement).click(function(event) {
// ul.css({
// position: "fixed",
// display: "block",
// left: event.clientX + 'px',
// top: event.clientY + 'px'
// });
// last = event.timeStamp;
//});
$(document).click(function(event) {
var target = $(event.target);
if (!target.is(".popover") && !target.parents().is(".popover")) {
if (last === event.timeStamp)
return;
ul.css({
'display': 'none'
});
}
});
}
};
}
};
}
]);
})(window.angular);
查看(指令的)源代码,我认为这个上下文菜单指令有点太简单了。它只是在 context
属性引用的元素上触发 show/hide 而已。对于编写它的人的用例来说,它可能已经足够了,但对于通用解决方案来说,它似乎太轻了。
指令代码中发生了什么:如果您碰巧在同一行触发上下文菜单(或更一般地引用相同的上下文菜单),它会正常工作,因为它只会在不同的位置显示当前的上下文菜单地方。如果您首先触发 context1
,然后(通过单击第二行)触发不同的上下文菜单 context2
,则根本没有任何代码会触发 context1
上下文菜单的隐藏.
您也可以自己实施,但要跟踪所有已打开的上下文菜单,并在打开另一个菜单之前将其关闭。
顺便说一句:这个上下文菜单在 Firefox(38,Mac OS X)中对我不起作用。它打开上下文菜单并立即再次将其关闭。这可能是因为 contextmenu
(在 table 行上)和 click
(在文档上)都被触发了。
将 .click 事件更改为 .mouseup 事件,它将与 chrome 一起使用。
$(document).mouseup(function(event) {
var target = $(event.target);
if (!target.is(".popover") && !target.parents().is(".popover")) {
if (last === event.timeStamp)
return;
ul.css({
'display': 'none'
});
}
});
我遇到了同样的问题,它对我有用。 :)