2011-03-07 48 views
1

首先,我不知道如何將問題「標題」短語,如果我在這裏混淆每個人的標題,抱歉。jQuery/javascript參數處理問題

反正我看到這個代碼在jQuery的http://docs.jquery.com/Plugins/Authoring

(function($){ 

    var methods = { 
    init : function(options) { 

     return this.each(function(){ 

     var $this = $(this), 
      data = $this.data('tooltip'), 
      tooltip = $('<div />', { 
       text : $this.attr('title') 
      }); 

     // If the plugin hasn't been initialized yet 
     if (! data) { 

      /* 
      Do more setup stuff here 
      */ 

      $(this).data('tooltip', { 
       target : $this, 
       tooltip : tooltip 
      }); 

     } 
     }); 
    }, 
    destroy : function() { 

     return this.each(function(){ 

     var $this = $(this), 
      data = $this.data('tooltip'); 

     // Namespacing FTW 
     $(window).unbind('.tooltip'); 
     data.tooltip.remove(); 
     $this.removeData('tooltip'); 

     }) 

    }, 
    reposition : function() { // ... }, 
    show : function() { // ... }, 
    hide : function() { // ... }, 
    update : function(content) { // ...} 
    }; 

    $.fn.tooltip = function(method) { 

    if (methods[method]) { 
     return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
    } else if (typeof method === 'object' || ! method) { 
     return methods.init.apply(this, arguments); 
    } else { 
     $.error('Method ' + method + ' does not exist on jQuery.tooltip'); 
    }  

    }; 

})(jQuery); 

我的問題的存在是我不明白爲什麼我們需要這個if語句?

if (methods[method]) { 
    return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); 
} 

或者換句話說,在什麼情況下,我們將在像「的方法[法]」關於示範基地參數傳遞?

謝謝!

+0

謝謝大家!所有的答案在某種程度上是有幫助的,我感謝大家的及時答覆^^ – forestclown 2011-03-07 08:34:40

回答

4

如果語句會檢查你是否試圖調用插件可用的方法之一。在您例子的情況下,你有這些方法:

$.tooltip('init', { arg1: true, arg2: 'a value' }); 

然後你的代碼知道發送的參數,因爲這個if語句將是正確的:

init, destroy, reposition, show, hide, and update 

所以,你可以像做呼叫:

if(methods['init']) 
1

您在開頭看到代碼定義了一個對象methods

函數$.fn.tooltip = function(method)接受名稱爲method(最後沒有s)的參數。

該函數將執行methods中定義的方法之一,但只能使用該方法,如果此方法也可用。因此if(methods[method])

如果method是例如,則該表達式將是trueshow, hide,update等,即,如果methods對象具有包含在method中的名稱的屬性。

因此,對於foobar,表達式將是false。如果if聲明不會在那裏,代碼會試圖調用method['foo'],它不存在,你會得到一個錯誤:

TypeError: object is not a function

這是你想知道嗎?

1

你的代碼段是不完整的,它不包含演示是爲了說明它是如何調用,所以很難給出一個確切的答案。

然而,這裏就是我想從代碼的樣子:

if語句是必要的,因爲提示功能將與參數,如初始化,銷燬,顯示,隱藏,更新,是指被稱爲在方法散列中定義的函數。你可能會用init來調用工具提示來初始化工具提示,隱藏它來隱藏它,顯示來顯示它等等。如果你根本不傳遞參數,它默認使用init方法並初始化工具提示(if的第二個分支) 。

1

首先,這段代碼聲明瞭一個名爲methods的散列映射,其中包含一些函數。

然後,第二部分聲明一個名爲tooltip的函數,該函數接受一個名爲method的參數。這個參數是我們要調用的函數的名字,這個名字是這個函數在methods數組中的索引。

因此,當您做$('#whatever').tooltip('destroy');時,它會查看methods陣列中destroy密鑰引用的功能。