• 基于Css反射形自触发事件,优化你的延时事件


    昨天听w3ctech分享时候,说道orientationchange在不同OS和版本中,存在兼容问题,很多时候触发时候都没有渲染结束,开发同学一般都是基于setTimeout一段时间之后,在去执行具体的注册事件

    类似这样的系统兼容问题还有很多,其核心原因在于

    1. 渲染未结束,js事件提前出发或者延后触发

    2. 无法根本之道何时渲染完毕,只能用setTimeout估摸具体时间

    所以这里本质上还是js对于渲染模型的观察者模式public的api不够详细造成,所以我们就想到一个旁敲侧击的方式,

    1. 通过media query之类的Observe来做实时观察

    2. 再结合reflow/repaint会触发resize事件的特质做到及时响应

    实现代码如下:

    jsfile(testOrientation.js)

    require([ 'common' ], function($) {
        $('#J_block').bind('resize', function() {
            alert($(this).css('background-color'))
        })
        window.addEventListener("orientationchange", function() {
            var color = $('#J_block').css('background-color');
            $('<div>' + color + '</div>').appendTo(document.body);
        }, false);
    })

    htmlfile

    <!doctype html>
    <html>
    <head>
     <!--# include virtual="/t/common/index/header.html" -->
    <style>
    @media screen and (orientation:landscape){
        #J_block{
            background-color:green;
        }
    }
    @media screen and (orientation:portrait){
        #J_block{
            background-color:red;
        }
    }
    </style>
    </head>
    <body>
        <div style="margin-top:10px;text-align:center" id="J_block">kqwjelqjwelkqwjelk</div>
        <script src="<!--# include virtual="/t/common/loadRequireUrl.variable" -->?<!--# include virtual="/t/common/gb_version.variable" -->"></script>
        <script>
            require([ '<!--# include virtual="/t/common/loadConfigUrl.variable" -->?<!--# include virtual="/t/common/gb_version.variable" -->' ], function() {
                require([ 'test/testOrientation' ]);
            });
        </script>
    </body>
    </html>

    依照这个思路,还可以举一反三,如

    1. 基于Css实现的text-ellipsis属性+resize事件,可以算不同屏幕下是否超过字符上限

    2. 基于Css实现dataURI实现base64 HTML code实现JS字符编码转换,见我之前的一篇文章http://www.cnblogs.com/xueduanyang/archive/2013/05/30/3108442.html

    3. 基于Css的media query实现各种机型探测

    4. 基于Css的rem属性实现放大镜同步

    5. 基于Css的webkit-calc,实现宽度自适应

    等等等等

    欢迎和大家一起讨论大笑

  • 相关阅读:
    科目2考试最好的网址
    怎么解决tomcat占用8080端口问题
    JDBC全部分析
    JSP分页技术的实现(利用当前页进行前后加减,并利用href进行当前页面传值,传值当然是那个当前值变量)
    mysql 如何创建一个简单的存储过程
    MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)
    JAVA线程操作常见面试题 包括不使用内部类对多个线程加减1
    JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )
    面试王牌 JAVA并发
    不通过ecplise,只通过文件目录 创建最简单的JSP文件
  • 原文地址:https://www.cnblogs.com/xueduanyang/p/3441762.html
Copyright © 2020-2023  润新知