在jQuery可点击区域内创建死区

时间:2010-07-28 12:02:43

标签: jquery jquery-ui click double-click

包含jQueryjQuery-ui和其中一个ui主题(我非常喜欢lightness

(请跟我说,底部有一个问题,如果你愿意,可以跳过去,只是想表明我是怎么到达的地方)

(对不起,如果我在代码中遗漏了任何错误或错误,它确实有效,但是为了便于阅读而削减了代码)

我开始使用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();
}

然后我认为好了,现在我想在pageItem上进行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中添加一个“add”按钮,这样我就可以选择3个drag,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>';

再次使用来自pageItem li“live hover”的代码:

$("#pageElements li").live("mouseenter", function () { $(this).append(addButton); }).live("mouseleave", function () { $(this).find(".buttons").remove(); });

$(".ui-add").live("click", function () {
    copythis(this);
});

我修改了copythis函数以允许包含按钮:

function copythis(elem) {
    var selected = $(elem).closest("li").clone();
    selected.find(".buttons").remove();
    $("#pageItems").append(selected).html();
}

这就是我现在所处的位置以及我目前正在处理的问题。

如果你dblclick pageElement,那将复制元素(如预期的那样)。

如果单击添加按钮,该按钮也将复制新元素(按预期方式)。

因为pageElement dblclick事件附加到pageElement li标记,并且添加按钮单击事件位于嵌套在其中的span标记上,如果我快速单击添加按钮,有时我将获取dblclick事件,因此添加了多个pageItem列表中的一个元素。

我要做的是为包含添加按钮项的dblclick事件创建一个死区。

我对任何想法持开放态度。

干杯

2 个答案:

答案 0 :(得分:0)

我知道它远非有用,但我建议不要听dblclick - 它是a)在不同的客户端中工作方式不同 - 而jquery不会掩盖所有这些,b)你不希望你的用户双击,这很复杂。

答案 1 :(得分:0)

好的,所以我找到了答案,可能不是最好的,但它确实有效。

它涉及定义全局变量:

var clicked = 0;

然后在ui-add的live事件中将值设置为1,然后设置超时以将值的重置延迟回0:

    $(".ui-add").live("click", function () {
        clicked = 1;
        copythis(this);
        setTimeout(function () { clicked = 0;}, 100);
    });

然后在我的pageElement dblclick函数:

    $("#pageElements li").dblclick(function () {
        if (clicked == 0) {
            copythis(this);
        }
    });

不理想,但有效。