Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

使用display:none有效减少回流造成的影响

UI库果然对性能非常考究,我在mousedown的回调中插入一个节点,然后修改其样式,结果导致整个文档的点击事件都触发不了。顺便一点,当我们点击页面时,依次发生mousedown => mouseup => click。如果我们在mousedown或mouseup这前两个环节的回调中加入许多耗性能的操作,就会引发点击事件触发不了。不幸的是,我的selectable踩坑了。

selectable的设计是这样的,当我们点鼠标按下,我们插入一个节点,然后在mousemove回调中进行拖拽,画出一个可任意变动的矩形,然后这个矩形圈中或相交的节点就当作选中,加上一个类名进行变色。问题在于mousedown时这个矩形要加入一些样式,要不大家看不到。我打算是一个半透明的虚线框。

   var selectable = $.fn.selectable = function(hash){
       var data = $.mix({}, defaults, hash || {})
       data.helper = $("<div class="ui-selectable-helper"></div>");
       data["this"] = this;
       this.data("selectable",data);
       this.on("mousedown", data.selector, data, handleSelectStart);
       this.on("click",     data.selector, data, handleSelectClick);
       this.on("mousemove", data.selector, data, handleSelectDrag);
       return this;
   }
function handleSelectStart(event){
       var data = event.handleObj;
       if(!data.selectingClass){
           return
       }
       selectable.data = data;//公开到全局,方便让其他回调也能访问到
       $(data.appendTo).append(data.helper);//创建一个临时节点,用于显示选择区域
       data.helper.css({
           left: event.pageX,
           top:  event.pageY,
           width: 0,
           height: 0,
           position:"absolute",
           borderWidth:1,
           borderStyle:"dotted",
           borderColor:"#ccc",
           backgroundColor:"#fff",
           opacity:.5
       });
       data.opos = [event.pageX, event.pageY];
       //如果使用了事件代理,则在原基础上找到那被代理的元素
       //.........略.........
   }

出问题的代码为这个css方法,会引起回流,导致页面的其他点击事件不能触发或很难触发。

require("mass.selectable,ready",function($){
 
     $('body').selectable({
         selector: "#selectable"
     });
 
     $(document).click(function(){
         console.log("xxxxxxxxxx")//这里触发不了
     })
 });

为此,我们在mousedown时只插入隐藏元素,在第一次拖拽时让它显示出来,这样就ok了。

function handleSelectStart(event){
       var data = event.handleObj;
       if(!data.selectingClass){
           return
       }
       selectable.data = data;//公开到全局,方便让其他回调也能访问到
       $(data.appendTo).append(data.helper);//创建一个临时节点,用于显示选择区域
       data.helper.css({
           display: "none",
           left: event.pageX,
           top:  event.pageY,
           width: 0,
           height: 0,
           position:"absolute",
           borderWidth:1,
           borderStyle:"dotted",
           borderColor:"#ccc",
           backgroundColor:"#fff",
           opacity:.5
       });
       data.opos = [event.pageX, event.pageY];
       //如果使用了事件代理,则在原基础上找到那被代理的元素
       //.........略.........
   }
//通过拖动进行选择
   function handleSelectDrag(event){
       var data = selectable.data
       if( data ){
           if(!data._reflow_one_time){
               data.helper.css("display","block")
               data._reflow_one_time = 1;
           }
       //............略............
       }
   }

虽然只是一个小小的事故,但提示我们UI库不好这么轻松搞定的,否则就是jquery ui的下场。

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(2950)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2012-01-21 css3 变形
2011-01-21 jQuery1.5的新特征subclass——jQuery插件机制的救赎
2011-01-21 getElementsByTagName
2010-01-21 侏儒排序
点击右上角即可分享
微信分享提示