jquery更改ready方法調用順序,在ready之后執行Js代碼


jquery更改ready方法調用順序,在ready之后執行Js代碼

問題描述

我想要控制Input,回車不提交表單,思路如下:

$(function(){
    $("form input").on("keypress",function(event){
        if(event.keycode == 13){
            return false;
        }
    })
})

當然上面這段代碼要放是base.js(所有頁面都要引入的基礎函數)里面,因為有好多頁面都存在這個問題. 問題來了,在某些頁面中,當執行上面的代碼時,$("form input")還不存在,,這些元素是在頁面的$(function(){})–(我把它叫做ready方法)中產生的.. 所以,現在就有一個需求 在所有的ready方法之后執行上面的方法

在所有的ready方法之后執行上面的方法

jQuery的ready方法如下:

$(function(){
//....
});

或者

$(document).ready(function(){
//....
});

jQuery的方法分兩種,一種是$.extend等,另一種是\(("button").on(...),(定義為\).fn.on)從上面分析,ready方法應該屬於第二種 所以我打算重新ready方法

重寫$.fn.ready方法

  1. easy test
$.fn.ready = function(){alert("hello,world");}

放到base.js中,發現所有頁面在加載的時候,都不執行自己的ready方法了,而是彈出了"hello,world"

  1. 執行頁面中的ready方法
$.fn.ready = function(func){
if(func){   //如果有自己的ready方法,
 func();    //運行該方法
}
alert("hello,world");
}

執行結果是,既執行了自己的ready方法(在里面寫了個alert(1)做為測試),也執行了后續方法.. 但是,頁面沒有加載出來,因為大家都知道,ready方法是當頁面加載完成才去執行的,而現在是當運行到$(function(){})這里的時候,就執行了,而沒有等待頁面加載..

查看$.fn.ready的源碼定義

源碼定義如下:

jQuery.fn.ready = function( fn ) {

        // Add the callback
        jQuery.ready.promise().done( fn );

        return this;
};

jQuery 用Deferred和promise等來控制等加載完成后執行.而done方法可以接受多個函數.

修改自己的$.fn.ready

jQuery.fn.ready = function( fn ) {
        // Add the callback
        jQuery.ready.promise().done(fn,function(){
        $("form input").on("keypress",function(event){
            if(event.keycode == 13){
                return false;
            }
        })
    });
        return this;
};

測試,可用,順序是先執行fn(頁面中的多個ready方法),后執行自己的方法,而此時input已經創建成功了,即能訪問到了

閉包,增加安全性

最終代碼如下:

(function($){
        $.fn.ready = function( fn ) {
                $.ready.promise().done(fn,function(){
                        $("form input").on("keypress",function(event){
                                if(event.keyCode == 13){
                                        return false;
                                }
                        });
                });
                return this;
        };
})(jQuery);

Created: 2016-05-04 周三 17:48

Emacs 24.5.1 (Org mode 8.2.10)

Validate


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM