1. 程式人生 > >js 延遲事件載入

js 延遲事件載入

今天在工作中遇到如下問題:

在本地做資料搜尋,使用者輸入中文或者英文,能夠篩選出符合條件的資料,當用戶鍵盤輸入過快,導致瀏覽器卡死,不能使用

篩選過程描述

當用戶輸入中文或者英文,根據演算法(字元匹配),將使用者輸入全部轉為因為英文,然後根據英文條件對本地資料做資料篩選。

問題分析:

將使用者輸入轉為英文需要做大量模式匹配,速度非常的慢,然後再對本地資料做資料篩選,因為響應的時間是Keyup,所以處理的請求比較多,需要大量的CPU資源,導致瀏覽器卡死。

解決辦法:

當用戶連續兩次輸入的時間間隔小於200毫秒的時候,則處理事件

下面的例子就是做了一個數據延遲響應的demo:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>事件延遲響應</title>

</head>
<body>

<input id="huangbiao" >
<button id="myBtn">測試jquyer內部資料</button>

<script src="../../js/lib/jquery.min.js"></script>
<script type="text/javascript">

    $(function(){
        var abc = $("#huangbiao").keyActionLater({
            // 持續時間
            duration : 1000,
            // 事件型別
            eventType : "click",
            // 耗時的方法
            logicAction : function(){
                console.log("我的過程非常耗時1111");
            }
        });

        $("#myBtn").on("click",function(){
            abc.setName("LIUMEI");
        })
    });


    $.fn.keyActionLater = function(userSetting){
        //當前物件
        var that = $(this);

        // 開始時間
        var startTime = new Date().getTime();
        // 觸發事件的時間
        var currentTime = 0;
        // 定時器物件的控制代碼
        var timerObj = null;

        // 定義一個內部資料
        var name = "huangbiao";

        // 定義一個內部方法
        function getName(){
            console.log(name);
        }

        // 給keyActionLater物件擴充套件方法
        that.setName = function(newName){
            name = newName;
            console.log("name : " + name);
            getName()
        };

        // 預設配置資訊
        var defaultSetting = {
            // 持續時間
            duration : 500,
            // 事件型別
            eventType : "keyup",
            // 耗時的方法
            logicAction : function(){
                console.log("我的過程非常耗時");
            }
        };

        defaultSetting = $.extend(defaultSetting,userSetting)

        /**
         * this 代表jquery選中的dom物件
         */
        $(this).on(defaultSetting.eventType,function(){
            getName();
            currentTime = new Date().getTime();
            //console.log(currentTime + "----" + startTime + "----" + (currentTime - startTime));
            if(currentTime - startTime > defaultSetting.duration){
                timerObj = setTimeout(defaultSetting.logicAction,defaultSetting.duration)
            }else{
                clearTimeout(timerObj);
                timerObj = setTimeout(defaultSetting.logicAction,defaultSetting.duration);
            }
            startTime = currentTime;
        });

        return  that;

    }

</script>
</body>
</html>