Создайте мертвую зону в кликабельной области jQuery
С включенным jQuery, jQuery-ui и одной из тем пользовательского интерфейса (мне очень нравится легкость)
(потерпите меня, внизу есть вопрос, который вы можете пропустить, если хотите, просто хотел показать, как я туда попал)
(извините, если есть какие-то ошибки или биты, которые я пропустил в коде, он работает, но сокращал код для удобства чтения)
Я начал со стандартного предоставления draggable + Sortable проекта jQuery-UI:
// HTML
<div id="leftColumn">
<ul id="pageElements">
<li class="ui-state-default ui-corner-all" id="html">Html</li>
<li class="ui-state-default ui-corner-all" id="paragraph">Paragraph</li>
<li class="ui-state-default ui-corner-all" id="image">Image</li>
<li class="ui-state-default ui-corner-all" id="faq">FAQ</li>
</ul>
</div>
<div id="rightColumn">
<ul id="pageItems"></ul>
</div>
// JavaScript Code
$("#pageItems").sortable({
revert: true,
placeholder: 'ui-state-highlight',
tolerance: 'pointer'
});
$("#pageElements li").draggable({
connectToSortable: '#pageItems',
helper: 'clone',
revert: 'invalid'
});
Затем я начал хорошо думать, что было бы полезно добавить функцию dblclick, позволяющую перемещать элементы из одного списка в другой без необходимости перетаскивания, поэтому я добавил это:
$("#pageElements li").dblclick(function () {
copythis(this);
});
function copythis(elem) {
var selected = $(elem).closest("li").clone();
$("#pageItems").append(selected).html();
}
Тогда я подумал, хорошо, теперь я хочу dblclick на элементе страницы и показать диалог для редактирования
поэтому я добавил:
<div id="itemDialog"></div>
$("#itemDialog").dialog({ autoOpen: false, modal:true });
$("#pageItems li").live("dblclick", function () {
openDialog(this);
});
function openDialog(elem) {
$("#itemDialog").dialog('open');
}
Затем я подумал, что мне нужна кнопка, когда я наведу курсор на элемент, чтобы позволить мне удалить, и я мог бы также иметь там маршрут редактирования:
var removeButton = '<span class="buttons"><span class="ui-edit ui-state-default ui-corner-all ui-icon ui-icon-pencil" title="edit">Edit</span><span class="ui-remove ui-state-default ui-corner-all ui-icon ui-icon-closethick" title="remove">Remove</span></span>';
$("#pageItems li").live("mouseenter", function () { $(this).append(addButton); }).live("mouseleave", function () { $(this).find(".buttons").remove(); });
$(".ui-remove").live("click", function () { $(this).closest("li").remove(); });
$(".ui-edit").live("click", function () {
openDialog(this);
});
Так что теперь это было довольно функционально, я хотел добавить кнопку "добавить" к элементу pageElement, чтобы у меня было 3 варианта перетаскивания, dblclick и нажатие кнопки, поэтому добавьте код:
var addButton = '<span class="buttons"><span class="ui-add ui-state-default ui-corner-all ui-icon ui-icon-triangle-1-e" title="Add">Add</span></span>';
Используемый код со страницы Элемент li "hover" снова:
$("#pageElements li").live("mouseenter", function () { $(this).append(addButton); }).live("mouseleave", function () { $(this).find(".buttons").remove(); });
$(".ui-add").live("click", function () {
copythis(this);
});
Я изменил функцию копирования, чтобы включить кнопки:
function copythis(elem) {
var selected = $(elem).closest("li").clone();
selected.find(".buttons").remove();
$("#pageItems").append(selected).html();
}
И это то, где я сейчас нахожусь, и проблема, над которой я сейчас работаю.
Если вы щелкнете по элементу pageElement, он скопирует элемент (как и ожидалось).
Если вы нажмете кнопку добавления, которая также скопирует новый элемент (как и ожидалось).
поскольку событие pageElement dblclick присоединено к тегу pageElement li, а событие нажатия кнопки добавления находится на вложенном внутри него теге span, если я быстро нажимаю на кнопку добавления, иногда получаю событие dblclick, поэтому добавление нескольких элементов к список элементов страницы.
Я хочу создать мертвую зону для события dblclick, которая окружает элемент кнопки добавления.
Я открыт для любых идей.
ура
Люк
2 ответа
Итак, я нашел ответ, вероятно, не самый лучший, но он работает.
Это включает в себя определение глобальной переменной:
var clicked = 0;
Затем для события live пользовательского интерфейса установите значение 1, а затем установите тайм-аут, чтобы отложить сброс значения обратно до 0:
$(".ui-add").live("click", function () {
clicked = 1;
copythis(this);
setTimeout(function () { clicked = 0;}, 100);
});
Итак, на моей странице элемент dblclick:
$("#pageElements li").dblclick(function () {
if (clicked == 0) {
copythis(this);
}
});
Не идеально, но это работает.
Я знаю, что это далеко не полезно, но я бы посоветовал не слушать dblclick - это а) работает по-разному на разных клиентах - и jquery не маскирует все это, б) вы не хотите, чтобы ваш пользователь дважды щелкал, это сложно.