摘要:問題出現(xiàn)的場景是使用組件,但是該組件沒有自帶的編輯功能,所以需要自己處理在行內(nèi)編輯的效果。需要注意一點(diǎn),我們在使用綁定事件的時候,重復(fù)的事件是不會被清除的,而是會累加,所以,在中重新添加事件之前,需要將之前的先清除。
問題出現(xiàn)的場景是:
使用dataTables組件,但是該組件沒有自帶的編輯功能,所以需要自己處理table在行內(nèi)編輯的效果。
目標(biāo)效果是:
1.當(dāng)hover到當(dāng)前tr的時候,該行tr中可以編輯的td中出現(xiàn)一個input框:
2.當(dāng)離開當(dāng)前tr的時候,該行退出可編輯的狀態(tài),恢復(fù)到?jīng)]有hover上去之前的效果。
3.當(dāng)td變成可編輯狀態(tài),即出現(xiàn)了一個input輸入框的時候,focus到input輸入框中,可以輸入number;當(dāng)input框發(fā)生blur事件的時候,td恢復(fù)到非編輯狀態(tài):
由于blur和moseleave都會讓輸入框恢復(fù)到非編輯的狀態(tài),所以,這里的事件會有沖突。
在實際的編碼中,在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 = $("mouseleave事件的綁定:"); put.children(".edit-input-box").val(txt); jqob.html(put); }); } $("#table_id_example tbody").on("mouseenter", "tr",mouseenterEvt );
$("#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 ) } });
對于事件解綁和重新綁定的解釋:
當(dāng)沒有進(jìn)行事件的解綁和重新綁定的時候,在input框中輸入結(jié)束,點(diǎn)擊input所在的td的時候,會接著觸發(fā)mouseenter事件;但是當(dāng)點(diǎn)擊該input所在的td之外的td的時候,就會發(fā)生blur事件和mouseleave事件。
為了,在點(diǎn)擊當(dāng)前input所在的td的時候,只發(fā)生blur事件,需要在blur事件結(jié)束之后,刪除mouseenter事件的綁定。這樣,tr的mouseenter事件被刪除了就不會觸發(fā)了。
但是,在當(dāng)前行blur之后,再進(jìn)入其他的行依舊需要能夠編輯,又由于編輯完一行之后,肯定是會mouseleave該行的,因此,在tr的mouseleave事件中又將tr的mouseenter事件加回去。
需要注意一點(diǎn),我們在使用jq綁定事件的時候,重復(fù)的事件是不會被清除的,而是會累加,所以,在mouseleave中重新添加事件之前,需要將之前的先清除。在這里就是:在mousenter之后根本沒有對input進(jìn)行編輯就mouseleave了,此時在mouseleave中若不先清除原有的事件,那么tr上的mouseenter事件就會被添加兩次。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101873.html
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...
摘要:表格展示神器之一表格前言在寫后臺管理系統(tǒng)中使用最多的就是表格數(shù)據(jù)展示了,使用表格組件能提高大量的開發(fā)效率,目前主流的數(shù)據(jù)表格組件有等博主個人比較傾向于,極簡,卻又不失飽滿的內(nèi)在,體積輕盈,組件豐盈。 表格展示神器之一:layui表格 前言:在寫后臺管理系統(tǒng)中使用最多的就是表格數(shù)據(jù)展示了,使用表格組件能提高大量的開發(fā)效率,目前主流的數(shù)據(jù)表格組件有bootstrap table、layui ...
摘要:級事件規(guī)定的事件流包括三個階段事件捕獲階段處于目標(biāo)階段和事件冒泡階段。對象只存在于事件處理程序執(zhí)行期間,一旦執(zhí)行完畢,立即被銷毀。焦點(diǎn)事件焦點(diǎn)事件會在頁面元素獲得或失去焦點(diǎn)時觸發(fā)。 JavaScript DOM 事件初探 原文鏈接 事件,就是文檔或瀏覽器窗口中發(fā)生的一些特定的交互瞬間,比如單擊、雙擊、鼠標(biāo)懸浮等。 事件流 事件流描述的是從頁面中接收事件的順序,或者說是事件在頁面中傳播...
摘要:焦點(diǎn)事件一般利用這些事件與方法和屬性配合。此外,支持一個名為的類似事件,也是在鼠標(biāo)滾動滾輪時除法。 焦點(diǎn)事件 一般利用這些事件與document.hasFocus()方法和document.activeElement屬性配合。主要有: blur:元素失去焦點(diǎn),不會冒泡; DOMFocusIn:同HTML事件focus,于DOM3遭廢棄,選用focusin; DOMFocusOut:同...
閱讀 1049·2021-11-22 13:53
閱讀 1599·2021-11-17 09:33
閱讀 2401·2021-10-14 09:43
閱讀 2863·2021-09-01 11:41
閱讀 2280·2021-09-01 10:44
閱讀 2920·2021-08-31 09:39
閱讀 1457·2019-08-30 15:44
閱讀 1866·2019-08-30 13:02