资讯专栏INFORMATION COLUMN

使用dataTables组件制作可编辑table单元格时blur、 mouseleave以及mous

MadPecker / 2273人阅读

摘要:问题出现的场景是使用组件,但是该组件没有自带的编辑功能,所以需要自己处理在行内编辑的效果。需要注意一点,我们在使用绑定事件的时候,重复的事件是不会被清除的,而是会累加,所以,在中重新添加事件之前,需要将之前的先清除。

问题出现的场景是:
使用dataTables组件,但是该组件没有自带的编辑功能,所以需要自己处理table在行内编辑的效果。

目标效果是:
1.当hover到当前tr的时候,该行tr中可以编辑的td中出现一个input框:

2.当离开当前tr的时候,该行退出可编辑的状态,恢复到没有hover上去之前的效果。

3.当td变成可编辑状态,即出现了一个input输入框的时候,focus到input输入框中,可以输入number;当input框发生blur事件的时候,td恢复到非编辑状态:

由于blur和moseleave都会让输入框恢复到非编辑的状态,所以,这里的事件会有冲突。

在实际的编码中,在tr上绑定了mouseenter和mouseleave事件;

mouseenter事件的绑定:
function mouseenterEvt (e) {
    var tds = $(this).children("td");
    $.each(tds, function (i, val) {
        var jqob = $(val);
        if (i !== 3) {
            return true;
        }
        // if there is something validate wrong,stay there width no value exchange
        var validateSpanDom = jqob.find("span");
        var value = validateSpanDom ? validateSpanDom.text() : "";
        var validateTxt = validateInputBox(value);
        if(validateTxt) return false;
        // open edit mode
        jqob.addClass("edit-btn-display");
        var txt = jqob.text();
        txt = txt.replace("$", "");
        txt = txt.replace(/,/g, "");
        var put = $("
"); put.children(".edit-input-box").val(txt); jqob.html(put); }); } $("#table_id_example tbody").on("mouseenter", "tr",mouseenterEvt );
mouseleave事件的绑定:
$("#table_id_example tbody").on("mouseleave", "tr", function (e) {
    var row = tableDom.row($(this));
    var tds = $(this).children("td");

    $.each(tds, function (i, val) {
        var jqob = $(val);
        if (jqob.hasClass("edit-btn-display") && jqob.find(".edit-input-box").length > 0) {
            // if there is something validate wrong,stay there width no value exchange
            var validateSpanDom = jqob.find("span");
            var value = validateSpanDom ? validateSpanDom.text() : "";
            var validateTxt = validateInputBox(value);
            if(validateTxt) return false;
            var txt = jqob.find(".edit-input-box").val();
            txt = txt.replace("$", "");
            if(String(txt).indexOf(".") !== -1 ) {
                txt = Number(txt).toFixed(2);
            }
            jqob.html(txt);
            tableDom.cell(jqob).data(txt);
            // close edit mode
            jqob.removeClass("edit-btn-display");
        }
    });

    $("#table_id_example tbody").off("mouseenter", "tr",mouseenterEvt )
    $("#table_id_example tbody").on("mouseenter", "tr",mouseenterEvt )
});

在input输入框上绑定了blur事件:

blur事件的绑定:
$("#table_id_example tbody").on("blur", ".edit-input-box", function (e) {
    var value = $(this).val();
    var validateTxt = validateInputBox(value)
    if (!validateTxt) {
        var td = $(this).parents("td");
        var row = tableDom.row($(td));
        $(this).toggleClass("edit-btn-being-edit");
        var txt = $(this).val();
        txt = txt.replace("$", "");
        if(String(txt).indexOf(".") !== -1 ) {
            txt = Number(txt).toFixed(2);
        }
        td.html(txt);
        tableDom.cell(td).data(txt);//change data of DataTables obj
        var data = row.data();
        //alert("save current monthly-budget value")
        $("#table_id_example tbody").off("mouseenter", "tr",mouseenterEvt )
    }
});

对于事件解绑和重新绑定的解释:

当没有进行事件的解绑和重新绑定的时候,在input框中输入结束,点击input所在的td的时候,会接着触发mouseenter事件;但是当点击该input所在的td之外的td的时候,就会发生blur事件和mouseleave事件。

为了,在点击当前input所在的td的时候,只发生blur事件,需要在blur事件结束之后,删除mouseenter事件的绑定。这样,tr的mouseenter事件被删除了就不会触发了。

但是,在当前行blur之后,再进入其他的行依旧需要能够编辑,又由于编辑完一行之后,肯定是会mouseleave该行的,因此,在tr的mouseleave事件中又将tr的mouseenter事件加回去。

需要注意一点,我们在使用jq绑定事件的时候,重复的事件是不会被清除的,而是会累加,所以,在mouseleave中重新添加事件之前,需要将之前的先清除。在这里就是:在mousenter之后根本没有对input进行编辑就mouseleave了,此时在mouseleave中若不先清除原有的事件,那么tr上的mouseenter事件就会被添加两次。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101873.html

相关文章

  • jQuery Event Menthods

    Here are some common DOM events 1 Mouser Events click dbclick mouseenter mouseleave 2 Keyborars Events keypress keydown keyup 3 Form Events submit change focus blus 4 Docment/Wiindow Events laod re...

    khlbat 评论0 收藏0
  • layui数据表格使用(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)

    摘要:表格展示神器之一表格前言在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有等博主个人比较倾向于,极简,却又不失饱满的内在,体积轻盈,组件丰盈。 表格展示神器之一:layui表格 前言:在写后台管理系统中使用最多的就是表格数据展示了,使用表格组件能提高大量的开发效率,目前主流的数据表格组件有bootstrap table、layui ...

    番茄西红柿 评论0 收藏0
  • JavaScript DOM 事件初探

    摘要:级事件规定的事件流包括三个阶段事件捕获阶段处于目标阶段和事件冒泡阶段。对象只存在于事件处理程序执行期间,一旦执行完毕,立即被销毁。焦点事件焦点事件会在页面元素获得或失去焦点时触发。 JavaScript DOM 事件初探 原文链接 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,比如单击、双击、鼠标悬浮等。 事件流 事件流描述的是从页面中接收事件的顺序,或者说是事件在页面中传播...

    Moxmi 评论0 收藏0
  • JavaScript 事件——“事件类型”中“焦点、鼠标和滚轮事件”的注意要点

    摘要:焦点事件一般利用这些事件与方法和属性配合。此外,支持一个名为的类似事件,也是在鼠标滚动滚轮时除法。 焦点事件 一般利用这些事件与document.hasFocus()方法和document.activeElement属性配合。主要有: blur:元素失去焦点,不会冒泡; DOMFocusIn:同HTML事件focus,于DOM3遭废弃,选用focusin; DOMFocusOut:同...

    clasnake 评论0 收藏0

发表评论

0条评论

MadPecker

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<