2010-08-22 73 views
1

我使用下面的代碼做一個表分頁(請不要提出任何預建的)把它變成一個jquery函數?

function tablejax(url, start, count) { 
    $('#tablejaxButton').attr("disabled", "true"); 
    $('#tablejaxOverlay').fadeIn('slow'); 
    $.ajax({ 
     type: "GET", 
     url: url, 
     data: "start="+start+"&count="+count+"&identifier="+$('#tablejaxButton').val(), 
     success: function(data){ 
      setTimeout(function(){ 
       $('#myTable tbody').append(data); 
       $('#myTable tr td div').slideDown('slow'); 
       $("html:not(:animated),body:not(:animated)").animate({ 
        scrollTop: $('body').attr("scrollHeight") 
        }, 1000); 
       $("table").trigger("update"); 
      }, 1000); 
      setTimeout(function(){ 
       $('#tablejaxOverlay').fadeOut('slow'); 
       $('#tablejaxButton').removeAttr('disabled'); 
      }, 1000); 
     } 
    }); 
} 

但是我目前叫它通過

$('#tablejaxButton').click(function() { 
     tablejax(this.name, tcount, 20); 
     tcount = tcount+20; 
    }) 

有幾個問題這, 但我想改變的是。

我希望能夠調用$('#tableID').tablejax('url', 'identifier', 'count');
$('#tableUsers').tablejax('get_members.php', 27, 20);

它會自動onclick事件附加到#tableUsersButton(TABLEID +按鈕)

我想本身的功能來保持跟蹤我們應該從 目前我正在使用

tcount = 20; 
//do stuff 
tcount = tcount +20; 

這是不理想的。

最簡單的方法是什麼?

注:此功能應該是傳遞到它的count已經被加載到表中,例如,假設如果你調用$('#tableUsers').tablejax('get_members.php', 27, 20);那麼第20行就已經可以通過服務器端處理加載到表中。


更新
爲了簡化我的問題。

我需要能夠調用的文件準備$('#tableID).tablejax(--initial params here--);

這基本上會得到一個函數準備填寫一些默認PARAMS(如標識,網址,ECT) 這也將增加對onclick事件處理器$('#tableIDButton'),當點擊時會打電話像​​

這種方法是有時我需要使用另一個觸發器調用分頁。

所有我需要知道的是

  • 如何註冊jQuery中的函數:回答
  • 如何註冊當函數被調用回答的單擊事件:原來我可以註冊一個點擊甚至從任何地方不只是文件準備
  • 如何在函數中調用一個'行動',當它不是初始調用 (初始呼叫應當使用的參數,後續調用應該調用「內部功能)

回答

2

使用延伸()函數的函數添加到jQuery對象:

jQuery.fn.extend({ 
    tablejax: function(url, start, count) { 
     $('#tableIDButton').click(function() { 
      $('#tableID').tablejax(url, start+20, count); // just pass on the variables 
     } 
    } // put comma here if you want to add more functions 
}); 
// to run the function on document ready: 
$(function() { 
    $('#tableID').tablejax(...); 
} 

然後,你應該能夠像你想要的那樣調用你的功能。您顯然仍然需要在點擊事件中調用它。

更新:

更新我的例子來回答問題2和3讀取下一行,你可以再次遞歸調用相同的功能,比如上例中。

順便說一句,我沒有看到我的例子「如何污染jQuery命名空間」,因爲它來自jQuery自己的文檔。

+0

嗨那裏, 這就近了。 但是我想在文檔準備好時調用'$('#tableID')。tablejax(blablabla);' 。當我調用它時,它應該在'$('#tableIDButton')'上註冊一個名爲$('#tableID')。的table事件('next')。 這將抓住接下來的幾行 – Hailwood 2010-08-22 23:40:02

+0

我可能是錯的,但我總是被告知用自己的函數擴展jquery對象污染它,就好像你有內部函數(例如更新,刪除,change_colour),他們可能會與其他人發生衝突,但是使用0xAF的方法你的內部函數就是這樣,內部的。 另外,我真的不想每次都必須傳遞參數,因此爲什麼我想只能調用tablejax('next'); 我想我總是可以只用tablejax();如果沒有參數,則使用在選項數組中傳入的內容... – Hailwood 2010-08-23 00:25:33

+0

這裏有兩個問題。 1)不能有兩個具有相同名稱的函數,但具有不同的參數/實現。 2)'tablejax('next');'函數沒有意義,因爲它是在HTML元素上調用的,因此不會了解以前的任何查詢。所以沒有信息來計算接下來會發生什麼。除非當然存儲在按鈕中,但是當您只需要下一行時,您需要給函數一個不同的名稱。 – Stian 2010-08-23 00:37:52

3

我想這將幫助: http://www.google.bg/search?q=jquery+plugin+tutorial

basicly你會寫是這樣的:

(function($){ 
    $.fn.tablejax = function(options) { 
     this = $(this); // this is the element on which we called the func 
     this.tcount+=20; 
     // do something here... 
    } 
})(jQuery); 

這個保存到jquery.tablejax.js然後jquery.js和 後調用它的HTML
您需要實現該功能,然後您可以在每個元素或選擇器上調用它。

+0

謝謝,這幾乎正是我所需要的(並且在Stians答案上有所改進,因爲它不會污染jquery命名空間) 請參閱我的更新以獲得其他兩點。 – Hailwood 2010-08-22 23:51:34

+0

我可以通過調用'$ .fn.tablejax = function(options){--blabla-- $('#'+ this.id +'Button')來獲得。click( - blabla - ); }' – Hailwood 2010-08-22 23:55:05