Можно ли использовать событие onblur для сортировки Jeditable и jQuery UI? - PullRequest
5 голосов
/ 08 марта 2012

Я использую сортируемое взаимодействие jQuery UI и Jeditable .Идея заключается в том, что пользователь может переупорядочивать элементы и влиять на содержимое этих элементов.Я сталкиваюсь с тем, что onblur event, который у меня есть для настройки Jeditable, прослушивается сортируемым слушателем jQuery.

Пользователь может щелкнуть элемент Jeditable, и этот элемент станет редактируемым, но когдаони щелкают, если они нажимают на li, который сортируется, событие onblur игнорируется.Событие не игнорируется, если они щелкают за пределами li.Как я могу сообщить Jeditable о событии размытия, когда они щелкают внутри li?

Вот jsFiddle, иллюстрирующий проблему

Разметка 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>

Jeditable

$('.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. Нажмите Some Text
  2. Нажмите li, содержащий TEXT!
  3. Отпустите, нажмите TEXT!

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

На данный момент я ничего не переупорядочил.Нажатие на li и отпускание не вызвали onblur для Jeditable.Я хотел бы, чтобы простой щелчок убрал, чтобы вызвать onblur.Если я не подключу сортируемое, вот как это работает.Я должен верить, что каким-то образом щелчок на li поглощается сортируемым.

Вот еще один пример с переупорядочением, но по-прежнему нет onblur.

  1. Нажмите Some Text
  2. Нажмите li содержащий TEXT!
  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!

После переупорядочения элементов и освобождения li, содержащего TEXT!, onblur не захватывается.Элементы находятся в новом порядке, но Some Text все еще находится в редактируемом состоянии.

Все, что здесь сказано, это то, что я ожидаю:Нажатие на что-либо за пределами поля, редактируемого в данный момент, должно вызвать срабатывание onblur Jeditable.Что именно и происходит, если сортировка jQuery не подключена.Когда сортировка jQuery связана с поведением onblur, я должен щелкнуть за пределами элементов списка сортировки.

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

Копано в Исходный код Jeditable с целью его изменения. При чтении натолкнулся на недокументированные перехватчики событий, которые имели все значение:

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, показывающий работающую реализацию отключения сортируемых файлов и последующего их включения .

Я не люблю это решение, но пока достаточно. Я предпочел бы, чтобы onblur не был поглощен пользовательским интерфейсом jQuery. Однако, чтобы это исправить, потребуется намного больше написания кода, чем мне сейчас хочется.

0 голосов
/ 09 марта 2012

Это не значит, что я не могу дать окончательный ответ, и я не собираюсь давать здесь слово "принят" ... слишком много текста для комментария.

Я верю, что вы правы в своемпервое предположение - событие проглатывается.Если вы посмотрите на sortable API, вы увидите, что он расширяется до onblur, подразделяя события на серию более детальных событий, которые могут иметь собственные обратные вызовы.Я ни в коем случае не удивлюсь, если копание в этом коде покажет, что исходное событие не может всплыть из-за чего-то, возможно, такого простого, как preventDefault или returnFalse в собственной логике обработчика событий сортируемого объекта.

Или, может быть, когда вы перетаскиваете сортируемый элемент, вы перетаскиваете какой-то клон, визуальную копию LI, которая не содержит никаких реальных обработчиков событий.Это просто мысль ... опять же, пространство для комментариев слишком ограничено.

Кажется, сейчас тоже не получается загрузить скрипку, поэтому я не могу обойтись и доказать какие-либо концепции, но мне интересно, если выМожет ли непосредственное вмешательство с обработчиками sortable преднамеренно вызвать размытие элемента?Или, что еще лучше, выясните, какая функция jEditable запускается при размытии, и обойдите размытие, чтобы активировать эту функцию в конце функции сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...