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;
                         });