Guest User

Untitled

a guest
Jan 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.95 KB | None | 0 0
  1. /*
  2. 使い方:
  3. $(document).ready(function(){
  4. pager1 = new AjaxPageLoader(
  5. url = //データを提供するURL,
  6. className = //追加する対象のリストのクラス名,
  7. {
  8. "parentPath": ".parentClass", //親の要素(パラメータのoffsetが正しく渡されない場合は必要)
  9. "params": {"key":"value"},
  10. "method":"GET",
  11. "loadingShowElementID":"ajax_loading_icon",
  12. "loadingHideElementID":"ajax_read_more"
  13. });
  14. pager1.set_enabled();
  15.  
  16. pager2 = new AjaxPageLoader(...)
  17. pager2.set_disabled();
  18.  
  19. //スクロール位置に合わせてローディングするとき
  20. $(window).scroll(function(){pager1.check_position(); pager2.check_position()});
  21. }
  22. //set_enabled(); しないと動きません。
  23. //set_disabled(); した時は、AjaxPageLoaderは何もしません。
  24. */
  25.  
  26. // コンストラクタ
  27. var AjaxPageLoader = function(request_url, listAreaElementClass, options){
  28. // TODO: (typeof jQuery == "function") でjQueryがロード済みかチェック
  29. // public:
  30. this.request_url = request_url;
  31.  
  32. if(options["parentPath"]){
  33. this.listAreaElementPath = options["parentPath"]+" ."+listAreaElementClass
  34. }else{
  35. this.listAreaElementPath = "."+listAreaElementClass
  36. }
  37.  
  38. // リストの最後の要素
  39. this.listAreaLastElement = $(this.listAreaElementPath+":last");
  40. this.offset = parseInt(this.listAreaLastElement.attr("id"))+1;
  41. // デフォルトのパラメーター
  42. this.params = {"offset" : this.offset}
  43.  
  44. this.loading = false;
  45.  
  46.  
  47. if(options["method"] == "POST"){
  48. this.request_method = "POST";
  49. }else{
  50. this.request_method = "GET";
  51. }
  52.  
  53. if(options["loadingShowElementID"]){
  54. this.loadingShowElementID = options["loadingShowElementID"];
  55. this.loadingShowElement = $("#"+this.loadingShowElementID);
  56. }
  57. if(options["loadingHideElementID"]){
  58. this.loadingHideElementID = options["loadingHideElementID"];
  59. this.loadingHideElement = $("#"+this.loadingHideElementID);
  60. }
  61.  
  62. if(options["params"]){
  63. this.params = $.extend(options["params"], this.params);
  64. }
  65.  
  66. // private:
  67. // このAjaxPageLoaderオブジェクトが有効かのフラグ
  68. var enable = false;
  69. // アクセサ
  70. this.set_enabled = function(){
  71. enable = true;
  72. }
  73.  
  74. this.set_disabled = function(){
  75. enable = false;
  76. }
  77.  
  78. this.is_enabled = function(){
  79. return enable;
  80. }
  81. }
  82.  
  83. // Ajaxのリクエスト
  84. AjaxPageLoader.prototype.next_list_request = function(){
  85. if(this.loadingShowElementID){
  86. this.loadingShowElement.show();
  87. }
  88. if(this.loadingHideElementID){
  89. this.loadingHideElement.hide();
  90. }
  91.  
  92. // $.ajax内でthis.* が使えないのでコピー
  93. var ajax_page_loader = this;
  94.  
  95. $.ajax({
  96. type: this.requestMethod,
  97. url: this.request_url,
  98. dataType : 'html', // 必須項目
  99. data: this.params,
  100. success: function(receivedData){
  101. if (receivedData != "") {
  102. // 受信したデータをリストの下に追加
  103. ajax_page_loader.listAreaLastElement.after(receivedData);
  104.  
  105. // リストを更新
  106. ajax_page_loader.listAreaLastElement = $(ajax_page_loader.listAreaElementPath+":last");
  107. // 更新されたリストから次のリクエストで渡すオフセットを計算
  108. ajax_page_loader.offset = parseInt(ajax_page_loader.listAreaLastElement.attr("id"))+1;
  109.  
  110. // 次のリクエストで渡すパラメーターを更新
  111. ajax_page_loader.params.offset = ajax_page_loader.offset;
  112. // 次のリクエストのために、ステータスをOFFにする
  113. ajax_page_loader.loading = false;
  114. // 次のリクエストのために、隠していた領域を表示する
  115. if(ajax_page_loader.loadingHideElementID){
  116. ajax_page_loader.loadingHideElement.show();
  117. }
  118. }
  119. // ローディングアイコンを非表示にする
  120. if(ajax_page_loader.loadingShowElementID){
  121. ajax_page_loader.loadingShowElement.hide();
  122. }
  123. },
  124. error: function(){
  125. errMsg = "エラーが発生しました。ページを再読み込みしてください。";
  126.  
  127. if(ajax_page_loader.loadingShowElementID){
  128. ajax_page_loader.loadingShowElement.html(errMsg);
  129. }else{
  130. console.log(errMsg);
  131. }
  132. }
  133. });
  134. }
  135.  
  136. // スクロール位置をチェックして、条件を満たした時にリクエスト
  137. AjaxPageLoader.prototype.check_position = function(){
  138. if(this.is_enabled()){
  139. var currentViewingPosition = $(window).scrollTop();
  140. var loadingStartPosition = ($(document).height() - $(window).height())-500; // 一番下-先読み開始の高さ分
  141.  
  142. if((currentViewingPosition > loadingStartPosition) && !this.loading){
  143. this.loading = true;
  144. this.next_list_request();
  145. }
  146. }
  147. }
  148.  
  149. // 条件なしで、リクエストできる状況ならすぐにリクエスト
  150. AjaxPageLoader.prototype.request = function(){
  151. if(this.is_enabled() && !this.loading){
  152. this.loading = true;
  153. this.next_list_request();
  154. }
  155. }
Add Comment
Please, Sign In to add comment