jQuery實現回車綁定Tab事件、jQuery.extend方法、jQuery.fn.extend方法


============回車實現Tab事件==========

  有時候我們希望回車事件綁定的是鍵盤的Tab事件。我的第一思路就是切換事件的keyCode,比如鍵盤事件按下的keyCode如果是13,我們將keyCode改為9。但是在實際編程中卻未能實現此效果。於是只能自己通過手寫JS腳本來調用input元素的focus()事件。

 

1.原來的一個普通的表單

        <form id="tttttttttttt" action="xxxx.html">
            <input type="hidden" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="button" id="button" value="第一個按鈕" />
            <input type="submit" name="" id="" value="提交按鈕" />
            <button>按鈕</button>
        </form>

 

我們發現當我們按下回車的時候會提交表單,觸發表單的submit()事件。原因是有一個按鈕的類型是submit。所以點擊回車的時候觸發了回車事件。

於是將上面的submit按鈕改為button,在其click事件中提交表單。

        <form id="tttttttttttt" action="xxxx.html">
            <input type="hidden" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="button" id="button" value="第一個按鈕" />
            <input type="button" name="" id="" value="提交按鈕" onclick="$('#tttttttttttt').submit();" />
            <button>按鈕</button>
        </form>

 

我們發現當我們按下回車的時候會提交表單,觸發表單的submit()事件。原因是有一個button,button默認的類型也是submit,所以也會觸發表單提交。

將button的類型改為button。

        <form id="tttttttttttt" action="xxxx.html">
            <input type="hidden" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="button" id="button" value="第一個按鈕" />
            <input type="button" name="" id="" value="提交按鈕" onclick="$('#tttttttttttt').submit();" />
            <button type="button">按鈕</button>
        </form>

  這次再按下回車終於不是表單提交了。

 

2.jQuery 設置回車切換input的focus

  前提是表單中沒有submit類型的按鈕。針對下面的表單元素進行切換:

        <form id="tttttttttttt" action="xxxx.html">
            <input type="hidden" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="text" name="" id="" value="" />
            <br />
            <input type="button" id="button" value="第一個按鈕" />
            <input type="button" name="" id="" value="提交按鈕" onclick="$('#tttttttttttt').submit();" />
            <button type="button">按鈕</button>
        </form>

 

腳本如下: 

  思路:鍵盤中判斷是否按下的是回車鍵,如果是回車鍵,獲取表單下的所有的需要切換的input元素,然后與當前元素進行對比,如果相等,就將數組中的下一個元素聚焦(當然如果是最后一個元素的話將第一個元素聚焦)

    $(function(){
        $("input").keydown(function(){
            if(13 == event.keyCode){
                var form = $("#tttttttttttt");
                var inputEles = form.find("input:visible");
                console.log("inputEles -> "+inputEles.length);  //5
                for(var i=0;i<inputEles.length;i++){
                    if($(inputEles[i]).is($(this))){//判斷兩個jQuery對象是否相等用is
                        if(i == inputEles.length-1){
                            $(inputEles[0]).focus();
                        }else{
                            $(inputEles[i+1]).focus();
                        }
                    }    
                }
            }

        });
    })

總結:

  jQuery判斷兩個元素是否相等用  ele1.is(ele2)

  button的默認類型是submit(會觸發表單的提交)

  

 =========jQuery.extend和jQuery.fn.extend=======

1.  我們先看jqueryAPI對兩個函數的解釋:

1.  jQuery.fn.extend(object)  返回值:jQuery

  擴展 jQuery 元素集來提供新的方法(通常用來制作插件)。

  參數object用來擴充 jQuery 對象。

例如:增加兩個插件方法。

        jQuery.fn.extend({
          check: function() {
            return this.each(function() { this.checked = true; });
          },
          uncheck: function() {
            return this.each(function() { this.checked = false; });
          }
        });

 

使用:

$("input[type=checkbox]").check();
$("input[type=radio]").uncheck();

 

2. jQuery.extend(object)  返回值:jQuery

  擴展jQuery對象本身。

  用來在jQuery命名空間上增加新函數。

  參數object用以擴展 jQuery 對象

例如:在jQuery命名空間上增加兩個函數。

        // 擴展函數
        jQuery.extend({
          min: function(a, b) { return a < b ? a : b; },
          max: function(a, b) { return a > b ? a : b; }
        });

 

調用:

alert($.min(5, 6));

 

2. 自己的理解

jQuery的API手冊中,extend方法掛載在jQuery和jQuery.fn兩個不同對象上方法,但在jQuery內部代碼實現的是相同的,只是功能卻不太一樣;
且看官方給出解釋:
jQuery.extend(): Merge the contents of two or more objects together into the first object.(把兩個或者更多的對象合並到第一個當中);
jQuery.fn.extend():Merge the contents of an object onto the jQuery prototype to provide new jQuery instance methods.(把對象掛載到jQuery的prototype屬性,來擴展一個新的jQuery實例方法)

1.  jQuery.fn.extend()

  這個拓展的是jQuery.fn的方法。

jQuery.fn = jQuery.prototype = {
      init:funtion(selector,context){
            //..... 
 
     }
}

  所以jQuery.fn.extend拓展的是jQuery對象(原型的)的方法啊!

  也就是只能在jQuery對象才能使用的方法,例如: $("#abc") ,$(div)。

  也就是說,jQuery.fn.extend拓展的方法,你得用在jQuery對象上面才行啊!說白了就是得這么用(假設xyz()是拓展的方法):

$('selector').xyz();

 

2. jQuery.extend() 

語法:

$.extend( target [, object1 ] [, objectN ] )

 

  jQuery.extend() 函數用於將一個或多個對象的內容合並到目標對象。

 

注意:

1. 如果只為$.extend()指定了一個參數,則意味着參數target被省略。此時,target就是jQuery對象本身。通過這種方式,我們可以為全局對象jQuery添加新的函數。
2. 如果多個對象具有相同的屬性,則后者會覆蓋前者的屬性值。

 

(1)用法一:指定一個參數擴展jQuery函數已經在上面測試過

        // 擴展jQuery類自身
        jQuery.extend({
          min: function(a, b) { return a < b ? a : b; },
          max: function(a, b) { return a > b ? a : b; }
        });
        
        alert($.max(5, 6));

 

(2)合並多個對象的屬性:

        var var1 = { name: 'var1', age: 2, sex: '男', address: 'var1 address', speak: function() { alert("var1 speak");} }
        var var2 = { name: 'var2', age: 2, sex: '女', speak: function() { alert("var2 speak");} }
        
        // 將var2的屬性合並到var1
        jQuery.extend(var1, var2);
        console.log(var1);
        var1.speak();

結果:

 

 

補充:當然可以用一個變量接收合並后的結果:

        var var1 = { name: 'var1', age: 2, sex: '男', address: 'var1 address', speak: function() { alert("var1 speak");} }
        var var2 = { name: 'var2', age: 2, sex: '女', speak: function() { alert("var2 speak");} }
        
        // 將var2的屬性合並到var1
        var var3 = jQuery.extend(var1, var2);
        console.log(var1);
        console.log(var3);
        var1.speak();

結果:

 

補充:如果是用null或者undefined合並到target上,不會影響原target;可以將對象合並到null或undefined對象上,如下:

        var var1 = { name: 'var1', age: 2, sex: '男', address: 'var1 address', speak: function() { alert("var1 speak");} }
        
        var var3 = jQuery.extend(var1, undefined);
        console.log(var1);
        console.log(var3);
        
        var var4 = jQuery.extend(var1, undefined);
        console.log("==============");
        console.log(var1);
        console.log(var4);
        
        var var2 = { name: 'var2', age: 2, sex: '女', speak: function() { alert("var2 speak");} }
        var var5 = jQuery.extend(null, var2);
        console.log("==============");
        console.log(var5);

結果:

 


免責聲明!

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



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