jquery - onblur 事件可以与 Jeditable 和 jQuery UI sortable 一起使用吗?

标签 jquery jquery-ui jquery-ui-sortable jeditable

我正在使用jQuery UI sortable interactionJeditable 。这个想法是用户可以重新排序元素并影响这些元素的内容。我遇到的是,我有 Jeditable 设置来监听的 onblur 事件 被 jQuery 可排序监听器吞没。

用户可以单击 Jeditable 元素,该元素将变得可编辑,但是当他们单击可排序的 li 时,onblur 事件将被忽略。如果他们在 li 之外单击,该事件不会被忽略。当 Jeditable 在 li 内单击时,如何让 Jeditable 知道模糊事件?

这是一个jsFiddle illustrating the problem

HTML 标记

<ul class="elementlist">
    <li id="elementSk_10">
        <span class="editable-element" id="10">TEXT!</span>
    </li>
    <li id="elementSk_33">
        <span class="editable-element" id="33">Some text</span>
    </li>
</ul>

可编辑

$('.editable-element').editable('http://jsfiddle.net/echo/jsonp/', {
    onblur: 'submit',
    width: 250,
    indicator: 'Saving...'
});

jQuery UI 可排序

$(".elementlist").sortable({
    update: function(event, ui) {
        var elementSerialized = $(this).sortable('serialize');
        $.post('http://jsfiddle.net/echo/jsonp/', {
            elementSk: $(this).sortable('serialize')
        });
    }
});​
<小时/>

编辑: 为了弄清楚发生了什么,让我一步一步地演练并附上屏幕截图。

  1. 点击一些文本
  2. 点击包含 TEXT!li
  3. 松开文本!

screenshot of clicking on Some Text screenshot of clicking on li TEXT!

目前我还没有重新订购任何东西。单击 li 并释放并未触发 Jeditable 的 onblur。我想要简单的点击 Action 来触发onb​​lur。如果我不连接可排序,这就是它的工作原理。我不得不相信 li 上的点击不知何故被排序吞噬了。

<小时/>

这是另一个重新排序的示例,但仍然没有 onblur

  1. 点击一些文本
  2. 点击包含 TEXT!li
  3. TEXT!移动到Some Text下方
  4. 释放TEXT!

screenshot of clicking on Some Text screenshot of clicking on li TEXT! screenshot of release of li containing TEXT!

对元素重新排序并释放包含 TEXT!li 后,不会捕获 onblur。元素处于新顺序,但Some Text 仍处于可编辑状态。

这里所说的一切都是我期望发生的事情:
单击当前正在编辑的字段之外的任何内容都会导致 Jeditable 的 onblur 触发。如果未连接 jQuery 可排序,这正是发生的情况。当 jQuery 可排序连接导致 onblur 行为时,我必须在可排序列表元素之外单击。

最佳答案

深入了解Jeditable source code并有意修改它。在阅读中遇到了一些未记录的事件 Hook ,这些 Hook 使一切变得不同:

var onedit   = settings.onedit   || function() { }; 
var onsubmit = settings.onsubmit || function() { };
var onreset  = settings.onreset  || function() { };

利用这些,我可以禁用然后重新启用可排序:

var disableSortable = function(settings, self) {
    $(".elementlist").sortable('disable');
};

var enableSortable = function(settings, self) {
    $(".elementlist").sortable('enable');
};

$('.editable-element').editable('http://jsfiddle.net/echo/jsonp/', {
    onblur: 'submit',
    width: 250,
    indicator: 'Saving...',
    onedit: disableSortable,
    onsubmit: enableSortable,
    onreset: enableSortable
});

$(".elementlist").sortable({
    update: function(event, ui) {
        var elementSerialized = $(this).sortable('serialize');
        $.post('http://jsfiddle.net/echo/jsonp/', {
            elementSk: $(this).sortable('serialize')
        });
    }
});​

当用户按 ESC 时,我必须重新启用重置和提交;这会重置表单而不是提交表单。这是 jsFiddle showing a working implementation of disabling the sortables and then reenabling them .

我不喜欢这个解决方案,但目前它已经足够好了。我不希望 onblur 被 jQuery UI 可排序吞没。不过,要解决这个问题,需要比我现在想做的更多的代码探索。

关于jquery - onblur 事件可以与 Jeditable 和 jQuery UI sortable 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610041/

相关文章:

javascript - 分配和删除点击事件

jquery - 如何使用 jQuery 在当前元素上应用 CSS 类

javascript - 无法加载资源 : the server responded with a status of 404 (Not Found) with nodejs

jquery-ui - 即使使用标记为 JQuery UI map 定义不同的默认缩放

jquery-ui - jquery sortable inside angular指令错过了第一次点击

php - Jquery DataTables 可排序距离列

javascript - 使用 rubaxa 进行可排序的 Javascript

javascript - 如何让按钮在 F 和 C 之间切换?

jquery - 每次我使用 $.(class).loaded(); 时,我图片上的标题都会错位

javascript - 如何根据浏览器语言设置 Jquery UI Datepicker 日期格式?