2013-12-22 63 views
0

OK,我需要一些幫助,jQuery的傳遞函數的函數

我有一個jQuery插件內的函數

var LoadPage = function (page, location, func){  
     $.ajax({ 
      url: page, 
      success: function(data){   
       $(location).html(data); //Insert data into location 
       func 
       return true   
      }, 
     }); 
    } 

我想使用它像這樣

Loadpage(
    "api/page.php", 
    "#div_id", 
     $("#calander td.clickable").click(function() { 
     var day = $(this).attr("calendar-day"); 
     console.log("clicked TD" + day); 
     LoadPage('/api/view_event.php?d='+day, settings.eventContainer); 
    }) 
); 

Loadpage(
    "api/page.php", 
    "#div_id", 
     function() { 
     var day = $(this).attr("calendar-day"); 
     console.log("clicked TD" + day); 
     LoadPage('/api/php/calander/view_event.php?d='+day+'&m='+SelectedMonth+'&y='+SelectedYear, settings.eventContainer); 
    } 
); 

然後有它在success:中運行,其中var func在其中,但不確定如何使其工作。請幫助互聯網。

+0

'$(「#calander td.clickable」)'返回一個jQuery集合,而不是一個函數。 – elclanrs

+0

你需要在另一個回調中進行回調嗎? – Misters

+0

我這樣做,因爲該插件使用該功能運行頁面的位置,如果返回也有一個按鈕,加載我希望它添加新的點擊事件/功能,當它在屏幕上。 – MasterT

回答

2

有在你的代碼三個獨立的問題:

1)如果你想在你的成功處理程序執行回調func,那麼你需要在它後面加括號()func()爲是JavaScript的方法表示你想執行一個功能。

var LoadPage = function (page, location, func){  
    $.ajax({ 
     url: page, 
     success: function(data){   
      $(location).html(data); //Insert data into location 
      // add parens here after func 
      func(); 
      return true   
     }, 
    }); 
} 

如果你想func參數是可選的,你可以這樣執行它之前測試它:

var LoadPage = function (page, location, func){  
    $.ajax({ 
     url: page, 
     success: function(data){   
      $(location).html(data); //Insert data into location 
      // add parens here after func to actually execute it 
      if (func) func(); 
      return true   
     }, 
    }); 
} 

2)然後,你需要改變你怎麼稱呼LoadPage()將它傳遞像這樣的實際功能參考:

Loadpage(
    "api/page.php", 
    "#div_id", 
     function() { 
     $("#calander td.clickable").click(function() { 
      var day = $(this).attr("calendar-day"); 
      console.log("clicked TD" + day); 
      LoadPage('/api/view_event.php?d='+day, settings.eventContainer); 
     }) 
     }) 
); 

你傳遞什麼是執行.click函數,它是一個結果jQuery對象,而不是一個函數。相反,你可以把它包裝在一個匿名函數中,所以你傳遞了對該函數的引用。這與func()相反。因爲您想要傳遞函數的引用,而不是現在執行函數的結果,所以您不希望在傳遞後傳遞parens。

因此,要總結這兩個問題:

聲明:

func 

僅僅是一個函數的引用。它並不實際執行該功能。當你想傳遞一個函數的引用時,它會很有用,然後它會把它稱爲LATER。

聲明:

func() 

立即執行功能。如果你通過func()作爲參數,它會立即執行(parens總是意味着現在執行它),然後傳遞該函數的返回值(這不是你想要的)。


3)您可能還需要明白,在你的成功處理程序的return true聲明不做任何事情。因爲ajax函數是不同步的,所以你的函數只是啓動ajax函數,然後立即返回。過了一段時間,ajax引擎的內部調用你的處理器success。該返回語句返回到該ajax引擎的內部。它不會從你的LoadPage()函數返回,因爲它已經很久以前就已經完成了,並且什麼也沒有返回。

4)可能的第四個問題。每當你打電話給LoadPage()時,你都會爲這個選擇器匹配的任何對象添加一個新的點擊處理器:"#calander td.clickable"。如果以前存在這些對象中的某些對象,則最終會出現多個點擊處理程序。在這種情況下,您要麼使用委託事件處理,以便您可以提前安裝一次點擊處理程序,或者您需要在安裝新處理程序之前刪除存在的點擊處理程序,或者只需要隔離新添加的對象並且只能對它們進行調用。如果所有"#calander td.clickable"被前面的代碼替換,那麼這不會是一個問題。

+0

編輯我的答案,在代碼中指出三個單獨的問題。 – jfriend00

+0

我知道返回真正的位沒有什麼力量的習慣,但什麼是對的。 – MasterT

+0

@MasterT - 增加了一個可能的第四個問題。我認爲'return true'語句(雖然無害)看起來像是有意做某事,因此看起來具有誤導性,使得代碼不易讀,特別是對於更多新手讀者。 – jfriend00

0

試試這個:

var LoadPage = function (page, location, func){  
    $.ajax({ 
     url: page, 
     success: function(data){   
      $(location).html(data); //Insert data into location 
      func && func(); // this will execute func if it is passed as parameter 
      return true;   
     } 
    }); 
} 

而在第二個方式來使用它。