f7bfbc23bb2aaccb6113e055608ca8374beca5ad chmalee Thu Sep 3 15:24:03 2026 -0700 Make dragReorder.init() idempotent so that when users hide multiple visible tracks one after the other we don't spuriously attach event handlers, refs #38212 diff --git src/hg/js/utils.js src/hg/js/utils.js index c7cf1aa7825..5234d6df826 100644 --- src/hg/js/utils.js +++ src/hg/js/utils.js @@ -4043,41 +4043,47 @@ }, mapItemMouseOut: function () { imageV2.lastTrack = rightClick.currentMapItem; // Just a backup rightClick.currentMapItem = null; }, init: function () { // Make side buttons visible (must also be called when updating rows in the imgTbl). var btns = $("p.btn"); if (btns.length > 0) { dragReorder.zipButtons($('#imgTbl')); + $(btns).off("mouseenter", dragReorder.buttonMouseOver ); + $(btns).off("mouseleave", dragReorder.buttonMouseOut ); $(btns).on("mouseenter", dragReorder.buttonMouseOver ); $(btns).on("mouseleave", dragReorder.buttonMouseOut ); $(btns).show(); } var handle = $("td.dragHandle"); if (handle.length > 0) { + $(handle).off("mouseenter", dragReorder.dragHandleMouseOver ); + $(handle).off("mouseleave", dragReorder.dragHandleMouseOut ); $(handle).on("mouseenter", dragReorder.dragHandleMouseOver ); $(handle).on("mouseleave", dragReorder.dragHandleMouseOut ); } // setup mouse callbacks for the area tags + $("#imgTbl").find("tr").off("mouseover", dragReorder.trMouseOver ); + $("#imgTbl").find("tr").off("mouseleave", dragReorder.trMouseLeave ); $("#imgTbl").find("tr").on("mouseover", dragReorder.trMouseOver ); $("#imgTbl").find("tr").on("mouseleave", dragReorder.trMouseLeave ); $("#imgTbl").find("tr").each( function (i, row) { // save the original y positions of each row //if (row.id in dragReorder.originalHeights === false) { dragReorder.originalHeights[row.id] = row.getBoundingClientRect().y + window.scrollY; //} }); $(".area").each( function(t) { this.onmouseover = dragReorder.mapItemMouseOver; this.onmouseout = dragReorder.mapItemMouseOut; this.onclick = posting.mapClk; });