Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 使い方:
- $(document).ready(function(){
- pager1 = new AjaxPageLoader(
- url = //データを提供するURL,
- className = //追加する対象のリストのクラス名,
- {
- "parentPath": ".parentClass", //親の要素(パラメータのoffsetが正しく渡されない場合は必要)
- "params": {"key":"value"},
- "method":"GET",
- "loadingShowElementID":"ajax_loading_icon",
- "loadingHideElementID":"ajax_read_more"
- });
- pager1.set_enabled();
- pager2 = new AjaxPageLoader(...)
- pager2.set_disabled();
- //スクロール位置に合わせてローディングするとき
- $(window).scroll(function(){pager1.check_position(); pager2.check_position()});
- }
- //set_enabled(); しないと動きません。
- //set_disabled(); した時は、AjaxPageLoaderは何もしません。
- */
- // コンストラクタ
- var AjaxPageLoader = function(request_url, listAreaElementClass, options){
- // TODO: (typeof jQuery == "function") でjQueryがロード済みかチェック
- // public:
- this.request_url = request_url;
- if(options["parentPath"]){
- this.listAreaElementPath = options["parentPath"]+" ."+listAreaElementClass
- }else{
- this.listAreaElementPath = "."+listAreaElementClass
- }
- // リストの最後の要素
- this.listAreaLastElement = $(this.listAreaElementPath+":last");
- this.offset = parseInt(this.listAreaLastElement.attr("id"))+1;
- // デフォルトのパラメーター
- this.params = {"offset" : this.offset}
- this.loading = false;
- if(options["method"] == "POST"){
- this.request_method = "POST";
- }else{
- this.request_method = "GET";
- }
- if(options["loadingShowElementID"]){
- this.loadingShowElementID = options["loadingShowElementID"];
- this.loadingShowElement = $("#"+this.loadingShowElementID);
- }
- if(options["loadingHideElementID"]){
- this.loadingHideElementID = options["loadingHideElementID"];
- this.loadingHideElement = $("#"+this.loadingHideElementID);
- }
- if(options["params"]){
- this.params = $.extend(options["params"], this.params);
- }
- // private:
- // このAjaxPageLoaderオブジェクトが有効かのフラグ
- var enable = false;
- // アクセサ
- this.set_enabled = function(){
- enable = true;
- }
- this.set_disabled = function(){
- enable = false;
- }
- this.is_enabled = function(){
- return enable;
- }
- }
- // Ajaxのリクエスト
- AjaxPageLoader.prototype.next_list_request = function(){
- if(this.loadingShowElementID){
- this.loadingShowElement.show();
- }
- if(this.loadingHideElementID){
- this.loadingHideElement.hide();
- }
- // $.ajax内でthis.* が使えないのでコピー
- var ajax_page_loader = this;
- $.ajax({
- type: this.requestMethod,
- url: this.request_url,
- dataType : 'html', // 必須項目
- data: this.params,
- success: function(receivedData){
- if (receivedData != "") {
- // 受信したデータをリストの下に追加
- ajax_page_loader.listAreaLastElement.after(receivedData);
- // リストを更新
- ajax_page_loader.listAreaLastElement = $(ajax_page_loader.listAreaElementPath+":last");
- // 更新されたリストから次のリクエストで渡すオフセットを計算
- ajax_page_loader.offset = parseInt(ajax_page_loader.listAreaLastElement.attr("id"))+1;
- // 次のリクエストで渡すパラメーターを更新
- ajax_page_loader.params.offset = ajax_page_loader.offset;
- // 次のリクエストのために、ステータスをOFFにする
- ajax_page_loader.loading = false;
- // 次のリクエストのために、隠していた領域を表示する
- if(ajax_page_loader.loadingHideElementID){
- ajax_page_loader.loadingHideElement.show();
- }
- }
- // ローディングアイコンを非表示にする
- if(ajax_page_loader.loadingShowElementID){
- ajax_page_loader.loadingShowElement.hide();
- }
- },
- error: function(){
- errMsg = "エラーが発生しました。ページを再読み込みしてください。";
- if(ajax_page_loader.loadingShowElementID){
- ajax_page_loader.loadingShowElement.html(errMsg);
- }else{
- console.log(errMsg);
- }
- }
- });
- }
- // スクロール位置をチェックして、条件を満たした時にリクエスト
- AjaxPageLoader.prototype.check_position = function(){
- if(this.is_enabled()){
- var currentViewingPosition = $(window).scrollTop();
- var loadingStartPosition = ($(document).height() - $(window).height())-500; // 一番下-先読み開始の高さ分
- if((currentViewingPosition > loadingStartPosition) && !this.loading){
- this.loading = true;
- this.next_list_request();
- }
- }
- }
- // 条件なしで、リクエストできる状況ならすぐにリクエスト
- AjaxPageLoader.prototype.request = function(){
- if(this.is_enabled() && !this.loading){
- this.loading = true;
- this.next_list_request();
- }
- }
Add Comment
Please, Sign In to add comment