jquery ui 可拖动与上下文菜单冲突
在我的网站中,我右键单击某些内容,然后打开一个自定义上下文菜单,当我单击其中一个选项时,我打开一个弹出的 html div 元素,并向其中添加了 jquery ui 可拖动选项。
问题是,第一次拖动 div 时,它会粘在鼠标上,我需要再次单击才能使其粘在页面上。
我在我们上找到了一些有同样问题的答案,我知道它与上下文菜单插件冲突。我无法使用该插件,因为我需要它。
我可以做些什么来解决这个问题而不删除插件吗?
如何更改脚本才能停止冲突? 我不知道要更改什么...
上下文菜单的代码是这样的:
(function($) {
$.fn.contextMenu = function ( name, actions, options ) {
var me = this,
menu = $('<ul id="' + name + '" class="kcontextMenu kshadow"></ul>').hide().appendTo('body'),
activeElement = null, // last clicked element that responds with contextMenu
hideMenu = function() {
$('.kcontextMenu:visible').each(function() {
$(this).trigger("closed");
$(this).hide();
$('body').unbind('click', hideMenu);
});
},
default_options = {
disable_native_context_menu: false, // disables the native contextmenu everywhere you click
leftClick: false // show menu on left mouse click instead of right
},
options = $.extend(default_options, options);
$(document).bind('contextmenu', function(e) {
if (options.disable_native_context_menu) {
e.preventDefault();
}
hideMenu();
});
$.each(actions, function (me, itemOptions) {
newText = me.replace(/\s/g, "");
var menuItem = $('<li><a class="kdontHover" href="#" id="contextItem'+newText+'">'+me+'</a></li>');
if (itemOptions.klass) {
menuItem.attr("class", itemOptions.klass);
}
menuItem.appendTo(menu).bind('click', function(e) {
itemOptions.click(activeElement);
e.preventDefault();
});
});
return me.bind('contextmenu click', function(e){
// Hide any existing context menus
hideMenu();
if( (options.leftClick && e.button == 0) || (options.leftClick == false && e.button == 2) ){
activeElement = $(this); // set clicked element
if (options.showMenu) {
options.showMenu.call(menu, activeElement);
}
// Bind to the closed event if there is a hideMenu handler specified
if (options.hideMenu) {
menu.bind("closed", function() {
options.hideMenu.call(menu, activeElement);
});
}
menu.css({
visibility: 'hidden',
position: 'absolute',
zIndex: 1000000000
});
// include margin so it can be used to offset from page border.
var mWidth = menu.outerWidth(true),
mHeight = menu.outerHeight(true),
xPos = ((e.pageX - window.scrollX) + mWidth < window.innerWidth) ? e.pageX : e.pageX - mWidth,
yPos = ((e.pageY - window.scrollY) + mHeight < window.innerHeight) ? e.pageY : e.pageY - mHeight;
menu.show(0, function() {
$('body').bind('click', hideMenu);
}).css({
visibility: 'visible',
top: yPos + 'px',
left: xPos + 'px',
zIndex: 1000000000
});
return false;
}
});
}
})($);
我这样使用它:
$('input:text, input:password').rightClick(function (e) {
$(this).contextMenu('contextMenuInput', {
'Capture This': {
click: function (element) { // element is the jquery obj clicked on when context menu launched
},
klass: "kgo kdisabled" // a custom css class for this menu item (usable for styling)
},
'Create List': {
click: function (element) {
openDiv(element);
},
klass: "kfilter"
},
'Collect Data': {
click: function (element) {
},
klass: "kcapture kdisabled"
}
},
{ disable_native_context_menu: true }
);
});
然后我将其添加到我创建的 div 中:
$(newDiv).draggable({ handle: ".kformTilteDiv" });
我将不胜感激任何帮助。
谢谢
In my site i do a right click on something and i have a custom context menu opening, when i click one of the options i open a html div element that pops up and i added the jquery ui draggable option to it.
The problem is that the first time i drag the div it gets stuck to the mouse and i need to click again to make it stick to the page.
I found some answers on the we with the same problem, and i understood that it conflicts with the context menu plugin. I cant take of that plugin cuz i need it.
Is there any thing i can do to solve this problem with out removing the plugin?
How can the script be changed in order to stop the conflict?
I have no clue what to change...
The code for the context menu is this:
(function($) {
$.fn.contextMenu = function ( name, actions, options ) {
var me = this,
menu = $('<ul id="' + name + '" class="kcontextMenu kshadow"></ul>').hide().appendTo('body'),
activeElement = null, // last clicked element that responds with contextMenu
hideMenu = function() {
$('.kcontextMenu:visible').each(function() {
$(this).trigger("closed");
$(this).hide();
$('body').unbind('click', hideMenu);
});
},
default_options = {
disable_native_context_menu: false, // disables the native contextmenu everywhere you click
leftClick: false // show menu on left mouse click instead of right
},
options = $.extend(default_options, options);
$(document).bind('contextmenu', function(e) {
if (options.disable_native_context_menu) {
e.preventDefault();
}
hideMenu();
});
$.each(actions, function (me, itemOptions) {
newText = me.replace(/\s/g, "");
var menuItem = $('<li><a class="kdontHover" href="#" id="contextItem'+newText+'">'+me+'</a></li>');
if (itemOptions.klass) {
menuItem.attr("class", itemOptions.klass);
}
menuItem.appendTo(menu).bind('click', function(e) {
itemOptions.click(activeElement);
e.preventDefault();
});
});
return me.bind('contextmenu click', function(e){
// Hide any existing context menus
hideMenu();
if( (options.leftClick && e.button == 0) || (options.leftClick == false && e.button == 2) ){
activeElement = $(this); // set clicked element
if (options.showMenu) {
options.showMenu.call(menu, activeElement);
}
// Bind to the closed event if there is a hideMenu handler specified
if (options.hideMenu) {
menu.bind("closed", function() {
options.hideMenu.call(menu, activeElement);
});
}
menu.css({
visibility: 'hidden',
position: 'absolute',
zIndex: 1000000000
});
// include margin so it can be used to offset from page border.
var mWidth = menu.outerWidth(true),
mHeight = menu.outerHeight(true),
xPos = ((e.pageX - window.scrollX) + mWidth < window.innerWidth) ? e.pageX : e.pageX - mWidth,
yPos = ((e.pageY - window.scrollY) + mHeight < window.innerHeight) ? e.pageY : e.pageY - mHeight;
menu.show(0, function() {
$('body').bind('click', hideMenu);
}).css({
visibility: 'visible',
top: yPos + 'px',
left: xPos + 'px',
zIndex: 1000000000
});
return false;
}
});
}
})($);
And i use it like this:
$('input:text, input:password').rightClick(function (e) {
$(this).contextMenu('contextMenuInput', {
'Capture This': {
click: function (element) { // element is the jquery obj clicked on when context menu launched
},
klass: "kgo kdisabled" // a custom css class for this menu item (usable for styling)
},
'Create List': {
click: function (element) {
openDiv(element);
},
klass: "kfilter"
},
'Collect Data': {
click: function (element) {
},
klass: "kcapture kdisabled"
}
},
{ disable_native_context_menu: true }
);
});
And then i add this to the div i created:
$(newDiv).draggable({ handle: ".kformTilteDiv" });
I will appreciate any help.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
许多 JavaScript 库使用 $ 作为函数或变量名,就像 jQuery 一样。在 jQuery 中,$ 只是 jQuery 的别名,因此所有功能都可以在不使用 $ 的情况下使用。如果我们需要与 jQuery 一起使用另一个 JavaScript 库,我们可以通过调用 jQuery.noConflict(); 将 $ 的控制权返回给另一个库;
请参阅此处的示例:
Many JavaScript libraries use $ as a function or variable name, just as jQuery does. In jQuery’s case, $ is just an alias for jQuery, so all functionality is available without using $. If we need to use another JavaScript library alongside jQuery, we can return control of $ back to the other library with a call to jQuery.noConflict();
see example here :
我使用这个答案找到了解决方案
链接
我有另一个插件导致冲突的右键单击事件,就像那个答案
I found the solution using this answer
Link
I had another plugin for the right click event that was causing the conflict, like that answer