javascript - 双击元素的问题

标签 javascript jquery html css jquery-ui

我有运行脚本,通过双击将 tr 元素从一个容器移动到另一个容器。但是我有以下提到的问题:

1) 如果我们快速双击元素而不是它移动但它的值没有出现,它会显示空标签。
2)我想在双击时更改背景颜色,当我们点击外部或其他元素时,它的颜色应该被移除。

enter image description here

<script>
    $(function () {
        function initTabelMgmt() {
            selectInvitees();
            moveSelectedInvitees();
            deleteInvitees();
            //scrollOpen();
        }
        var tmContainer = $("div.cv-tm-body");
        var toggleAssignBtn = tmContainer.find('.cv-move-items button');
        /*
        function scrollOpen() {
            var position = $('div.cv-item li.open').first().position();
            var offsetTop = $('div.cv-tm-col-r .cv-helper-grid-overflow').scrollTop();
            var unitHeight = $('div.cv-item li.open').first().height();
            var containerHeight = $('div.cv-tm-col-r .cv-helper-grid-overflow').height();
            var scrollAmount = offsetTop + position.top;


            if ((offsetTop - position.top) <= 0 && (offsetTop - position.top) >= (-containerHeight + unitHeight)) {

                //do nothing
            } else {  
                $('div.cv-tm-col-r .cv-helper-grid-overflow').animate({
                    scrollTop: scrollAmount

                });

            }
        };
        */
        // scrollOpen end
        function selectInvitees() {
            //select items from invitee list
            var startIndex, endIndex;
            var dbclick = false;
            tmContainer.find("table.cv-invitees").on('click', 'tr', function (e) {

                var row = $(this);
                setTimeout(function () {
                    //singleclick functionality start.
                    if (dbclick == false) {
                        if (!row.is('.assigned')) {
                             toggleAssignBtn.removeClass('is-disabled');
                            if (e.shiftKey) {
                                row.parents('.cv-invitees').find('tr').removeClass('selected');
                                endIndex = row.parents('.cv-invitees').find('tr').index(this);
                                var range = row.closest('table').find('tr').slice(Math.min(startIndex, endIndex), Math.max(startIndex, endIndex) + 1).not('.assigned');
                                range.addClass('selected');
                            } else if (e.ctrlKey) {
                                startIndex = row.parents('.cv-invitees').find('tr').index(this);
                                row.toggleClass('selected');
                            } else {
                                startIndex = row.parents('.cv-invitees').find('tr').index(this);
                                row.parents('.cv-invitees').find('tr').not(this).removeClass('selected');
                                row.toggleClass('selected');
                            }
                        }
                    }
                }, 200)
            })
                .dblclick(function () {
                    dbclick = true
                    //doubleclick functionality start.
                    toggleAssignBtn.addClass('is-disabled');
                    function moveSelectedInviteesDBClick() {
                         var row = tmContainer.find("table.cv-invitees tr.selected");

                        if (!row.is('.assigned')) {
                            var allOpenSeat = $('.cv-item .open');
                            var numberOpen = allOpenSeat.length;
                            var name = row.find("td").eq(0).text();;
                            var company = row.find("td").eq(1).text();
                            var addedInvitees = [];

                            allOpenSeat.each(function (index) {
                                if (index < 1) {
                                    var openSeat = $(this);
                                    openSeat.find('.name').text(name);
                                    if (company != '') {
                                        openSeat.find('.company').addClass('show').text(company);
                                    }
                                    var seatAssignment = new Object();
                                    seatAssignment.company = "";
                                    addedInvitees.push(seatAssignment);
                                    openSeat.removeClass('open');
                                }
                                row.remove();
                            });
                        }
                    } // moveSelectedInviteesDBClick
                    moveSelectedInviteesDBClick();
                    setTimeout(function () {
                        dbclick = false
                    }, 300)
                });
        } // selectInvitees end

        function moveSelectedInvitees() {
            //move invitees from left to right
            tmContainer.find('button.cvf-moveright').click(function () {
                var selectedItem = $('.cv-invitees .selected');
                var allOpenSeat = $('.cv-item .open');
                var numberSelected = selectedItem.length;
                var numberOpen = allOpenSeat.length;
                var errorMsg = tmContainer.prev('.cv-alert-error');
                if (numberSelected > numberOpen) {
                    errorMsg.removeClass('is-hidden');
                } else {
                    var name;
                    var company;
                    var invitee = [];
                    var selectedInvitees = [];
                    var count = 0;
                    selectedItem.each(function () {
                        var $this = $(this);
                        name = $this.find("td").eq(0).text();
                        company = $this.find("td").eq(1).text();
                        invitee = [name, company];
                        selectedInvitees.push(invitee);
                        count = count + 1;
                        i = 0;
                        $this.remove();
                    });
                    var addedInvitees = [];
                    var items = $('div.cv-item li');
                    var seatItems = $('div.cv-order li');
                    allOpenSeat.each(function (index) {
                        if (index < count) {
                            var openSeat = $(this);
                            openSeat.find('.name').text(selectedInvitees[index][0]);
                            if (selectedInvitees[index][1] != '') {
                                openSeat.find('.company').addClass('show').text(selectedInvitees[index][1]);
                            }
                            var seatAssignment = new Object();
                            seatAssignment.company = "";
                            addedInvitees.push(seatAssignment);
                            //selectedInvitees.shift();
                            openSeat.removeClass('open');
                        }
                    });
                    selectedInvitees = [];
                }
                toggleAssignBtn.addClass('is-disabled');
            });
        } // moveSelectedInvitees end

        function deleteInvitees() {
            //move invitees from left to right
            tmContainer.find('div.cv-tm-col-r .cv-icon-remove').click(function () {
                //delete seat assignment
                var icon = $(this);
                var idx = $('.ui-sortable li').index(icon.parent());
                icon.parent().fadeTo(0, 0).addClass('open').find('.name').text('Open').end().fadeTo(750, 1);
                icon.parent().find('.company').removeClass('show').text('');
                // icon.parent().find('.entitystub').text('00000000-0000-0000-0000-000000000000');
                // icon.parent().find('.entitytype').text('0');
                // icon.parent().find('.pipe').remove();
                // icon.hide();
                //  var testSeat = $('.seat-numbers li').get(idx);
                //var seatStub = j$.trim(j$(testSeat).find('.seatstub').text());
                //var input = { 'seatStub': seatStub };
                //AssignSeats(input, "/Subscribers/WS/SeatAssignmentService.asmx/DeleteRegistrant");
            });
        }
        initTabelMgmt();
    }); // document.ready end

    </script>

最佳答案

您的代码看起来很不错。您还应该使用 native 方法 .click(...) 从 jQuery 注册单击事件。所以请更改以下行

tmContainer.find("table.cv-invitees").on('click', 'tr', function (e) {

收件人:

tmContainer.find("table.cv-invitees").click(function (e) {

一切都应该工作正常。由于一些奇怪的原因,函数

$("#someelement").on("click", ...);

并不总是有效,只是有时有效。由于这种奇怪的行为,JQuery 官方建议您对预定义事件(例如 onclick、onkeyup、onchange 等)使用 native 函数。

编辑: 如果 dblick 现在不工作,请制作 2 行,如下所示:

tmContainer.find("table.cv-invitees").click(function (e) {
// [...]
;
tmContainer.find("table.cv-invitees").dbclick(function (e) {
// [...]

编辑2: 如果它也不起作用,那么请在您处于 .click() 闭包时移除单击事件监听器。因为如果发生这种情况,jQuery 的行为是始终将其视为单击。所以,换句话说,dblick() 将永远不会被触发,因为 .click() 总是会在之前发生。然后 jQuery 不会计算最多 2 次快速点击。期待意外^^

Edit3:这是完整的代码,希望它现在可以正常工作:

$(function ()
  {
    function initTabelMgmt()
    {
        selectInvitees();
        moveSelectedInvitees();
        deleteInvitees();
        //scrollOpen();
    }
    var tmContainer = $("div.cv-tm-body");
    var toggleAssignBtn = tmContainer.find('.cv-move-items button');
    var iClickCounter = 0;
    var dtFirstClick, dtSecondClick;
    /*
    function scrollOpen() {
        var position = $('div.cv-item li.open').first().position();
        var offsetTop = $('div.cv-tm-col-r .cv-helper-grid-overflow').scrollTop();
        var unitHeight = $('div.cv-item li.open').first().height();
        var containerHeight = $('div.cv-tm-col-r .cv-helper-grid-overflow').height();
        var scrollAmount = offsetTop + position.top;


        if ((offsetTop - position.top) <= 0 && (offsetTop - position.top) >= (-containerHeight + unitHeight)) {

            //do nothing
        } else {  
            $('div.cv-tm-col-r .cv-helper-grid-overflow').animate({
                scrollTop: scrollAmount

            });

        }
    };
    */
    // scrollOpen end
    function selectInvitees()
    {
        //select items from invitee list
        var startIndex, endIndex;
        var dbclick = false;
        tmContainer.find("table.cv-invitees").click(function(e)
                                                 {
                                                    iClickCounter++;
                                                    if (iClickCounter === 1)
                                                    {
                                                        dtFirstClick = new Date();
                                                        var row = $(this);
                                                        window.setTimeout(function ()
                                                                        {
                                                                            //singleclick functionality start.
                                                                            if (dbclick == false)
                                                                            {
                                                                                if (!row.is('.assigned'))
                                                                                {
                                                                                     toggleAssignBtn.removeClass('is-disabled');
                                                                                    if (e.shiftKey)
                                                                                    {
                                                                                       row.parents('.cv-invitees').find('tr').removeClass('selected');
                                                                                       endIndex = row.parents('.cv-invitees').find('tr').index(this);
                                                                                       var range = row.closest('table').find('tr').slice(Math.min(startIndex, endIndex), Math.max(startIndex, endIndex) + 1).not('.assigned');
                                                                                       range.addClass('selected');
                                                                                    }
                                                                                    else if (e.ctrlKey)
                                                                                    {
                                                                                       startIndex = row.parents('.cv-invitees').find('tr').index(this);
                                                                                       row.toggleClass('selected');
                                                                                    }
                                                                                    else
                                                                                    {
                                                                                       startIndex = row.parents('.cv-invitees').find('tr').index(this);
                                                                                       row.parents('.cv-invitees').find('tr').not(this).removeClass('selected');
                                                                                       row.toggleClass('selected');
                                                                                    }
                                                                                }
                                                                            }
                                                                        },
                                                                        200);
                                                    }
                                                    else if (iClickCounter === 2)
                                                    {
                                                        dtSecondClick = new Date();
                                                    }
                                                    else if (iClickCounter === 3)
                                                    {
                                                        if (dtSecondClick.getTime() - dtFirstClick.getTime() < 1000)
                                                        {
                                                            return;
                                                        }

                                                        iClickCounter = 0;
                                                        dbclick = true
                                                        //doubleclick functionality start.
                                                        toggleAssignBtn.addClass('is-disabled');
                                                        function moveSelectedInviteesDBClick()
                                                        {
                                                            var row = tmContainer.find("table.cv-invitees tr.selected");

                                                            if (!row.is('.assigned'))
                                                            {
                                                                var allOpenSeat = $('.cv-item .open');
                                                                var numberOpen = allOpenSeat.length;
                                                                var name = row.find("td").eq(0).text();;
                                                                var company = row.find("td").eq(1).text();
                                                                var addedInvitees = [];

                                                                allOpenSeat.each(function (index)
                                                                                 {
                                                                                    if (index < 1)
                                                                                    {
                                                                                        var openSeat = $(this);
                                                                                        openSeat.find('.name').text(name);
                                                                                        if (company != '') {
                                                                                            openSeat.find('.company').addClass('show').text(company);
                                                                                        }
                                                                                        var seatAssignment = new Object();
                                                                                        seatAssignment.company = "";
                                                                                        addedInvitees.push(seatAssignment);
                                                                                        openSeat.removeClass('open');
                                                                                    }
                                                                                    row.remove();
                                                                                }
                                                                );
                                                            }
                                                        }
                                                        // moveSelectedInviteesDBClick
                                                        moveSelectedInviteesDBClick();
                                                        window.setTimeout(function ()
                                                                        {
                                                                            dbclick = false
                                                                        }, 300);
                                                    }
                                                }
                                            );
    } // selectInvitees end

    function moveSelectedInvitees()
    {
        //move invitees from left to right
        tmContainer.find('button.cvf-moveright').click(function ()
                                                       {
                                                            var selectedItem = $('.cv-invitees .selected');
                                                            var allOpenSeat = $('.cv-item .open');
                                                            var numberSelected = selectedItem.length;
                                                            var numberOpen = allOpenSeat.length;
                                                            var errorMsg = tmContainer.prev('.cv-alert-error');
                                                            if (numberSelected > numberOpen) {
                                                                errorMsg.removeClass('is-hidden');
                                                            }
                                                            else
                                                            {
                                                                var name;
                                                                var company;
                                                                var invitee = [];
                                                                var selectedInvitees = [];
                                                                var count = 0;
                                                                selectedItem.each(function () {
                                                                    var $this = $(this);
                                                                    name = $this.find("td").eq(0).text();
                                                                    company = $this.find("td").eq(1).text();
                                                                    invitee = [name, company];
                                                                    selectedInvitees.push(invitee);
                                                                    count = count + 1;
                                                                    i = 0;
                                                                    $this.remove();
                                                                });
                                                                var addedInvitees = [];
                                                                var items = $('div.cv-item li');
                                                                var seatItems = $('div.cv-order li');
                                                                allOpenSeat.each(function (index)
                                                                                 {
                                                                                    if (index < count)
                                                                                    {
                                                                                        var openSeat = $(this);
                                                                                        openSeat.find('.name').text(selectedInvitees[index][0]);
                                                                                        if (selectedInvitees[index][1] != '')
                                                                                        {
                                                                                            openSeat.find('.company').addClass('show').text(selectedInvitees[index][1]);
                                                                                        }
                                                                                        var seatAssignment = new Object();
                                                                                        seatAssignment.company = "";
                                                                                        addedInvitees.push(seatAssignment);
                                                                                        //selectedInvitees.shift();
                                                                                        openSeat.removeClass('open');
                                                                                    }
                                                                                }
                                                                );
                                                                selectedInvitees = [];
                                                            }
                                                            toggleAssignBtn.addClass('is-disabled');
                                                        }
                                                );
    } // moveSelectedInvitees end

    function deleteInvitees()
    {
        //move invitees from left to right
        tmContainer.find('div.cv-tm-col-r .cv-icon-remove').click(function ()
                                                                  {
                                                                    //delete seat assignment
                                                                    var icon = $(this);
                                                                    var idx = $('.ui-sortable li').index(icon.parent());
                                                                    icon.parent().fadeTo(0, 0).addClass('open').find('.name').text('Open').end().fadeTo(750, 1);
                                                                    icon.parent().find('.company').removeClass('show').text('');
                                                                    // icon.parent().find('.entitystub').text('00000000-0000-0000-0000-000000000000');
                                                                    // icon.parent().find('.entitytype').text('0');
                                                                    // icon.parent().find('.pipe').remove();
                                                                    // icon.hide();
                                                                    //  var testSeat = $('.seat-numbers li').get(idx);
                                                                    //var seatStub = j$.trim(j$(testSeat).find('.seatstub').text());
                                                                    //var input = { 'seatStub': seatStub };
                                                                    //AssignSeats(input, "/Subscribers/WS/SeatAssignmentService.asmx/DeleteRegistrant");
                                                                }
                                                            );
    }
    initTabelMgmt();
}
); // document.ready end

我猜你在你的特殊情况下将双击解释为在同一个表条目上单击了 3 次。如果用户这样做并且第一次和第二次点击之间的时间差超过一秒,则会触发双击。我认为应该是处理这种特殊情况的解决方案。

编辑 4:请测试,是否可以单击 3 个不同的表格列并同时触发双击。我认为这对我的代码处理双击的方式不利。因此,您需要知道您已经从哪个表格列设置了 1 到 3 次点击。我们应该怎么做?基本上,有 3 种可能性可以做到这一点:

  1. (仅限 HTML5:)在每个 tr 上创建数据属性以及该数据属性的值 应该是已经点击此 tr 的点击。
  2. 定义一个全局对象键/值对对象,它保存 事件 ID(但我不知道如何通过 jQuery 驱动来恢复它 事件)作为键,已经完成的点击量作为 值(value)。然后如果你在下一次点击,你可以决定什么是 现在为这个 tr 做。这是我最喜欢的选择!
  3. 最后但同样重要的是:只在每个 tr 和 为每次点击注册一个自己的全局区域,这样我们就 避免实际问题。你可以做到这一点。 G。通过制作一个 JS 持有一个成员变量作为 iclickCounter 的对象,你 新建一个这个类的对象,每次都有一个新的点击事件 挂号的。但这种替代方案需要更多代码,并且非常耗费主内存。

所有这些可能的选项都需要环绕您的点击事件,例如。 G。一个循环,遍历给定表中的所有 tr 元素。您已经通过调用 jQuery 函数 .find(..) 部分地完成了这项工作。这会在每个找到的 html 元素上执行闭包。因此,在您的情况下,搜索表中的所有 tr 元素。但是您需要做的是解决我上面给出的选项之一。

关于javascript - 双击元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21163009/

相关文章:

javascript - 在 JavaScript 中检索 innerHTML 的输入值在 IE 9 及更高版本中无法正常工作

javascript - react-native async 函数返回 promise 但不是我的 json 数据?

javascript - 如何在 Html 5 Canvas 中绘制倾斜的矩形?

html - 如何在考虑周围空间的情况下将弹性盒的最后一个元素向右对齐?

javascript - 如何知道 HTML 音频/视频元素在循环时已结束

javascript - 数组在 res.json() 中为空,但在 res.json() 调用之前和之后都存在

javascript - 使用 radio 输入和 knockoutjs 选择客户地址

jquery 复选框已选中

javascript - jQuery 解除绑定(bind)后如何绑定(bind)?

html - 从托管(文件管理器)目录中的 index.html 链接页面