我们可以使JQuery UI可拖动/可排序在右鼠标按钮上工作

我有一个页面,其function绑定到鼠标左键和右键,即。 鼠标左键可拖动/可排序,鼠标右键可自定义上下文菜单。

我想要做的是切换function,以便上下文菜单在鼠标左键单击时工作,JQuery UI Draggable / Sortable在鼠标右键单击时工作。

谢谢你的帮助。

PS:我可以使自定义上下文菜单在鼠标左键上工作。 所以我只需要帮助JQuery UI Draggable / Sortable。 谢谢。

除了创建jQuery UI的自定义构建和直接修改文件之外,您还可以扩展draggable(并且可以排序,如果需要),以允许鼠标右键单击。 jQuery UI中的所有鼠标交互都由Mouse Widget($ .ui.mouse)处理。 可拖动小部件正在扩展鼠标小部件。 简而言之,draggable具有与鼠标完全相同的方法。 如果您覆盖可拖动原型($ .ui.draggable.prototype)上的那些,那么您可以在所有可拖动对象上获得您的function,而无需修改jQuery UI文件。

直接修改第三方框架通常不是一个好主意,因为它会阻止您升级,或者每次升级时都要求您复制更改。

主要思想是覆盖一些function:

$.extend($.ui.draggable.prototype, {...}); 

这是修改后的draggable的一个工作示例: http : //jsfiddle.net/NjXdv/4/它需要一个额外的参数:mouseButton。 如果你没有传递任何内容,它将使用鼠标左键。 如果你输入3,它将使用鼠标右键。 您也可以尝试传递2作为中键。

PS这将停止上下文菜单仅打开您关注的元素,而不是在整个页面上禁用它。

更新:

如果你想让所有jQuery UI控件都能够使用不同的鼠标按钮,那么你应该扩展鼠标本身,而不是扩展draggable。 正如我之前所说,每个jQuery UI控件都会从$ .ui.mouse中读取鼠标事件,因此如果你覆盖它,它将级联到每个控件。 这是可排序和可拖动的更新示例: http : //jsfiddle.net/NjXdv/7/ 。 希望这可以帮助。

实际上如果不破解jQuery UI代码是不可能的。

我不知道你为什么要使用这种行为,因为可能会混淆你的最终用户,但这是一个可能的解决方案。

从这个jQuery UI票证http://bugs.jqueryui.com/ticket/6909开始,我构建了一个自定义版本的jQuery UI。 所以你必须使用库的修改版本。

我禁用浏览器右键单击整个页面的默认菜单:

  

或指特定元素:

 $("#sortable").bind("contextmenu",function(e){ return false; }); 

以下是jQuery UI代码的两个主要自定义编辑。

ui.mouse默认选项中添加选项:

其中:1

从jQuery UI参考:

其中(编号)默认值:1

与“which”事件属性匹配的数字,表示按下的鼠标按钮。 (0 =任意按钮,1 =左按钮,2 =中按钮,3 =右按钮)

在函数_mouseDown更改代码以读取此选项:

 tnIsLeft = (event.which == this.options.which) // instead of this (event.which == 1) 

理论上,在jQuery UI的未来版本中,这将得到支持,没有任何黑客攻击。

这是一个工作小提琴: http : //jsfiddle.net/IrvinDominin/nLdLu/

编辑

下面是一个带右键单击mod的pastebin版本,包括:

  • 包括:jquery.ui.core.js,jquery.ui.widget.js,jquery.ui.mouse.js,jquery.ui.position.js,jquery.ui.draggable.js,jquery.ui.droppable.js, jquery.ui.resizable.js,jquery.ui.selectable.js,jquery.ui.sortable.js

链接: http : //pastebin.com/nn3Pj0pM

通常修改副本不是一件好事,你也可以扩展和覆盖让鼠标右键工作所需的两个function,但主要问题仍然存在:如果你升级jQuery UI,你必须检查兼容性或将你的mod移植到更新的版。 对于我所看到的,jQuery UI 2.x将支持which实现。

希望这可以帮助。

来自JQuery Ui核心文件

 $.extend( $.ui, { version: "1.8.23", keyCode: { ALT: 18, BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, COMMAND: 91, COMMAND_LEFT: 91, // COMMAND COMMAND_RIGHT: 93, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT: 45, LEFT: 37, MENU: 93, // COMMAND_RIGHT NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38, WINDOWS: 91 // COMMAND } }); 

如果我们交换LEFT和RIGHT的键码,那么它可能会工作..

试试这个:

 $('#element').mousedown(function(event) { if(event.which == 1) { $('#element').draggable(); $('#element').sortable(); } else if (event.which == 3) { // context menu functions } });