j1-template 2021.1.23 → 2021.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/_includes/themes/j1/modules/connectors/survey/custom-provider.html +30 -0
- data/_includes/themes/j1/modules/connectors/survey/jotform.html +32 -0
- data/_includes/themes/j1/modules/connectors/surveys +58 -0
- data/assets/data/panel.html +1 -1
- data/assets/themes/j1/adapter/js/infiniteScroll.js +18 -16
- data/assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.min.js +17 -11
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/Gemfile +1 -1
- data/lib/starter_web/_config.yml +1 -1
- data/lib/starter_web/_includes/attributes.asciidoc +1 -1
- data/lib/starter_web/_plugins/lunr_index.rb +1 -1
- data/lib/starter_web/package.json +1 -1
- data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
- data/lib/starter_web/utilsrv/package.json +1 -1
- metadata +5 -3
- data/assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.modified.js +0 -1913
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1a367f0d5a1065a8368be490241e20c1fe1c29f860ac905b75eaa8d9100c113b
|
|
4
|
+
data.tar.gz: 62750cb4f9bf459ad504d53a26c79032be7152dca9d8b638520856e630f4924e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a1d6fca90493d2a5ff33d05996eea019a1495ba42a4eacc2963c0874cc4759c0ed028c6b8f540725fd31bf0e769fd9baef7ccc62ed1b74e6fecadd9914a320e7
|
|
7
|
+
data.tar.gz: 6892847076716ed5876b5cae69d23266180ba42aa6fec677c2fda7e5590e53e49d92e03defaea28eb92a173faa64da75c51589ead7ab82fd60c6a70b7a974125
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# ~/_includes/themes/j1/modules/connectors/comments/custom-provider.html
|
|
4
|
+
# Support of custom comment provider for J1 Template
|
|
5
|
+
#
|
|
6
|
+
# Product/Info:
|
|
7
|
+
# https://jekyll.one
|
|
8
|
+
#
|
|
9
|
+
# Copyright (C) 2021 Juergen Adams
|
|
10
|
+
#
|
|
11
|
+
# J1 Template is licensed under the MIT License.
|
|
12
|
+
# See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
|
|
13
|
+
# -----------------------------------------------------------------------------
|
|
14
|
+
# Test data:
|
|
15
|
+
# liquid_var: {{ liquid_var | debug }}
|
|
16
|
+
# -----------------------------------------------------------------------------
|
|
17
|
+
{% endcomment %}
|
|
18
|
+
|
|
19
|
+
{% comment %} Liquid procedures
|
|
20
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
21
|
+
|
|
22
|
+
{% comment %} Variables
|
|
23
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
{% comment %} Main
|
|
28
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
29
|
+
|
|
30
|
+
<!-- Your code for the custom provider goes here -->
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# ~/_includes/themes/j1/modules/connectors/comments/jotform.html
|
|
4
|
+
# Support of survey provider JOTFORM for J1 Template
|
|
5
|
+
#
|
|
6
|
+
# Product/Info:
|
|
7
|
+
# https://jekyll.one
|
|
8
|
+
#
|
|
9
|
+
# Copyright (C) 2021 Juergen Adams
|
|
10
|
+
#
|
|
11
|
+
# J1 Template is licensed under the MIT License.
|
|
12
|
+
# See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
|
|
13
|
+
# -----------------------------------------------------------------------------
|
|
14
|
+
# Test data:
|
|
15
|
+
# liquid_var: {{ liquid_var | debug }}
|
|
16
|
+
# -----------------------------------------------------------------------------
|
|
17
|
+
{% endcomment %}
|
|
18
|
+
|
|
19
|
+
{% comment %} Liquid procedures
|
|
20
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
21
|
+
|
|
22
|
+
{% comment %} Variables
|
|
23
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
{% comment %} Main
|
|
27
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
28
|
+
<!-- [INFO ] [j1.modules.connectors.jotform ] [ place the thread container: start ] -->
|
|
29
|
+
<div id="jotform"></div>
|
|
30
|
+
<!-- [INFO ] [j1.modules.connectors.jotform ] [ connector depends on the cookie consent (personalization) ] -->
|
|
31
|
+
<!-- [INFO ] [j1.modules.connectors.jotform ] [ connector (dynamic) JS is enabled/disabled on OptIn/Out ] -->
|
|
32
|
+
<!-- [INFO ] [j1.modules.connectors.jotform ] [ place the thread container: end ] -->
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{% comment %}
|
|
2
|
+
# -----------------------------------------------------------------------------
|
|
3
|
+
# ~/_includes/themes/j1/modules/connectors/surveys
|
|
4
|
+
# Liquid CONNECTOR for survey providers supported by J1 Template
|
|
5
|
+
#
|
|
6
|
+
# Product/Info:
|
|
7
|
+
# https://jekyll.one
|
|
8
|
+
#
|
|
9
|
+
# Copyright (C) 2021 Juergen Adams
|
|
10
|
+
#
|
|
11
|
+
# J1 Template is licensed under the MIT License.
|
|
12
|
+
# See: https://github.com/jekyll-one-org/J1 Template/blob/master/LICENSE
|
|
13
|
+
# -----------------------------------------------------------------------------
|
|
14
|
+
# Test data:
|
|
15
|
+
# liquid_var: {{ liquid_var | debug }}
|
|
16
|
+
# -----------------------------------------------------------------------------
|
|
17
|
+
{% endcomment %}
|
|
18
|
+
|
|
19
|
+
{% comment %} Liquid procedures
|
|
20
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
21
|
+
|
|
22
|
+
{% comment %} Variables
|
|
23
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
24
|
+
{% assign comments = site.data.j1_config.survey.enabled %}
|
|
25
|
+
{% assign comments_page = page.survey.enabled %}
|
|
26
|
+
{% assign comment_provider = site.data.j1_config.survey.provider %}
|
|
27
|
+
|
|
28
|
+
{% comment %} Main
|
|
29
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
30
|
+
|
|
31
|
+
{% comment %} Check comments settings from SITE configuration
|
|
32
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
33
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ Check comments settings from SITE configuration ] -->
|
|
34
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ detected comments (site): {{comments}} ] -->
|
|
35
|
+
|
|
36
|
+
{% comment %} Check comments settings from PAGE configuration
|
|
37
|
+
-------------------------------------------------------------------------------- {% endcomment %}
|
|
38
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ Check comments settings from PAGE configuration ] -->
|
|
39
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ detected comments (page): {{page.survey}} ] -->
|
|
40
|
+
|
|
41
|
+
{% if comments_page <> nil %}
|
|
42
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ overload comments settings from PAGE ] -->
|
|
43
|
+
{% assign comments = comments_page %}
|
|
44
|
+
{% endif %}
|
|
45
|
+
|
|
46
|
+
{% if comments %}
|
|
47
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ start processing load region head, layout: {{page.layout}} ] -->
|
|
48
|
+
{% case comment_provider %}
|
|
49
|
+
{% when "jotform" %}
|
|
50
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ place comment provider JOTFORM ] -->
|
|
51
|
+
{% include themes/{{site.template.name}}/modules/connectors/comment/disqus.html %}
|
|
52
|
+
{% when "custom" %}
|
|
53
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ place comment provider CUSTOM ] -->
|
|
54
|
+
{% include themes/{{site.template.name}}/procedures/provider/comment/custom-provider.html %}
|
|
55
|
+
{% endcase %}
|
|
56
|
+
|
|
57
|
+
{% endif %}
|
|
58
|
+
<!-- [INFO ] [j1.modules.connectors.survey ] [ end processing ] -->
|
data/assets/data/panel.html
CHANGED
|
@@ -402,7 +402,7 @@ exclude_from_search: true
|
|
|
402
402
|
<div class="row {{panel_settings.id}}">
|
|
403
403
|
<div id="{{card_id}}" class="accordion">
|
|
404
404
|
{% for list in services %}
|
|
405
|
-
<div class="card">
|
|
405
|
+
<div class="card mb-4">
|
|
406
406
|
<div class="card-header" id="headingOne">
|
|
407
407
|
<h2 class="clearfix mb-0">
|
|
408
408
|
<a class="btn btn-link collapsed" data-toggle="collapse" data-target="#{{list.service.id}}" aria-expanded="false" aria-controls="{{list.service.id}}">
|
|
@@ -124,10 +124,10 @@ j1.adapter['infiniteScroll'] = (function (j1, window) {
|
|
|
124
124
|
|
|
125
125
|
// jadams, 2021-09-12
|
|
126
126
|
//
|
|
127
|
-
var scrollOffset = 450 + 20;
|
|
127
|
+
// var scrollOffset = 450 + 20;
|
|
128
128
|
// var article_height = $('#home_news_panel-scroll-item').height();
|
|
129
|
-
var article_height = document.getElementById('home_news_panel-scroll-item').clientHeight;
|
|
130
|
-
var scrollThreshold = (article_height -200) * -1;
|
|
129
|
+
// var article_height = document.getElementById('home_news_panel-scroll-item').clientHeight;
|
|
130
|
+
// var scrollThreshold = (article_height -200) * -1;
|
|
131
131
|
|
|
132
132
|
$('#home_news_panel-scroll-group').infiniteScroll({
|
|
133
133
|
path: getPosts,
|
|
@@ -156,24 +156,26 @@ j1.adapter['infiniteScroll'] = (function (j1, window) {
|
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
$('.list-group').on( 'load.infiniteScroll', function( event, body, path, response ) {
|
|
159
|
-
var elm = document.getElementById("home_news_panel-scroll-group");
|
|
160
159
|
var logger = log4javascript.getLogger('j1.adapter.infiniteScroll');
|
|
161
160
|
var log_text = `\n loaded data from path: ${path}`;
|
|
162
161
|
logger.info(log_text);
|
|
163
162
|
|
|
164
|
-
var
|
|
165
|
-
|
|
163
|
+
//var elm = document.getElementById("home_news_panel-scroll-group");
|
|
164
|
+
//
|
|
165
|
+
// var ww = $(window).width();
|
|
166
|
+
// var wh = $(window).height();
|
|
167
|
+
//
|
|
168
|
+
// var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0)
|
|
169
|
+
// var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)
|
|
170
|
+
//
|
|
171
|
+
// var article_height = $('#home_news_panel-scroll-item').height();
|
|
172
|
+
//
|
|
173
|
+
// // if (user_agent.includes('iPad') || user_agent.includes('Windows') || user_agent.includes('OS X')) {
|
|
174
|
+
// if (user_agent.includes('Windows') || !user_agent.includes('OS X')) {
|
|
175
|
+
// // on desktops, scroll the page to view appended elements
|
|
176
|
+
// window.scrollBy(0, article_height);
|
|
177
|
+
// }
|
|
166
178
|
|
|
167
|
-
var vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0)
|
|
168
|
-
var vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0)
|
|
169
|
-
|
|
170
|
-
var article_height = $('#home_news_panel-scroll-item').height();
|
|
171
|
-
|
|
172
|
-
// if (user_agent.includes('iPad') || user_agent.includes('Windows') || user_agent.includes('OS X')) {
|
|
173
|
-
if (user_agent.includes('Windows') || !user_agent.includes('OS X')) {
|
|
174
|
-
// on desktops, scroll the page to view appended elements
|
|
175
|
-
// window.scrollBy(0, article_height);
|
|
176
|
-
}
|
|
177
179
|
});
|
|
178
180
|
|
|
179
181
|
$('.list-group').on( 'request.infiniteScroll', function( event, path, fetchPromise ) {
|
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Infinite Scroll PACKAGED v4.0.1
|
|
3
|
-
* Automatically add next page
|
|
4
|
-
*
|
|
5
|
-
* Licensed GPLv3 for open source use
|
|
6
|
-
* or Infinite Scroll Commercial License for commercial use
|
|
7
|
-
*
|
|
8
|
-
* https://infinite-scroll.com
|
|
9
|
-
* Copyright 2018-2020 Metafizzy
|
|
10
|
-
*/
|
|
11
|
-
!function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,function(t,e){let i=t.console,n=void 0===i?function(){}:function(t){i.error(t)};return function(i,o,s){(s=s||e||t.jQuery)&&(o.prototype.option||(o.prototype.option=function(t){t&&(this.options=Object.assign(this.options||{},t))}),s.fn[i]=function(t,...e){return"string"==typeof t?function(t,e,o){let r,l=`$().${i}("${e}")`;return t.each(function(t,h){let a=s.data(h,i);if(!a)return void n(`${i} not initialized.`+` Cannot call method ${l}`);let c=a[e];if(!c||"_"==e.charAt(0))return void n(`${l} is not a valid method`);let u=c.apply(a,o);r=void 0===r?u:r}),void 0!==r?r:t}(this,t,e):(r=t,this.each(function(t,e){let n=s.data(e,i);n?(n.option(r),n._init()):(n=new o(e,r),s.data(e,i,n))}),this);var r})}}),function(t,e){"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}let e=t.prototype;return e.on=function(t,e){if(!t||!e)return this;let i=this._events=this._events||{},n=i[t]=i[t]||[];return n.includes(e)||n.push(e),this},e.once=function(t,e){if(!t||!e)return this;this.on(t,e);let i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this},e.off=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;let n=i.indexOf(e);return-1!=n&&i.splice(n,1),this},e.emitEvent=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;i=i.slice(0),e=e||[];let n=this._onceEvents&&this._onceEvents[t];for(let o of i){n&&n[o]&&(this.off(t,o),delete n[o]),o.apply(this,e)}return this},e.allOff=function(){return delete this._events,delete this._onceEvents,this},t}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t):t.fizzyUIUtils=e(t)}(this,function(t){let e={extend:function(t,e){return Object.assign(t,e)},modulo:function(t,e){return(t%e+e)%e},makeArray:function(t){if(Array.isArray(t))return t;if(null==t)return[];return"object"==typeof t&&"number"==typeof t.length?[...t]:[t]},removeFrom:function(t,e){let i=t.indexOf(e);-1!=i&&t.splice(i,1)},getParent:function(t,e){for(;t.parentNode&&t!=document.body;)if((t=t.parentNode).matches(e))return t},getQueryElement:function(t){return"string"==typeof t?document.querySelector(t):t},handleEvent:function(t){let e="on"+t.type;this[e]&&this[e](t)},filterFindElements:function(t,i){return(t=e.makeArray(t)).filter(t=>t instanceof HTMLElement).reduce((t,e)=>{if(!i)return t.push(e),t;e.matches(i)&&t.push(e);let n=e.querySelectorAll(i);return t=t.concat(...n)},[])},debounceMethod:function(t,e,i){i=i||100;let n=t.prototype[e],o=e+"Timeout";t.prototype[e]=function(){clearTimeout(this[o]);let t=arguments;this[o]=setTimeout(()=>{n.apply(this,t),delete this[o]},i)}},docReady:function(t){let e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},toDashed:function(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()}},i=t.console;return e.htmlInit=function(n,o){e.docReady(function(){let s="data-"+e.toDashed(o),r=document.querySelectorAll(`[${s}]`),l=t.jQuery;[...r].forEach(t=>{let e,r=t.getAttribute(s);try{e=r&&JSON.parse(r)}catch(e){return void(i&&i.error(`Error parsing ${s} on ${t.className}: ${e}`))}let h=new n(t,e);l&&l.data(t,o,h)})})},e}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter"),require("fizzy-ui-utils")):t.InfiniteScroll=e(t,t.EvEmitter,t.fizzyUIUtils)}(window,function(t,e,i){let n=t.jQuery,o={};function s(t,e){let r=i.getQueryElement(t);if(r){if((t=r).infiniteScrollGUID){let i=o[t.infiniteScrollGUID];return i.option(e),i}this.element=t,this.options={...s.defaults},this.option(e),n&&(this.$element=n(this.element)),this.create()}else console.error("Bad element for InfiniteScroll: "+(r||t))}s.defaults={},s.create={},s.destroy={};let r=s.prototype;Object.assign(r,e.prototype);let l=0;r.create=function(){let t=this.guid=++l;if(this.element.infiniteScrollGUID=t,o[t]=this,this.pageIndex=1,this.loadCount=0,this.updateGetPath(),this.getPath&&this.getPath()){this.updateGetAbsolutePath(),this.log("initialized",[this.element.className]),this.callOnInit();for(let t in s.create)s.create[t].call(this)}else console.error("Disabling InfiniteScroll")},r.option=function(t){Object.assign(this.options,t)},r.callOnInit=function(){let t=this.options.onInit;t&&t.call(this,this)},r.dispatchEvent=function(t,e,i){this.log(t,i);let o=e?[e].concat(i):i;if(this.emitEvent(t,o),!n||!this.$element)return;let s=t+=".infiniteScroll";if(e){let i=n.Event(e);i.type=t,s=i}this.$element.trigger(s,i)};let h={initialized:t=>`on ${t}`,request:t=>`URL: ${t}`,load:(t,e)=>`${t.title||""}. URL: ${e}`,error:(t,e)=>`${t}. URL: ${e}`,append:(t,e,i)=>`${i.length} items. URL: ${e}`,last:(t,e)=>`URL: ${e}`,history:(t,e)=>`URL: ${e}`,pageIndex:function(t,e){return`current page determined to be: ${t} from ${e}`}};r.log=function(t,e){if(!this.options.debug)return;let i=`[InfiniteScroll] ${t}`,n=h[t];n&&(i+=". "+n.apply(this,e)),console.log(i)},r.updateMeasurements=function(){this.windowHeight=t.innerHeight;let e=this.element.getBoundingClientRect();this.top=e.top+t.scrollY},r.updateScroller=function(){let e=this.options.elementScroll;if(e){if(this.scroller=!0===e?this.element:i.getQueryElement(e),!this.scroller)throw new Error(`Unable to find elementScroll: ${e}`)}else this.scroller=t},r.updateGetPath=function(){let t=this.options.path;if(!t)return void console.error(`InfiniteScroll path option required. Set as: ${t}`);let e=typeof t;"function"!=e?"string"==e&&t.match("{{#}}")?this.updateGetPathTemplate(t):this.updateGetPathSelector(t):this.getPath=t},r.updateGetPathTemplate=function(t){this.getPath=(()=>{let e=this.pageIndex+1;return t.replace("{{#}}",e)});let e=t.replace(/(\\\?|\?)/,"\\?").replace("{{#}}","(\\d\\d?\\d?)"),i=new RegExp(e),n=location.href.match(i);n&&(this.pageIndex=parseInt(n[1],10),this.log("pageIndex",[this.pageIndex,"template string"]))};let a=[/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/],c=s.getPathParts=function(t){if(t)for(let e of a){let i=t.match(e);if(i){let[,t,e,n]=i;return{begin:t,index:e,end:n}}}};r.updateGetPathSelector=function(t){let e=document.querySelector(t);if(!e)return void console.error(`Bad InfiniteScroll path option. Next link not found: ${t}`);let i=e.getAttribute("href"),n=c(i);if(!n)return void console.error(`InfiniteScroll unable to parse next link href: ${i}`);let{begin:o,index:s,end:r}=n;this.isPathSelector=!0,this.getPath=(()=>o+(this.pageIndex+1)+r),this.pageIndex=parseInt(s,10)-1,this.log("pageIndex",[this.pageIndex,"next link"])},r.updateGetAbsolutePath=function(){let t=this.getPath();if(t.match(/^http/)||t.match(/^\//))return void(this.getAbsolutePath=this.getPath);let{pathname:e}=location,i=t.match(/^\?/),n=e.substring(0,e.lastIndexOf("/")),o=i?e:n+"/";this.getAbsolutePath=(()=>o+this.getPath())},s.create.hideNav=function(){let t=i.getQueryElement(this.options.hideNav);t&&(t.style.display="none",this.nav=t)},s.destroy.hideNav=function(){this.nav&&(this.nav.style.display="")},r.destroy=function(){this.allOff();for(let t in s.destroy)s.destroy[t].call(this);delete this.element.infiniteScrollGUID,delete o[this.guid],n&&this.$element&&n.removeData(this.element,"infiniteScroll")},s.throttle=function(t,e){let i,n;return e=e||200,function(){let o=+new Date,s=arguments,r=()=>{i=o,t.apply(this,s)};i&&o<i+e?(clearTimeout(n),n=setTimeout(r,e)):r()}},s.data=function(t){let e=(t=i.getQueryElement(t))&&t.infiniteScrollGUID;return e&&o[e]},s.setJQuery=function(t){n=t},i.htmlInit(s,"infinite-scroll"),r._init=function(){};let{jQueryBridget:u}=t;return n&&u&&u("infiniteScroll",s,n),s}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core")):e(t,t.InfiniteScroll)}(window,function(t,e){let i=e.prototype;Object.assign(e.defaults,{loadOnScroll:!0,checkLastPage:!0,responseBody:"text",domParseResponse:!0}),e.create.pageLoad=function(){this.canLoad=!0,this.on("scrollThreshold",this.onScrollThresholdLoad),this.on("load",this.checkLastPage),this.options.outlayer&&this.on("append",this.onAppendOutlayer)},i.onScrollThresholdLoad=function(){this.options.loadOnScroll&&this.loadNextPage()};let n=new DOMParser;function o(t){let e=document.createDocumentFragment();return t&&e.append(...t),e}return i.loadNextPage=function(){if(this.isLoading||!this.canLoad)return;let{responseBody:t,domParseResponse:e,fetchOptions:i}=this.options,o=this.getAbsolutePath();this.isLoading=!0,"function"==typeof i&&(i=i());let s=fetch(o,i).then(i=>{if(!i.ok){let t=new Error(i.statusText);return this.onPageError(t,o,i),{response:i}}return i[t]().then(s=>{return"text"==t&&e&&(s=n.parseFromString(s,"text/html")),204==i.status?(this.lastPageReached(s,o),{body:s,response:i}):this.onPageLoad(s,o,i)})}).catch(t=>{this.onPageError(t,o)});return this.dispatchEvent("request",null,[o,s]),s},i.onPageLoad=function(t,e,i){return this.options.append||(this.isLoading=!1),this.pageIndex++,this.loadCount++,this.dispatchEvent("load",null,[t,e,i]),this.appendNextPage(t,e,i)},i.appendNextPage=function(t,e,i){let{append:n,responseBody:s,domParseResponse:r}=this.options;if(!("text"==s&&r)||!n)return{body:t,response:i};let l=t.querySelectorAll(n),h={body:t,response:i,items:l};if(!l||!l.length)return this.lastPageReached(t,e),h;let a=o(l),c=()=>(this.appendItems(l,a),this.isLoading=!1,this.dispatchEvent("append",null,[t,e,l,i]),h);return this.options.outlayer?this.appendOutlayerItems(a,c):c()},i.appendItems=function(t,e){t&&t.length&&(function(t){let e=t.querySelectorAll("script");for(let t of e){let e=document.createElement("script"),i=t.attributes;for(let t of i)e.setAttribute(t.name,t.value);e.innerHTML=t.innerHTML,t.parentNode.replaceChild(e,t)}}(e=e||o(t)),this.element.appendChild(e))},i.appendOutlayerItems=function(i,n){let o=e.imagesLoaded||t.imagesLoaded;return o?new Promise(function(t){o(i,function(){let e=n();t(e)})}):(console.error("[InfiniteScroll] imagesLoaded required for outlayer option"),void(this.isLoading=!1))},i.onAppendOutlayer=function(t,e,i){this.options.outlayer.appended(i)},i.checkLastPage=function(t,e){let i,{checkLastPage:n,path:o}=this.options;if(n){if("function"==typeof o){if(!this.getPath())return void this.lastPageReached(t,e)}"string"==typeof n?i=n:this.isPathSelector&&(i=o),i&&t.querySelector&&(t.querySelector(i)||this.lastPageReached(t,e))}},i.lastPageReached=function(t,e){this.canLoad=!1,this.dispatchEvent("last",null,[t,e])},i.onPageError=function(t,e,i){return this.isLoading=!1,this.canLoad=!1,this.dispatchEvent("error",null,[t,e,i]),t},e.create.prefill=function(){if(!this.options.prefill)return;let t=this.options.append;t?(this.updateMeasurements(),this.updateScroller(),this.isPrefilling=!0,this.on("append",this.prefill),this.once("error",this.stopPrefill),this.once("last",this.stopPrefill),this.prefill()):console.error(`append option required for prefill. Set as :${t}`)},i.prefill=function(){let t=this.getPrefillDistance();this.isPrefilling=t>=0,this.isPrefilling?(this.log("prefill"),this.loadNextPage()):this.stopPrefill()},i.getPrefillDistance=function(){return this.options.elementScroll?this.scroller.clientHeight-this.scroller.scrollHeight:this.windowHeight-this.element.clientHeight},i.stopPrefill=function(){this.log("stopPrefill"),this.off("append",this.prefill)},e}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){let n=e.prototype;return Object.assign(e.defaults,{scrollThreshold:400}),e.create.scrollWatch=function(){this.pageScrollHandler=this.onPageScroll.bind(this),this.resizeHandler=this.onResize.bind(this);let t=this.options.scrollThreshold;(t||0===t)&&this.enableScrollWatch()},e.destroy.scrollWatch=function(){this.disableScrollWatch()},n.enableScrollWatch=function(){this.isScrollWatching||(this.isScrollWatching=!0,this.updateMeasurements(),this.updateScroller(),this.on("last",this.disableScrollWatch),this.bindScrollWatchEvents(!0))},n.disableScrollWatch=function(){this.isScrollWatching&&(this.bindScrollWatchEvents(!1),delete this.isScrollWatching)},n.bindScrollWatchEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.pageScrollHandler),t[i]("resize",this.resizeHandler)},n.onPageScroll=e.throttle(function(){this.getBottomDistance()<=this.options.scrollThreshold&&this.dispatchEvent("scrollThreshold")}),n.getBottomDistance=function(){let e,i;return this.options.elementScroll?(e=this.scroller.scrollHeight,i=this.scroller.scrollTop+this.scroller.clientHeight):(e=this.top+this.element.clientHeight,i=t.scrollY+this.windowHeight),e-i+this.options.scrollOffset},n.onResize=function(){this.updateMeasurements()},i.debounceMethod(e,"onResize",150),e}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){let n=e.prototype;Object.assign(e.defaults,{history:"replace"});let o=document.createElement("a");return e.create.history=function(){if(!this.options.history)return;o.href=this.getAbsolutePath(),(o.origin||o.protocol+"//"+o.host)==location.origin?this.options.append?this.createHistoryAppend():this.createHistoryPageLoad():console.error("[InfiniteScroll] cannot set history with different origin: "+`${o.origin} on ${location.origin} . History behavior disabled.`)},n.createHistoryAppend=function(){this.updateMeasurements(),this.updateScroller(),this.scrollPages=[{top:0,path:location.href,title:document.title}],this.scrollPage=this.scrollPages[0],this.scrollHistoryHandler=this.onScrollHistory.bind(this),this.unloadHandler=this.onUnload.bind(this),this.scroller.addEventListener("scroll",this.scrollHistoryHandler),this.on("append",this.onAppendHistory),this.bindHistoryAppendEvents(!0)},n.bindHistoryAppendEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.scrollHistoryHandler),t[i]("unload",this.unloadHandler)},n.createHistoryPageLoad=function(){this.on("load",this.onPageLoadHistory)},e.destroy.history=n.destroyHistory=function(){this.options.history&&this.options.append&&this.bindHistoryAppendEvents(!1)},n.onAppendHistory=function(t,e,i){if(!i||!i.length)return;let n=i[0],s=this.getElementScrollY(n);o.href=e,this.scrollPages.push({top:s,path:o.href,title:t.title})},n.getElementScrollY=function(e){if(this.options.elementScroll)return e.offsetTop-this.top;return e.getBoundingClientRect().top+t.scrollY},n.onScrollHistory=function(){let t=this.getClosestScrollPage();t!=this.scrollPage&&(this.scrollPage=t,this.setHistory(t.title,t.path))},i.debounceMethod(e,"onScrollHistory",150),n.getClosestScrollPage=function(){let e,i;e=this.options.elementScroll?this.scroller.scrollTop+this.scroller.clientHeight/2:t.scrollY+this.windowHeight/2;for(let t of this.scrollPages){if(t.top>=e)break;i=t}return i},n.setHistory=function(t,e){let i=this.options.history;i&&history[i+"State"]&&(history[i+"State"](null,t,e),this.options.historyTitle&&(document.title=t),this.dispatchEvent("history",null,[t,e]))},n.onUnload=function(){if(0===this.scrollPage.top)return;let e=t.scrollY-this.scrollPage.top+this.top;this.destroyHistory(),scrollTo(0,e)},n.onPageLoadHistory=function(t,e){this.setHistory(t.title,e)},e}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){class n{constructor(t,e){this.element=t,this.infScroll=e,this.clickHandler=this.onClick.bind(this),this.element.addEventListener("click",this.clickHandler),e.on("request",this.disable.bind(this)),e.on("load",this.enable.bind(this)),e.on("error",this.hide.bind(this)),e.on("last",this.hide.bind(this))}onClick(t){t.preventDefault(),this.infScroll.loadNextPage()}enable(){this.element.removeAttribute("disabled")}disable(){this.element.disabled="disabled"}hide(){this.element.style.display="none"}destroy(){this.element.removeEventListener("click",this.clickHandler)}}return e.create.button=function(){let t=i.getQueryElement(this.options.button);t&&(this.button=new n(t,this))},e.destroy.button=function(){this.button&&this.button.destroy()},e.Button=n,e}),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,function(t,e,i){let n=e.prototype;function o(t){r(t,"none")}function s(t){r(t,"block")}function r(t,e){t&&(t.style.display=e)}return e.create.status=function(){let t=i.getQueryElement(this.options.status);t&&(this.statusElement=t,this.statusEventElements={request:t.querySelector(".infinite-scroll-request"),error:t.querySelector(".infinite-scroll-error"),last:t.querySelector(".infinite-scroll-last")},this.on("request",this.showRequestStatus),this.on("error",this.showErrorStatus),this.on("last",this.showLastStatus),this.bindHideStatus("on"))},n.bindHideStatus=function(t){let e=this.options.append?"append":"load";this[t](e,this.hideAllStatus)},n.showRequestStatus=function(){this.showStatus("request")},n.showErrorStatus=function(){this.showStatus("error")},n.showLastStatus=function(){this.showStatus("last"),this.bindHideStatus("off")},n.showStatus=function(t){s(this.statusElement),this.hideStatusEventElements(),s(this.statusEventElements[t])},n.hideAllStatus=function(){o(this.statusElement),this.hideStatusEventElements()},n.hideStatusEventElements=function(){for(let t in this.statusEventElements){o(this.statusEventElements[t])}},e}),function(t,e){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(i){return e(t,i)}):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,function(t,e){"use strict";var i=t.jQuery,n=t.console;function o(t,e){for(var i in e)t[i]=e[i];return t}var s=Array.prototype.slice;function r(t,e,l){if(!(this instanceof r))return new r(t,e,l);var h,a=t;("string"==typeof t&&(a=document.querySelectorAll(t)),a)?(this.elements=(h=a,Array.isArray(h)?h:"object"==typeof h&&"number"==typeof h.length?s.call(h):[h]),this.options=o({},this.options),"function"==typeof e?l=e:o(this.options,e),l&&this.on("always",l),this.getImages(),i&&(this.jqDeferred=new i.Deferred),setTimeout(this.check.bind(this))):n.error("Bad element for imagesLoaded "+(a||t))}r.prototype=Object.create(e.prototype),r.prototype.options={},r.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},r.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),!0===this.options.background&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&l[e]){for(var i=t.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var s=t.querySelectorAll(this.options.background);for(n=0;n<s.length;n++){var r=s[n];this.addElementBackgroundImages(r)}}}};var l={1:!0,9:!0,11:!0};function h(t){this.img=t}function a(t,e){this.url=t,this.element=e,this.img=new Image}return r.prototype.addElementBackgroundImages=function(t){var e=getComputedStyle(t);if(e)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(e.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,t),n=i.exec(e.backgroundImage)}},r.prototype.addImage=function(t){var e=new h(t);this.images.push(e)},r.prototype.addBackground=function(t,e){var i=new a(t,e);this.images.push(i)},r.prototype.check=function(){var t=this;function e(e,i,n){setTimeout(function(){t.progress(e,i,n)})}this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?this.images.forEach(function(t){t.once("progress",e),t.check()}):this.complete()},r.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&n&&n.log("progress: "+i,t,e)},r.prototype.complete=function(){var t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){var e=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[e](this)}},h.prototype=Object.create(e.prototype),h.prototype.check=function(){this.getIsImageComplete()?this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.proxyImage.src=this.img.src)},h.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},h.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.img,e])},h.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},h.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},h.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},h.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},a.prototype=Object.create(h.prototype),a.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url,this.getIsImageComplete()&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},a.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},a.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},r.makeJQueryPlugin=function(e){(e=e||t.jQuery)&&((i=e).fn.imagesLoaded=function(t,e){return new r(this,t,e).jqDeferred.promise(i(this))})},r.makeJQueryPlugin(),r});
|
|
1
|
+
/*!
|
|
2
|
+
* Infinite Scroll PACKAGED v4.0.1
|
|
3
|
+
* Automatically add next page
|
|
4
|
+
*
|
|
5
|
+
* Licensed GPLv3 for open source use
|
|
6
|
+
* or Infinite Scroll Commercial License for commercial use
|
|
7
|
+
*
|
|
8
|
+
* https://infinite-scroll.com
|
|
9
|
+
* Copyright 2018-2020 Metafizzy
|
|
10
|
+
*/
|
|
11
|
+
!function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("jquery")):t.jQueryBridget=e(t,t.jQuery)}(window,(function(t,e){let i=t.console,n=void 0===i?function(){}:function(t){i.error(t)};return function(i,o,s){(s=s||e||t.jQuery)&&(o.prototype.option||(o.prototype.option=function(t){t&&(this.options=Object.assign(this.options||{},t))}),s.fn[i]=function(t,...e){return"string"==typeof t?function(t,e,o){let r,l=`$().${i}("${e}")`;return t.each((function(t,h){let a=s.data(h,i);if(!a)return void n(`${i} not initialized. Cannot call method ${l}`);let c=a[e];if(!c||"_"==e.charAt(0))return void n(`${l} is not a valid method`);let u=c.apply(a,o);r=void 0===r?u:r})),void 0!==r?r:t}(this,t,e):(r=t,this.each((function(t,e){let n=s.data(e,i);n?(n.option(r),n._init()):(n=new o(e,r),s.data(e,i,n))})),this);var r})}})),function(t,e){"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,(function(){function t(){}let e=t.prototype;return e.on=function(t,e){if(!t||!e)return this;let i=this._events=this._events||{},n=i[t]=i[t]||[];return n.includes(e)||n.push(e),this},e.once=function(t,e){if(!t||!e)return this;this.on(t,e);let i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this},e.off=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;let n=i.indexOf(e);return-1!=n&&i.splice(n,1),this},e.emitEvent=function(t,e){let i=this._events&&this._events[t];if(!i||!i.length)return this;i=i.slice(0),e=e||[];let n=this._onceEvents&&this._onceEvents[t];for(let o of i){n&&n[o]&&(this.off(t,o),delete n[o]),o.apply(this,e)}return this},e.allOff=function(){return delete this._events,delete this._onceEvents,this},t})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t):t.fizzyUIUtils=e(t)}(this,(function(t){let e={extend:function(t,e){return Object.assign(t,e)},modulo:function(t,e){return(t%e+e)%e},makeArray:function(t){if(Array.isArray(t))return t;if(null==t)return[];return"object"==typeof t&&"number"==typeof t.length?[...t]:[t]},removeFrom:function(t,e){let i=t.indexOf(e);-1!=i&&t.splice(i,1)},getParent:function(t,e){for(;t.parentNode&&t!=document.body;)if((t=t.parentNode).matches(e))return t},getQueryElement:function(t){return"string"==typeof t?document.querySelector(t):t},handleEvent:function(t){let e="on"+t.type;this[e]&&this[e](t)},filterFindElements:function(t,i){return(t=e.makeArray(t)).filter((t=>t instanceof HTMLElement)).reduce(((t,e)=>{if(!i)return t.push(e),t;e.matches(i)&&t.push(e);let n=e.querySelectorAll(i);return t=t.concat(...n)}),[])},debounceMethod:function(t,e,i){i=i||100;let n=t.prototype[e],o=e+"Timeout";t.prototype[e]=function(){clearTimeout(this[o]);let t=arguments;this[o]=setTimeout((()=>{n.apply(this,t),delete this[o]}),i)}},docReady:function(t){let e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},toDashed:function(t){return t.replace(/(.)([A-Z])/g,(function(t,e,i){return e+"-"+i})).toLowerCase()}},i=t.console;return e.htmlInit=function(n,o){e.docReady((function(){let s="data-"+e.toDashed(o),r=document.querySelectorAll(`[${s}]`),l=t.jQuery;[...r].forEach((t=>{let e,r=t.getAttribute(s);try{e=r&&JSON.parse(r)}catch(e){return void(i&&i.error(`Error parsing ${s} on ${t.className}: ${e}`))}let h=new n(t,e);l&&l.data(t,o,h)}))}))},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter"),require("fizzy-ui-utils")):t.InfiniteScroll=e(t,t.EvEmitter,t.fizzyUIUtils)}(window,(function(t,e,i){let n=t.jQuery,o={};function s(t,e){let r=i.getQueryElement(t);if(r){if((t=r).infiniteScrollGUID){let i=o[t.infiniteScrollGUID];return i.option(e),i}this.element=t,this.options={...s.defaults},this.option(e),n&&(this.$element=n(this.element)),this.create()}else console.error("Bad element for InfiniteScroll: "+(r||t))}s.defaults={},s.create={},s.destroy={};let r=s.prototype;Object.assign(r,e.prototype);let l=0;r.create=function(){let t=this.guid=++l;if(this.element.infiniteScrollGUID=t,o[t]=this,this.pageIndex=1,this.loadCount=0,this.updateGetPath(),this.getPath&&this.getPath()){this.updateGetAbsolutePath(),this.log("initialized",[this.element.className]),this.callOnInit();for(let t in s.create)s.create[t].call(this)}else console.error("Disabling InfiniteScroll")},r.option=function(t){Object.assign(this.options,t)},r.callOnInit=function(){let t=this.options.onInit;t&&t.call(this,this)},r.dispatchEvent=function(t,e,i){this.log(t,i);let o=e?[e].concat(i):i;if(this.emitEvent(t,o),!n||!this.$element)return;let s=t+=".infiniteScroll";if(e){let i=n.Event(e);i.type=t,s=i}this.$element.trigger(s,i)};let h={initialized:t=>`on ${t}`,request:t=>`URL: ${t}`,load:(t,e)=>`${t.title||""}. URL: ${e}`,error:(t,e)=>`${t}. URL: ${e}`,append:(t,e,i)=>`${i.length} items. URL: ${e}`,last:(t,e)=>`URL: ${e}`,history:(t,e)=>`URL: ${e}`,pageIndex:function(t,e){return`current page determined to be: ${t} from ${e}`}};r.log=function(t,e){if(!this.options.debug)return;let i=`[InfiniteScroll] ${t}`,n=h[t];n&&(i+=". "+n.apply(this,e)),console.log(i)},r.updateMeasurements=function(){this.windowHeight=t.innerHeight;let e=this.element.getBoundingClientRect();this.top=e.top+t.scrollY},r.updateScroller=function(){let e=this.options.elementScroll;if(e){if(this.scroller=!0===e?this.element:i.getQueryElement(e),!this.scroller)throw new Error(`Unable to find elementScroll: ${e}`)}else this.scroller=t},r.updateGetPath=function(){let t=this.options.path;if(!t)return void console.error(`InfiniteScroll path option required. Set as: ${t}`);let e=typeof t;"function"!=e?"string"==e&&t.match("{{#}}")?this.updateGetPathTemplate(t):this.updateGetPathSelector(t):this.getPath=t},r.updateGetPathTemplate=function(t){this.getPath=()=>{let e=this.pageIndex+1;return t.replace("{{#}}",e)};let e=t.replace(/(\\\?|\?)/,"\\?").replace("{{#}}","(\\d\\d?\\d?)"),i=new RegExp(e),n=location.href.match(i);n&&(this.pageIndex=parseInt(n[1],10),this.log("pageIndex",[this.pageIndex,"template string"]))};let a=[/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/],c=s.getPathParts=function(t){if(t)for(let e of a){let i=t.match(e);if(i){let[,t,e,n]=i;return{begin:t,index:e,end:n}}}};r.updateGetPathSelector=function(t){let e=document.querySelector(t);if(!e)return void console.error(`Bad InfiniteScroll path option. Next link not found: ${t}`);let i=e.getAttribute("href"),n=c(i);if(!n)return void console.error(`InfiniteScroll unable to parse next link href: ${i}`);let{begin:o,index:s,end:r}=n;this.isPathSelector=!0,this.getPath=()=>o+(this.pageIndex+1)+r,this.pageIndex=parseInt(s,10)-1,this.log("pageIndex",[this.pageIndex,"next link"])},r.updateGetAbsolutePath=function(){let t=this.getPath();if(t.match(/^http/)||t.match(/^\//))return void(this.getAbsolutePath=this.getPath);let{pathname:e}=location,i=t.match(/^\?/),n=e.substring(0,e.lastIndexOf("/")),o=i?e:n+"/";this.getAbsolutePath=()=>o+this.getPath()},s.create.hideNav=function(){let t=i.getQueryElement(this.options.hideNav);t&&(t.style.display="none",this.nav=t)},s.destroy.hideNav=function(){this.nav&&(this.nav.style.display="")},r.destroy=function(){this.allOff();for(let t in s.destroy)s.destroy[t].call(this);delete this.element.infiniteScrollGUID,delete o[this.guid],n&&this.$element&&n.removeData(this.element,"infiniteScroll")},s.throttle=function(t,e){let i,n;return e=e||200,function(){let o=+new Date,s=arguments,r=()=>{i=o,t.apply(this,s)};i&&o<i+e?(clearTimeout(n),n=setTimeout(r,e)):r()}},s.data=function(t){let e=(t=i.getQueryElement(t))&&t.infiniteScrollGUID;return e&&o[e]},s.setJQuery=function(t){n=t},i.htmlInit(s,"infinite-scroll"),r._init=function(){};let{jQueryBridget:u}=t;return n&&u&&u("infiniteScroll",s,n),s})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core")):e(t,t.InfiniteScroll)}(window,(function(t,e){let i=e.prototype;Object.assign(e.defaults,{loadOnScroll:!0,checkLastPage:!0,responseBody:"text",domParseResponse:!0}),e.create.pageLoad=function(){this.canLoad=!0,this.on("scrollThreshold",this.onScrollThresholdLoad),this.on("load",this.checkLastPage),this.options.outlayer&&this.on("append",this.onAppendOutlayer)},i.onScrollThresholdLoad=function(){this.options.loadOnScroll&&this.loadNextPage()};let n=new DOMParser;function o(t){let e=document.createDocumentFragment();return t&&e.append(...t),e}return i.loadNextPage=function(){if(this.isLoading||!this.canLoad)return;let{responseBody:t,domParseResponse:e,fetchOptions:i}=this.options,o=this.getAbsolutePath();this.isLoading=!0,"function"==typeof i&&(i=i());let s=fetch(o,i).then((i=>{if(!i.ok){let t=new Error(i.statusText);return this.onPageError(t,o,i),{response:i}}return i[t]().then((s=>("text"==t&&e&&(s=n.parseFromString(s,"text/html")),204==i.status?(this.lastPageReached(s,o),{body:s,response:i}):this.onPageLoad(s,o,i))))})).catch((t=>{this.onPageError(t,o)}));return this.dispatchEvent("request",null,[o,s]),s},i.onPageLoad=function(t,e,i){return this.options.append||(this.isLoading=!1),this.pageIndex++,this.loadCount++,this.dispatchEvent("load",null,[t,e,i]),this.appendNextPage(t,e,i)},i.appendNextPage=function(t,e,i){let{append:n,responseBody:s,domParseResponse:r}=this.options;if(!("text"==s&&r)||!n)return{body:t,response:i};let l=t.querySelectorAll(n),h={body:t,response:i,items:l};if(!l||!l.length)return this.lastPageReached(t,e),h;let a=o(l),c=()=>(this.appendItems(l,a),this.isLoading=!1,this.dispatchEvent("append",null,[t,e,l,i]),h);return this.options.outlayer?this.appendOutlayerItems(a,c):c()},i.appendItems=function(t,e){t&&t.length&&(function(t){let e=t.querySelectorAll("script");for(let t of e){let e=document.createElement("script"),i=t.attributes;for(let t of i)e.setAttribute(t.name,t.value);e.innerHTML=t.innerHTML,t.parentNode.replaceChild(e,t)}}(e=e||o(t)),this.element.appendChild(e))},i.appendOutlayerItems=function(i,n){let o=e.imagesLoaded||t.imagesLoaded;return o?new Promise((function(t){o(i,(function(){let e=n();t(e)}))})):(console.error("[InfiniteScroll] imagesLoaded required for outlayer option"),void(this.isLoading=!1))},i.onAppendOutlayer=function(t,e,i){this.options.outlayer.appended(i)},i.checkLastPage=function(t,e){let i,{checkLastPage:n,path:o}=this.options;if(n){if("function"==typeof o){if(!this.getPath())return void this.lastPageReached(t,e)}"string"==typeof n?i=n:this.isPathSelector&&(i=o),i&&t.querySelector&&(t.querySelector(i)||this.lastPageReached(t,e))}},i.lastPageReached=function(t,e){this.canLoad=!1,this.dispatchEvent("last",null,[t,e])},i.onPageError=function(t,e,i){return this.isLoading=!1,this.canLoad=!1,this.dispatchEvent("error",null,[t,e,i]),t},e.create.prefill=function(){if(!this.options.prefill)return;let t=this.options.append;t?(this.updateMeasurements(),this.updateScroller(),this.isPrefilling=!0,this.on("append",this.prefill),this.once("error",this.stopPrefill),this.once("last",this.stopPrefill),this.prefill()):console.error(`append option required for prefill. Set as :${t}`)},i.prefill=function(){let t=this.getPrefillDistance();this.isPrefilling=t>=0,this.isPrefilling?(this.log("prefill"),this.loadNextPage()):this.stopPrefill()},i.getPrefillDistance=function(){return this.options.elementScroll?this.scroller.clientHeight-this.scroller.scrollHeight:this.windowHeight-this.element.clientHeight},i.stopPrefill=function(){this.log("stopPrefill"),this.off("append",this.prefill)},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;return Object.assign(e.defaults,{scrollThreshold:400}),e.create.scrollWatch=function(){this.pageScrollHandler=this.onPageScroll.bind(this),this.resizeHandler=this.onResize.bind(this);let t=this.options.scrollThreshold;(t||0===t)&&this.enableScrollWatch()},e.destroy.scrollWatch=function(){this.disableScrollWatch()},n.enableScrollWatch=function(){this.isScrollWatching||(this.isScrollWatching=!0,this.updateMeasurements(),this.updateScroller(),this.on("last",this.disableScrollWatch),this.bindScrollWatchEvents(!0))},n.disableScrollWatch=function(){this.isScrollWatching&&(this.bindScrollWatchEvents(!1),delete this.isScrollWatching)},n.bindScrollWatchEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.pageScrollHandler),t[i]("resize",this.resizeHandler)},n.onPageScroll=e.throttle((function(){this.getBottomDistance()<=this.options.scrollThreshold&&this.dispatchEvent("scrollThreshold")})),n.getBottomDistance=function(){let e,i;return this.options.elementScroll?(e=this.scroller.scrollHeight,i=this.scroller.scrollTop+this.scroller.clientHeight):(e=this.top+this.element.clientHeight,i=t.scrollY+this.windowHeight),e-i},n.onResize=function(){this.updateMeasurements()},i.debounceMethod(e,"onResize",150),e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;Object.assign(e.defaults,{history:"replace"});let o=document.createElement("a");return e.create.history=function(){if(!this.options.history)return;o.href=this.getAbsolutePath(),(o.origin||o.protocol+"//"+o.host)==location.origin?this.options.append?this.createHistoryAppend():this.createHistoryPageLoad():console.error(`[InfiniteScroll] cannot set history with different origin: ${o.origin} on ${location.origin} . History behavior disabled.`)},n.createHistoryAppend=function(){this.updateMeasurements(),this.updateScroller(),this.scrollPages=[{top:0,path:location.href,title:document.title}],this.scrollPage=this.scrollPages[0],this.scrollHistoryHandler=this.onScrollHistory.bind(this),this.unloadHandler=this.onUnload.bind(this),this.scroller.addEventListener("scroll",this.scrollHistoryHandler),this.on("append",this.onAppendHistory),this.bindHistoryAppendEvents(!0)},n.bindHistoryAppendEvents=function(e){let i=e?"addEventListener":"removeEventListener";this.scroller[i]("scroll",this.scrollHistoryHandler),t[i]("unload",this.unloadHandler)},n.createHistoryPageLoad=function(){this.on("load",this.onPageLoadHistory)},e.destroy.history=n.destroyHistory=function(){this.options.history&&this.options.append&&this.bindHistoryAppendEvents(!1)},n.onAppendHistory=function(t,e,i){if(!i||!i.length)return;let n=i[0],s=this.getElementScrollY(n);o.href=e,this.scrollPages.push({top:s,path:o.href,title:t.title})},n.getElementScrollY=function(e){if(this.options.elementScroll)return e.offsetTop-this.top;return e.getBoundingClientRect().top+t.scrollY},n.onScrollHistory=function(){let t=this.getClosestScrollPage();t!=this.scrollPage&&(this.scrollPage=t,this.setHistory(t.title,t.path))},i.debounceMethod(e,"onScrollHistory",150),n.getClosestScrollPage=function(){let e,i;e=this.options.elementScroll?this.scroller.scrollTop+this.scroller.clientHeight/2:t.scrollY+this.windowHeight/2;for(let t of this.scrollPages){if(t.top>=e)break;i=t}return i},n.setHistory=function(t,e){let i=this.options.history;i&&history[i+"State"]&&(history[i+"State"](null,t,e),this.options.historyTitle&&(document.title=t),this.dispatchEvent("history",null,[t,e]))},n.onUnload=function(){if(0===this.scrollPage.top)return;let e=t.scrollY-this.scrollPage.top+this.top;this.destroyHistory(),scrollTo(0,e)},n.onPageLoadHistory=function(t,e){this.setHistory(t.title,e)},e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){class n{constructor(t,e){this.element=t,this.infScroll=e,this.clickHandler=this.onClick.bind(this),this.element.addEventListener("click",this.clickHandler),e.on("request",this.disable.bind(this)),e.on("load",this.enable.bind(this)),e.on("error",this.hide.bind(this)),e.on("last",this.hide.bind(this))}onClick(t){t.preventDefault(),this.infScroll.loadNextPage()}enable(){this.element.removeAttribute("disabled")}disable(){this.element.disabled="disabled"}hide(){this.element.style.display="none"}destroy(){this.element.removeEventListener("click",this.clickHandler)}}return e.create.button=function(){let t=i.getQueryElement(this.options.button);t&&(this.button=new n(t,this))},e.destroy.button=function(){this.button&&this.button.destroy()},e.Button=n,e})),function(t,e){"object"==typeof module&&module.exports?module.exports=e(t,require("./core"),require("fizzy-ui-utils")):e(t,t.InfiniteScroll,t.fizzyUIUtils)}(window,(function(t,e,i){let n=e.prototype;function o(t){r(t,"none")}function s(t){r(t,"block")}function r(t,e){t&&(t.style.display=e)}return e.create.status=function(){let t=i.getQueryElement(this.options.status);t&&(this.statusElement=t,this.statusEventElements={request:t.querySelector(".infinite-scroll-request"),error:t.querySelector(".infinite-scroll-error"),last:t.querySelector(".infinite-scroll-last")},this.on("request",this.showRequestStatus),this.on("error",this.showErrorStatus),this.on("last",this.showLastStatus),this.bindHideStatus("on"))},n.bindHideStatus=function(t){let e=this.options.append?"append":"load";this[t](e,this.hideAllStatus)},n.showRequestStatus=function(){this.showStatus("request")},n.showErrorStatus=function(){this.showStatus("error")},n.showLastStatus=function(){this.showStatus("last"),this.bindHideStatus("off")},n.showStatus=function(t){s(this.statusElement),this.hideStatusEventElements(),s(this.statusEventElements[t])},n.hideAllStatus=function(){o(this.statusElement),this.hideStatusEventElements()},n.hideStatusEventElements=function(){for(let t in this.statusEventElements){o(this.statusEventElements[t])}},e})),
|
|
12
|
+
/*!
|
|
13
|
+
* imagesLoaded v4.1.4
|
|
14
|
+
* JavaScript is all like "You images are done yet or what?"
|
|
15
|
+
* MIT License
|
|
16
|
+
*/
|
|
17
|
+
function(t,e){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],(function(i){return e(t,i)})):"object"==typeof module&&module.exports?module.exports=e(t,require("ev-emitter")):t.imagesLoaded=e(t,t.EvEmitter)}("undefined"!=typeof window?window:this,(function(t,e){"use strict";var i=t.jQuery,n=t.console;function o(t,e){for(var i in e)t[i]=e[i];return t}var s=Array.prototype.slice;function r(t,e,l){if(!(this instanceof r))return new r(t,e,l);var h,a=t;("string"==typeof t&&(a=document.querySelectorAll(t)),a)?(this.elements=(h=a,Array.isArray(h)?h:"object"==typeof h&&"number"==typeof h.length?s.call(h):[h]),this.options=o({},this.options),"function"==typeof e?l=e:o(this.options,e),l&&this.on("always",l),this.getImages(),i&&(this.jqDeferred=new i.Deferred),setTimeout(this.check.bind(this))):n.error("Bad element for imagesLoaded "+(a||t))}r.prototype=Object.create(e.prototype),r.prototype.options={},r.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},r.prototype.addElementImages=function(t){"IMG"==t.nodeName&&this.addImage(t),!0===this.options.background&&this.addElementBackgroundImages(t);var e=t.nodeType;if(e&&l[e]){for(var i=t.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var s=t.querySelectorAll(this.options.background);for(n=0;n<s.length;n++){var r=s[n];this.addElementBackgroundImages(r)}}}};var l={1:!0,9:!0,11:!0};function h(t){this.img=t}function a(t,e){this.url=t,this.element=e,this.img=new Image}return r.prototype.addElementBackgroundImages=function(t){var e=getComputedStyle(t);if(e)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(e.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,t),n=i.exec(e.backgroundImage)}},r.prototype.addImage=function(t){var e=new h(t);this.images.push(e)},r.prototype.addBackground=function(t,e){var i=new a(t,e);this.images.push(i)},r.prototype.check=function(){var t=this;function e(e,i,n){setTimeout((function(){t.progress(e,i,n)}))}this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?this.images.forEach((function(t){t.once("progress",e),t.check()})):this.complete()},r.prototype.progress=function(t,e,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!t.isLoaded,this.emitEvent("progress",[this,t,e]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,t),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&n&&n.log("progress: "+i,t,e)},r.prototype.complete=function(){var t=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(t,[this]),this.emitEvent("always",[this]),this.jqDeferred){var e=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[e](this)}},h.prototype=Object.create(e.prototype),h.prototype.check=function(){this.getIsImageComplete()?this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.proxyImage.src=this.img.src)},h.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},h.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.img,e])},h.prototype.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},h.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},h.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},h.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},a.prototype=Object.create(h.prototype),a.prototype.check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url,this.getIsImageComplete()&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},a.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},a.prototype.confirm=function(t,e){this.isLoaded=t,this.emitEvent("progress",[this,this.element,e])},r.makeJQueryPlugin=function(e){(e=e||t.jQuery)&&((i=e).fn.imagesLoaded=function(t,e){return new r(this,t,e).jqDeferred.promise(i(this))})},r.makeJQueryPlugin(),r}));
|
data/lib/j1/version.rb
CHANGED
data/lib/starter_web/Gemfile
CHANGED
|
@@ -53,7 +53,7 @@ gem 'jekyll', '~> 4.2'
|
|
|
53
53
|
|
|
54
54
|
# Theme Rubies, default: J1 Template (NOT used for the development system)
|
|
55
55
|
#
|
|
56
|
-
gem 'j1-template', '~> 2021.1.
|
|
56
|
+
gem 'j1-template', '~> 2021.1.24'
|
|
57
57
|
|
|
58
58
|
# ------------------------------------------------------------------------------
|
|
59
59
|
# PRODUCTION: Gem needed for the Jekyll and J1 prod environment
|
data/lib/starter_web/_config.yml
CHANGED
|
@@ -53,7 +53,7 @@ environment: production
|
|
|
53
53
|
# ------------------------------------------------------------------------------
|
|
54
54
|
# Sets the build version of J1 Template Gem
|
|
55
55
|
#
|
|
56
|
-
version: 2021.1.
|
|
56
|
+
version: 2021.1.24
|
|
57
57
|
|
|
58
58
|
# version
|
|
59
59
|
# ------------------------------------------------------------------------------
|
|
@@ -423,7 +423,7 @@ end::tables[]
|
|
|
423
423
|
// -----------------------------------------------------------------------------
|
|
424
424
|
tag::products[]
|
|
425
425
|
:j1--license: MIT License
|
|
426
|
-
:j1--version: 2021.1.
|
|
426
|
+
:j1--version: 2021.1.24
|
|
427
427
|
:j1--site-name: Jekyll One
|
|
428
428
|
end::products[]
|
|
429
429
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: j1-template
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2021.1.
|
|
4
|
+
version: 2021.1.24
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- juergen_jekyll_one
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-09-
|
|
11
|
+
date: 2021-09-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jekyll
|
|
@@ -285,6 +285,9 @@ files:
|
|
|
285
285
|
- _includes/themes/j1/modules/connectors/comment/just-comments.html
|
|
286
286
|
- _includes/themes/j1/modules/connectors/comments
|
|
287
287
|
- _includes/themes/j1/modules/connectors/sharing
|
|
288
|
+
- _includes/themes/j1/modules/connectors/survey/custom-provider.html
|
|
289
|
+
- _includes/themes/j1/modules/connectors/survey/jotform.html
|
|
290
|
+
- _includes/themes/j1/modules/connectors/surveys
|
|
288
291
|
- _includes/themes/j1/modules/connectors/translator
|
|
289
292
|
- _includes/themes/j1/modules/connectors/translators/custom-translator.html
|
|
290
293
|
- _includes/themes/j1/modules/connectors/translators/google-translator.html
|
|
@@ -542,7 +545,6 @@ files:
|
|
|
542
545
|
- assets/themes/j1/modules/infiniteScroll/css/theme/uno.min.css
|
|
543
546
|
- assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.js
|
|
544
547
|
- assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.min.js
|
|
545
|
-
- assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.modified.js
|
|
546
548
|
- assets/themes/j1/modules/jquery/css/jqueryUI/theme.css
|
|
547
549
|
- assets/themes/j1/modules/jquery/css/jqueryUI/theme.min.css
|
|
548
550
|
- assets/themes/j1/modules/jquery/js/jquery-3.5.1.min.map
|
|
@@ -1,1913 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Infinite Scroll PACKAGED v4.0.1
|
|
3
|
-
* Automatically add next page
|
|
4
|
-
*
|
|
5
|
-
* Licensed GPLv3 for open source use
|
|
6
|
-
* or Infinite Scroll Commercial License for commercial use
|
|
7
|
-
*
|
|
8
|
-
* https://infinite-scroll.com
|
|
9
|
-
* Copyright 2018-2020 Metafizzy
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Bridget makes jQuery widgets
|
|
14
|
-
* v3.0.0
|
|
15
|
-
* MIT license
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
( function( window, factory ) {
|
|
19
|
-
// module definition
|
|
20
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
21
|
-
// CommonJS
|
|
22
|
-
module.exports = factory(
|
|
23
|
-
window,
|
|
24
|
-
require('jquery'),
|
|
25
|
-
);
|
|
26
|
-
} else {
|
|
27
|
-
// browser global
|
|
28
|
-
window.jQueryBridget = factory(
|
|
29
|
-
window,
|
|
30
|
-
window.jQuery,
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
}( window, function factory( window, jQuery ) {
|
|
35
|
-
|
|
36
|
-
// ----- utils ----- //
|
|
37
|
-
|
|
38
|
-
// helper function for logging errors
|
|
39
|
-
// $.error breaks jQuery chaining
|
|
40
|
-
let console = window.console;
|
|
41
|
-
let logError = typeof console == 'undefined' ? function() {} :
|
|
42
|
-
function( message ) {
|
|
43
|
-
console.error( message );
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// ----- jQueryBridget ----- //
|
|
47
|
-
|
|
48
|
-
function jQueryBridget( namespace, PluginClass, $ ) {
|
|
49
|
-
$ = $ || jQuery || window.jQuery;
|
|
50
|
-
if ( !$ ) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// add option method -> $().plugin('option', {...})
|
|
55
|
-
if ( !PluginClass.prototype.option ) {
|
|
56
|
-
// option setter
|
|
57
|
-
PluginClass.prototype.option = function( opts ) {
|
|
58
|
-
if ( !opts ) return;
|
|
59
|
-
|
|
60
|
-
this.options = Object.assign( this.options || {}, opts );
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// make jQuery plugin
|
|
65
|
-
$.fn[ namespace ] = function( arg0, ...args ) {
|
|
66
|
-
if ( typeof arg0 == 'string' ) {
|
|
67
|
-
// method call $().plugin( 'methodName', { options } )
|
|
68
|
-
return methodCall( this, arg0, args );
|
|
69
|
-
}
|
|
70
|
-
// just $().plugin({ options })
|
|
71
|
-
plainCall( this, arg0 );
|
|
72
|
-
return this;
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
// $().plugin('methodName')
|
|
76
|
-
function methodCall( $elems, methodName, args ) {
|
|
77
|
-
let returnValue;
|
|
78
|
-
let pluginMethodStr = `$().${namespace}("${methodName}")`;
|
|
79
|
-
|
|
80
|
-
$elems.each( function( i, elem ) {
|
|
81
|
-
// get instance
|
|
82
|
-
let instance = $.data( elem, namespace );
|
|
83
|
-
if ( !instance ) {
|
|
84
|
-
logError( `${namespace} not initialized.` +
|
|
85
|
-
` Cannot call method ${pluginMethodStr}` );
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
let method = instance[ methodName ];
|
|
90
|
-
if ( !method || methodName.charAt( 0 ) == '_' ) {
|
|
91
|
-
logError(`${pluginMethodStr} is not a valid method`);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// apply method, get return value
|
|
96
|
-
let value = method.apply( instance, args );
|
|
97
|
-
// set return value if value is returned, use only first value
|
|
98
|
-
returnValue = returnValue === undefined ? value : returnValue;
|
|
99
|
-
} );
|
|
100
|
-
|
|
101
|
-
return returnValue !== undefined ? returnValue : $elems;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function plainCall( $elems, options ) {
|
|
105
|
-
$elems.each( function( i, elem ) {
|
|
106
|
-
let instance = $.data( elem, namespace );
|
|
107
|
-
if ( instance ) {
|
|
108
|
-
// set options & init
|
|
109
|
-
instance.option( options );
|
|
110
|
-
instance._init();
|
|
111
|
-
} else {
|
|
112
|
-
// initialize new instance
|
|
113
|
-
instance = new PluginClass( elem, options );
|
|
114
|
-
$.data( elem, namespace, instance );
|
|
115
|
-
}
|
|
116
|
-
} );
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ----- ----- //
|
|
122
|
-
|
|
123
|
-
return jQueryBridget;
|
|
124
|
-
|
|
125
|
-
} ) );
|
|
126
|
-
/**
|
|
127
|
-
* EvEmitter v2.0.0
|
|
128
|
-
* Lil' event emitter
|
|
129
|
-
* MIT License
|
|
130
|
-
*/
|
|
131
|
-
|
|
132
|
-
( function( global, factory ) {
|
|
133
|
-
// universal module definition
|
|
134
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
135
|
-
// CommonJS - Browserify, Webpack
|
|
136
|
-
module.exports = factory();
|
|
137
|
-
} else {
|
|
138
|
-
// Browser globals
|
|
139
|
-
global.EvEmitter = factory();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
}( typeof window != 'undefined' ? window : this, function() {
|
|
143
|
-
|
|
144
|
-
function EvEmitter() {}
|
|
145
|
-
|
|
146
|
-
let proto = EvEmitter.prototype;
|
|
147
|
-
|
|
148
|
-
proto.on = function( eventName, listener ) {
|
|
149
|
-
if ( !eventName || !listener ) return this;
|
|
150
|
-
|
|
151
|
-
// set events hash
|
|
152
|
-
let events = this._events = this._events || {};
|
|
153
|
-
// set listeners array
|
|
154
|
-
let listeners = events[ eventName ] = events[ eventName ] || [];
|
|
155
|
-
// only add once
|
|
156
|
-
if ( !listeners.includes( listener ) ) {
|
|
157
|
-
listeners.push( listener );
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
return this;
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
proto.once = function( eventName, listener ) {
|
|
164
|
-
if ( !eventName || !listener ) return this;
|
|
165
|
-
|
|
166
|
-
// add event
|
|
167
|
-
this.on( eventName, listener );
|
|
168
|
-
// set once flag
|
|
169
|
-
// set onceEvents hash
|
|
170
|
-
let onceEvents = this._onceEvents = this._onceEvents || {};
|
|
171
|
-
// set onceListeners object
|
|
172
|
-
let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
|
|
173
|
-
// set flag
|
|
174
|
-
onceListeners[ listener ] = true;
|
|
175
|
-
|
|
176
|
-
return this;
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
proto.off = function( eventName, listener ) {
|
|
180
|
-
let listeners = this._events && this._events[ eventName ];
|
|
181
|
-
if ( !listeners || !listeners.length ) return this;
|
|
182
|
-
|
|
183
|
-
let index = listeners.indexOf( listener );
|
|
184
|
-
if ( index != -1 ) {
|
|
185
|
-
listeners.splice( index, 1 );
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return this;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
proto.emitEvent = function( eventName, args ) {
|
|
192
|
-
let listeners = this._events && this._events[ eventName ];
|
|
193
|
-
if ( !listeners || !listeners.length ) return this;
|
|
194
|
-
|
|
195
|
-
// copy over to avoid interference if .off() in listener
|
|
196
|
-
listeners = listeners.slice( 0 );
|
|
197
|
-
args = args || [];
|
|
198
|
-
// once stuff
|
|
199
|
-
let onceListeners = this._onceEvents && this._onceEvents[ eventName ];
|
|
200
|
-
|
|
201
|
-
for ( let listener of listeners ) {
|
|
202
|
-
let isOnce = onceListeners && onceListeners[ listener ];
|
|
203
|
-
if ( isOnce ) {
|
|
204
|
-
// remove listener
|
|
205
|
-
// remove before trigger to prevent recursion
|
|
206
|
-
this.off( eventName, listener );
|
|
207
|
-
// unset once flag
|
|
208
|
-
delete onceListeners[ listener ];
|
|
209
|
-
}
|
|
210
|
-
// trigger listener
|
|
211
|
-
listener.apply( this, args );
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
return this;
|
|
215
|
-
};
|
|
216
|
-
|
|
217
|
-
proto.allOff = function() {
|
|
218
|
-
delete this._events;
|
|
219
|
-
delete this._onceEvents;
|
|
220
|
-
return this;
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
return EvEmitter;
|
|
224
|
-
|
|
225
|
-
} ) );
|
|
226
|
-
/**
|
|
227
|
-
* Fizzy UI utils v3.0.0
|
|
228
|
-
* MIT license
|
|
229
|
-
*/
|
|
230
|
-
|
|
231
|
-
( function( global, factory ) {
|
|
232
|
-
// universal module definition
|
|
233
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
234
|
-
// CommonJS
|
|
235
|
-
module.exports = factory( global );
|
|
236
|
-
} else {
|
|
237
|
-
// browser global
|
|
238
|
-
global.fizzyUIUtils = factory( global );
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
}( this, function factory( global ) {
|
|
242
|
-
|
|
243
|
-
let utils = {};
|
|
244
|
-
|
|
245
|
-
// ----- extend ----- //
|
|
246
|
-
|
|
247
|
-
// extends objects
|
|
248
|
-
utils.extend = function( a, b ) {
|
|
249
|
-
return Object.assign( a, b );
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
// ----- modulo ----- //
|
|
253
|
-
|
|
254
|
-
utils.modulo = function( num, div ) {
|
|
255
|
-
return ( ( num % div ) + div ) % div;
|
|
256
|
-
};
|
|
257
|
-
|
|
258
|
-
// ----- makeArray ----- //
|
|
259
|
-
|
|
260
|
-
// turn element or nodeList into an array
|
|
261
|
-
utils.makeArray = function( obj ) {
|
|
262
|
-
// use object if already an array
|
|
263
|
-
if ( Array.isArray( obj ) ) return obj;
|
|
264
|
-
|
|
265
|
-
// return empty array if undefined or null. #6
|
|
266
|
-
if ( obj === null || obj === undefined ) return [];
|
|
267
|
-
|
|
268
|
-
let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
|
|
269
|
-
// convert nodeList to array
|
|
270
|
-
if ( isArrayLike ) return [ ...obj ];
|
|
271
|
-
|
|
272
|
-
// array of single index
|
|
273
|
-
return [ obj ];
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
// ----- removeFrom ----- //
|
|
277
|
-
|
|
278
|
-
utils.removeFrom = function( ary, obj ) {
|
|
279
|
-
let index = ary.indexOf( obj );
|
|
280
|
-
if ( index != -1 ) {
|
|
281
|
-
ary.splice( index, 1 );
|
|
282
|
-
}
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
// ----- getParent ----- //
|
|
286
|
-
|
|
287
|
-
utils.getParent = function( elem, selector ) {
|
|
288
|
-
while ( elem.parentNode && elem != document.body ) {
|
|
289
|
-
elem = elem.parentNode;
|
|
290
|
-
if ( elem.matches( selector ) ) return elem;
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
// ----- getQueryElement ----- //
|
|
295
|
-
|
|
296
|
-
// use element as selector string
|
|
297
|
-
utils.getQueryElement = function( elem ) {
|
|
298
|
-
if ( typeof elem == 'string' ) {
|
|
299
|
-
return document.querySelector( elem );
|
|
300
|
-
}
|
|
301
|
-
return elem;
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
// ----- handleEvent ----- //
|
|
305
|
-
|
|
306
|
-
// enable .ontype to trigger from .addEventListener( elem, 'type' )
|
|
307
|
-
utils.handleEvent = function( event ) {
|
|
308
|
-
let method = 'on' + event.type;
|
|
309
|
-
if ( this[ method ] ) {
|
|
310
|
-
this[ method ]( event );
|
|
311
|
-
}
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
// ----- filterFindElements ----- //
|
|
315
|
-
|
|
316
|
-
utils.filterFindElements = function( elems, selector ) {
|
|
317
|
-
// make array of elems
|
|
318
|
-
elems = utils.makeArray( elems );
|
|
319
|
-
|
|
320
|
-
return elems
|
|
321
|
-
// check that elem is an actual element
|
|
322
|
-
.filter( ( elem ) => elem instanceof HTMLElement )
|
|
323
|
-
.reduce( ( ffElems, elem ) => {
|
|
324
|
-
// add elem if no selector
|
|
325
|
-
if ( !selector ) {
|
|
326
|
-
ffElems.push( elem );
|
|
327
|
-
return ffElems;
|
|
328
|
-
}
|
|
329
|
-
// filter & find items if we have a selector
|
|
330
|
-
// filter
|
|
331
|
-
if ( elem.matches( selector ) ) {
|
|
332
|
-
ffElems.push( elem );
|
|
333
|
-
}
|
|
334
|
-
// find children
|
|
335
|
-
let childElems = elem.querySelectorAll( selector );
|
|
336
|
-
// concat childElems to filterFound array
|
|
337
|
-
ffElems = ffElems.concat( ...childElems );
|
|
338
|
-
return ffElems;
|
|
339
|
-
}, [] );
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
// ----- debounceMethod ----- //
|
|
343
|
-
|
|
344
|
-
utils.debounceMethod = function( _class, methodName, threshold ) {
|
|
345
|
-
threshold = threshold || 100;
|
|
346
|
-
// original method
|
|
347
|
-
let method = _class.prototype[ methodName ];
|
|
348
|
-
let timeoutName = methodName + 'Timeout';
|
|
349
|
-
|
|
350
|
-
_class.prototype[ methodName ] = function() {
|
|
351
|
-
clearTimeout( this[ timeoutName ] );
|
|
352
|
-
|
|
353
|
-
let args = arguments;
|
|
354
|
-
this[ timeoutName ] = setTimeout( () => {
|
|
355
|
-
method.apply( this, args );
|
|
356
|
-
delete this[ timeoutName ];
|
|
357
|
-
}, threshold );
|
|
358
|
-
};
|
|
359
|
-
};
|
|
360
|
-
|
|
361
|
-
// ----- docReady ----- //
|
|
362
|
-
|
|
363
|
-
utils.docReady = function( onDocReady ) {
|
|
364
|
-
let readyState = document.readyState;
|
|
365
|
-
if ( readyState == 'complete' || readyState == 'interactive' ) {
|
|
366
|
-
// do async to allow for other scripts to run. metafizzy/flickity#441
|
|
367
|
-
setTimeout( onDocReady );
|
|
368
|
-
} else {
|
|
369
|
-
document.addEventListener( 'DOMContentLoaded', onDocReady );
|
|
370
|
-
}
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
// ----- htmlInit ----- //
|
|
374
|
-
|
|
375
|
-
// http://bit.ly/3oYLusc
|
|
376
|
-
utils.toDashed = function( str ) {
|
|
377
|
-
return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
|
|
378
|
-
return $1 + '-' + $2;
|
|
379
|
-
} ).toLowerCase();
|
|
380
|
-
};
|
|
381
|
-
|
|
382
|
-
let console = global.console;
|
|
383
|
-
|
|
384
|
-
// allow user to initialize classes via [data-namespace] or .js-namespace class
|
|
385
|
-
// htmlInit( Widget, 'widgetName' )
|
|
386
|
-
// options are parsed from data-namespace-options
|
|
387
|
-
utils.htmlInit = function( WidgetClass, namespace ) {
|
|
388
|
-
utils.docReady( function() {
|
|
389
|
-
let dashedNamespace = utils.toDashed( namespace );
|
|
390
|
-
let dataAttr = 'data-' + dashedNamespace;
|
|
391
|
-
let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );
|
|
392
|
-
let jQuery = global.jQuery;
|
|
393
|
-
|
|
394
|
-
[ ...dataAttrElems ].forEach( ( elem ) => {
|
|
395
|
-
let attr = elem.getAttribute( dataAttr );
|
|
396
|
-
let options;
|
|
397
|
-
try {
|
|
398
|
-
options = attr && JSON.parse( attr );
|
|
399
|
-
} catch ( error ) {
|
|
400
|
-
// log error, do not initialize
|
|
401
|
-
if ( console ) {
|
|
402
|
-
console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );
|
|
403
|
-
}
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
// initialize
|
|
407
|
-
let instance = new WidgetClass( elem, options );
|
|
408
|
-
// make available via $().data('namespace')
|
|
409
|
-
if ( jQuery ) {
|
|
410
|
-
jQuery.data( elem, namespace, instance );
|
|
411
|
-
}
|
|
412
|
-
} );
|
|
413
|
-
|
|
414
|
-
} );
|
|
415
|
-
};
|
|
416
|
-
|
|
417
|
-
// ----- ----- //
|
|
418
|
-
|
|
419
|
-
return utils;
|
|
420
|
-
|
|
421
|
-
} ) );
|
|
422
|
-
// core
|
|
423
|
-
( function( window, factory ) {
|
|
424
|
-
// universal module definition
|
|
425
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
426
|
-
// CommonJS
|
|
427
|
-
module.exports = factory(
|
|
428
|
-
window,
|
|
429
|
-
require('ev-emitter'),
|
|
430
|
-
require('fizzy-ui-utils'),
|
|
431
|
-
);
|
|
432
|
-
} else {
|
|
433
|
-
// browser global
|
|
434
|
-
window.InfiniteScroll = factory(
|
|
435
|
-
window,
|
|
436
|
-
window.EvEmitter,
|
|
437
|
-
window.fizzyUIUtils,
|
|
438
|
-
);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
}( window, function factory( window, EvEmitter, utils ) {
|
|
442
|
-
|
|
443
|
-
let jQuery = window.jQuery;
|
|
444
|
-
// internal store of all InfiniteScroll intances
|
|
445
|
-
let instances = {};
|
|
446
|
-
|
|
447
|
-
function InfiniteScroll( element, options ) {
|
|
448
|
-
let queryElem = utils.getQueryElement( element );
|
|
449
|
-
|
|
450
|
-
if ( !queryElem ) {
|
|
451
|
-
console.error( 'Bad element for InfiniteScroll: ' + ( queryElem || element ) );
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
element = queryElem;
|
|
455
|
-
// do not initialize twice on same element
|
|
456
|
-
if ( element.infiniteScrollGUID ) {
|
|
457
|
-
let instance = instances[ element.infiniteScrollGUID ];
|
|
458
|
-
instance.option( options );
|
|
459
|
-
return instance;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
this.element = element;
|
|
463
|
-
// options
|
|
464
|
-
this.options = { ...InfiniteScroll.defaults };
|
|
465
|
-
this.option( options );
|
|
466
|
-
// add jQuery
|
|
467
|
-
if ( jQuery ) {
|
|
468
|
-
this.$element = jQuery( this.element );
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
this.create();
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// defaults
|
|
475
|
-
InfiniteScroll.defaults = {
|
|
476
|
-
// path: null,
|
|
477
|
-
// hideNav: null,
|
|
478
|
-
// debug: false,
|
|
479
|
-
};
|
|
480
|
-
|
|
481
|
-
// create & destroy methods
|
|
482
|
-
InfiniteScroll.create = {};
|
|
483
|
-
InfiniteScroll.destroy = {};
|
|
484
|
-
|
|
485
|
-
let proto = InfiniteScroll.prototype;
|
|
486
|
-
// inherit EvEmitter
|
|
487
|
-
Object.assign( proto, EvEmitter.prototype );
|
|
488
|
-
|
|
489
|
-
// -------------------------- -------------------------- //
|
|
490
|
-
|
|
491
|
-
// globally unique identifiers
|
|
492
|
-
let GUID = 0;
|
|
493
|
-
|
|
494
|
-
proto.create = function() {
|
|
495
|
-
// create core
|
|
496
|
-
// add id for InfiniteScroll.data
|
|
497
|
-
let id = this.guid = ++GUID;
|
|
498
|
-
this.element.infiniteScrollGUID = id; // expando
|
|
499
|
-
instances[ id ] = this; // associate via id
|
|
500
|
-
// properties
|
|
501
|
-
this.pageIndex = 1; // default to first page
|
|
502
|
-
this.loadCount = 0;
|
|
503
|
-
this.updateGetPath();
|
|
504
|
-
// bail if getPath not set, or returns falsey #776
|
|
505
|
-
let hasPath = this.getPath && this.getPath();
|
|
506
|
-
if ( !hasPath ) {
|
|
507
|
-
console.error('Disabling InfiniteScroll');
|
|
508
|
-
return;
|
|
509
|
-
}
|
|
510
|
-
this.updateGetAbsolutePath();
|
|
511
|
-
this.log( 'initialized', [ this.element.className ] );
|
|
512
|
-
this.callOnInit();
|
|
513
|
-
// create features
|
|
514
|
-
for ( let method in InfiniteScroll.create ) {
|
|
515
|
-
InfiniteScroll.create[ method ].call( this );
|
|
516
|
-
}
|
|
517
|
-
};
|
|
518
|
-
|
|
519
|
-
proto.option = function( opts ) {
|
|
520
|
-
Object.assign( this.options, opts );
|
|
521
|
-
};
|
|
522
|
-
|
|
523
|
-
// call onInit option, used for binding events on init
|
|
524
|
-
proto.callOnInit = function() {
|
|
525
|
-
let onInit = this.options.onInit;
|
|
526
|
-
if ( onInit ) {
|
|
527
|
-
onInit.call( this, this );
|
|
528
|
-
}
|
|
529
|
-
};
|
|
530
|
-
|
|
531
|
-
// ----- events ----- //
|
|
532
|
-
|
|
533
|
-
proto.dispatchEvent = function( type, event, args ) {
|
|
534
|
-
this.log( type, args );
|
|
535
|
-
let emitArgs = event ? [ event ].concat( args ) : args;
|
|
536
|
-
this.emitEvent( type, emitArgs );
|
|
537
|
-
// trigger jQuery event
|
|
538
|
-
if ( !jQuery || !this.$element ) {
|
|
539
|
-
return;
|
|
540
|
-
}
|
|
541
|
-
// namespace jQuery event
|
|
542
|
-
type += '.infiniteScroll';
|
|
543
|
-
let $event = type;
|
|
544
|
-
if ( event ) {
|
|
545
|
-
// create jQuery event
|
|
546
|
-
/* eslint-disable-next-line new-cap */
|
|
547
|
-
let jQEvent = jQuery.Event( event );
|
|
548
|
-
jQEvent.type = type;
|
|
549
|
-
$event = jQEvent;
|
|
550
|
-
}
|
|
551
|
-
this.$element.trigger( $event, args );
|
|
552
|
-
};
|
|
553
|
-
|
|
554
|
-
let loggers = {
|
|
555
|
-
initialized: ( className ) => `on ${className}`,
|
|
556
|
-
request: ( path ) => `URL: ${path}`,
|
|
557
|
-
load: ( response, path ) => `${response.title || ''}. URL: ${path}`,
|
|
558
|
-
error: ( error, path ) => `${error}. URL: ${path}`,
|
|
559
|
-
append: ( response, path, items ) => `${items.length} items. URL: ${path}`,
|
|
560
|
-
last: ( response, path ) => `URL: ${path}`,
|
|
561
|
-
history: ( title, path ) => `URL: ${path}`,
|
|
562
|
-
pageIndex: function( index, origin ) {
|
|
563
|
-
return `current page determined to be: ${index} from ${origin}`;
|
|
564
|
-
},
|
|
565
|
-
};
|
|
566
|
-
|
|
567
|
-
// log events
|
|
568
|
-
proto.log = function( type, args ) {
|
|
569
|
-
if ( !this.options.debug ) return;
|
|
570
|
-
|
|
571
|
-
let message = `[InfiniteScroll] ${type}`;
|
|
572
|
-
let logger = loggers[ type ];
|
|
573
|
-
if ( logger ) message += '. ' + logger.apply( this, args );
|
|
574
|
-
console.log( message );
|
|
575
|
-
};
|
|
576
|
-
|
|
577
|
-
// -------------------------- methods used amoung features -------------------------- //
|
|
578
|
-
|
|
579
|
-
proto.updateMeasurements = function() {
|
|
580
|
-
this.windowHeight = window.innerHeight;
|
|
581
|
-
let rect = this.element.getBoundingClientRect();
|
|
582
|
-
this.top = rect.top + window.scrollY;
|
|
583
|
-
};
|
|
584
|
-
|
|
585
|
-
proto.updateScroller = function() {
|
|
586
|
-
let elementScroll = this.options.elementScroll;
|
|
587
|
-
if ( !elementScroll ) {
|
|
588
|
-
// default, use window
|
|
589
|
-
this.scroller = window;
|
|
590
|
-
return;
|
|
591
|
-
}
|
|
592
|
-
// if true, set to element, otherwise use option
|
|
593
|
-
this.scroller = elementScroll === true ? this.element :
|
|
594
|
-
utils.getQueryElement( elementScroll );
|
|
595
|
-
if ( !this.scroller ) {
|
|
596
|
-
throw new Error(`Unable to find elementScroll: ${elementScroll}`);
|
|
597
|
-
}
|
|
598
|
-
};
|
|
599
|
-
|
|
600
|
-
// -------------------------- page path -------------------------- //
|
|
601
|
-
|
|
602
|
-
proto.updateGetPath = function() {
|
|
603
|
-
let optPath = this.options.path;
|
|
604
|
-
if ( !optPath ) {
|
|
605
|
-
console.error(`InfiniteScroll path option required. Set as: ${optPath}`);
|
|
606
|
-
return;
|
|
607
|
-
}
|
|
608
|
-
// function
|
|
609
|
-
let type = typeof optPath;
|
|
610
|
-
if ( type == 'function' ) {
|
|
611
|
-
this.getPath = optPath;
|
|
612
|
-
return;
|
|
613
|
-
}
|
|
614
|
-
// template string: '/pages/{{#}}.html'
|
|
615
|
-
let templateMatch = type == 'string' && optPath.match('{{#}}');
|
|
616
|
-
if ( templateMatch ) {
|
|
617
|
-
this.updateGetPathTemplate( optPath );
|
|
618
|
-
return;
|
|
619
|
-
}
|
|
620
|
-
// selector: '.next-page-selector'
|
|
621
|
-
this.updateGetPathSelector( optPath );
|
|
622
|
-
};
|
|
623
|
-
|
|
624
|
-
proto.updateGetPathTemplate = function( optPath ) {
|
|
625
|
-
// set getPath with template string
|
|
626
|
-
this.getPath = () => {
|
|
627
|
-
let nextIndex = this.pageIndex + 1;
|
|
628
|
-
return optPath.replace( '{{#}}', nextIndex );
|
|
629
|
-
};
|
|
630
|
-
// get pageIndex from location
|
|
631
|
-
// convert path option into regex to look for pattern in location
|
|
632
|
-
// escape query (?) in url, allows for parsing GET parameters
|
|
633
|
-
let regexString = optPath
|
|
634
|
-
.replace( /(\\\?|\?)/, '\\?' )
|
|
635
|
-
.replace( '{{#}}', '(\\d\\d?\\d?)' );
|
|
636
|
-
let templateRe = new RegExp( regexString );
|
|
637
|
-
let match = location.href.match( templateRe );
|
|
638
|
-
|
|
639
|
-
if ( match ) {
|
|
640
|
-
this.pageIndex = parseInt( match[1], 10 );
|
|
641
|
-
this.log( 'pageIndex', [ this.pageIndex, 'template string' ] );
|
|
642
|
-
}
|
|
643
|
-
};
|
|
644
|
-
|
|
645
|
-
let pathRegexes = [
|
|
646
|
-
// WordPress & Tumblr - example.com/page/2
|
|
647
|
-
// Jekyll - example.com/page2
|
|
648
|
-
/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,
|
|
649
|
-
// Drupal - example.com/?page=1
|
|
650
|
-
/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,
|
|
651
|
-
// catch all, last occurence of a number
|
|
652
|
-
/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/,
|
|
653
|
-
];
|
|
654
|
-
|
|
655
|
-
// try matching href to pathRegexes patterns
|
|
656
|
-
let getPathParts = InfiniteScroll.getPathParts = function( href ) {
|
|
657
|
-
if ( !href ) return;
|
|
658
|
-
for ( let regex of pathRegexes ) {
|
|
659
|
-
let match = href.match( regex );
|
|
660
|
-
if ( match ) {
|
|
661
|
-
let [ , begin, index, end ] = match;
|
|
662
|
-
return { begin, index, end };
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
};
|
|
666
|
-
|
|
667
|
-
proto.updateGetPathSelector = function( optPath ) {
|
|
668
|
-
// parse href of link: '.next-page-link'
|
|
669
|
-
let hrefElem = document.querySelector( optPath );
|
|
670
|
-
if ( !hrefElem ) {
|
|
671
|
-
console.error(`Bad InfiniteScroll path option. Next link not found: ${optPath}`);
|
|
672
|
-
return;
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
let href = hrefElem.getAttribute('href');
|
|
676
|
-
let pathParts = getPathParts( href );
|
|
677
|
-
if ( !pathParts ) {
|
|
678
|
-
console.error(`InfiniteScroll unable to parse next link href: ${href}`);
|
|
679
|
-
return;
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
let { begin, index, end } = pathParts;
|
|
683
|
-
this.isPathSelector = true; // flag for checkLastPage()
|
|
684
|
-
this.getPath = () => begin + ( this.pageIndex + 1 ) + end;
|
|
685
|
-
// get pageIndex from href
|
|
686
|
-
this.pageIndex = parseInt( index, 10 ) - 1;
|
|
687
|
-
this.log( 'pageIndex', [ this.pageIndex, 'next link' ] );
|
|
688
|
-
};
|
|
689
|
-
|
|
690
|
-
proto.updateGetAbsolutePath = function() {
|
|
691
|
-
let path = this.getPath();
|
|
692
|
-
// path doesn't start with http or /
|
|
693
|
-
let isAbsolute = path.match( /^http/ ) || path.match( /^\// );
|
|
694
|
-
if ( isAbsolute ) {
|
|
695
|
-
this.getAbsolutePath = this.getPath;
|
|
696
|
-
return;
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
let { pathname } = location;
|
|
700
|
-
// query parameter #829. example.com/?pg=2
|
|
701
|
-
let isQuery = path.match( /^\?/ );
|
|
702
|
-
// /foo/bar/index.html => /foo/bar
|
|
703
|
-
let directory = pathname.substring( 0, pathname.lastIndexOf('/') );
|
|
704
|
-
let pathStart = isQuery ? pathname : directory + '/';
|
|
705
|
-
|
|
706
|
-
this.getAbsolutePath = () => pathStart + this.getPath();
|
|
707
|
-
};
|
|
708
|
-
|
|
709
|
-
// -------------------------- nav -------------------------- //
|
|
710
|
-
|
|
711
|
-
// hide navigation
|
|
712
|
-
InfiniteScroll.create.hideNav = function() {
|
|
713
|
-
let nav = utils.getQueryElement( this.options.hideNav );
|
|
714
|
-
if ( !nav ) return;
|
|
715
|
-
|
|
716
|
-
nav.style.display = 'none';
|
|
717
|
-
this.nav = nav;
|
|
718
|
-
};
|
|
719
|
-
|
|
720
|
-
InfiniteScroll.destroy.hideNav = function() {
|
|
721
|
-
if ( this.nav ) this.nav.style.display = '';
|
|
722
|
-
};
|
|
723
|
-
|
|
724
|
-
// -------------------------- destroy -------------------------- //
|
|
725
|
-
|
|
726
|
-
proto.destroy = function() {
|
|
727
|
-
this.allOff(); // remove all event listeners
|
|
728
|
-
// call destroy methods
|
|
729
|
-
for ( let method in InfiniteScroll.destroy ) {
|
|
730
|
-
InfiniteScroll.destroy[ method ].call( this );
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
delete this.element.infiniteScrollGUID;
|
|
734
|
-
delete instances[ this.guid ];
|
|
735
|
-
// remove jQuery data. #807
|
|
736
|
-
if ( jQuery && this.$element ) {
|
|
737
|
-
jQuery.removeData( this.element, 'infiniteScroll' );
|
|
738
|
-
}
|
|
739
|
-
};
|
|
740
|
-
|
|
741
|
-
// -------------------------- utilities -------------------------- //
|
|
742
|
-
|
|
743
|
-
// https://remysharp.com/2010/07/21/throttling-function-calls
|
|
744
|
-
InfiniteScroll.throttle = function( fn, threshold ) {
|
|
745
|
-
threshold = threshold || 200;
|
|
746
|
-
let last, timeout;
|
|
747
|
-
|
|
748
|
-
return function() {
|
|
749
|
-
let now = +new Date();
|
|
750
|
-
let args = arguments;
|
|
751
|
-
let trigger = () => {
|
|
752
|
-
last = now;
|
|
753
|
-
fn.apply( this, args );
|
|
754
|
-
};
|
|
755
|
-
if ( last && now < last + threshold ) {
|
|
756
|
-
// hold on to it
|
|
757
|
-
clearTimeout( timeout );
|
|
758
|
-
timeout = setTimeout( trigger, threshold );
|
|
759
|
-
} else {
|
|
760
|
-
trigger();
|
|
761
|
-
}
|
|
762
|
-
};
|
|
763
|
-
};
|
|
764
|
-
|
|
765
|
-
InfiniteScroll.data = function( elem ) {
|
|
766
|
-
elem = utils.getQueryElement( elem );
|
|
767
|
-
let id = elem && elem.infiniteScrollGUID;
|
|
768
|
-
return id && instances[ id ];
|
|
769
|
-
};
|
|
770
|
-
|
|
771
|
-
// set internal jQuery, for Webpack + jQuery v3
|
|
772
|
-
InfiniteScroll.setJQuery = function( jqry ) {
|
|
773
|
-
jQuery = jqry;
|
|
774
|
-
};
|
|
775
|
-
|
|
776
|
-
// -------------------------- setup -------------------------- //
|
|
777
|
-
|
|
778
|
-
utils.htmlInit( InfiniteScroll, 'infinite-scroll' );
|
|
779
|
-
|
|
780
|
-
// add noop _init method for jQuery Bridget. #768
|
|
781
|
-
proto._init = function() {};
|
|
782
|
-
|
|
783
|
-
let { jQueryBridget } = window;
|
|
784
|
-
if ( jQuery && jQueryBridget ) {
|
|
785
|
-
jQueryBridget( 'infiniteScroll', InfiniteScroll, jQuery );
|
|
786
|
-
}
|
|
787
|
-
|
|
788
|
-
// -------------------------- -------------------------- //
|
|
789
|
-
|
|
790
|
-
return InfiniteScroll;
|
|
791
|
-
|
|
792
|
-
} ) );
|
|
793
|
-
// page-load
|
|
794
|
-
( function( window, factory ) {
|
|
795
|
-
// universal module definition
|
|
796
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
797
|
-
// CommonJS
|
|
798
|
-
module.exports = factory(
|
|
799
|
-
window,
|
|
800
|
-
require('./core'),
|
|
801
|
-
);
|
|
802
|
-
} else {
|
|
803
|
-
// browser global
|
|
804
|
-
factory(
|
|
805
|
-
window,
|
|
806
|
-
window.InfiniteScroll,
|
|
807
|
-
);
|
|
808
|
-
}
|
|
809
|
-
|
|
810
|
-
}( window, function factory( window, InfiniteScroll ) {
|
|
811
|
-
|
|
812
|
-
let proto = InfiniteScroll.prototype;
|
|
813
|
-
|
|
814
|
-
Object.assign( InfiniteScroll.defaults, {
|
|
815
|
-
// append: false,
|
|
816
|
-
loadOnScroll: true,
|
|
817
|
-
checkLastPage: true,
|
|
818
|
-
responseBody: 'text',
|
|
819
|
-
domParseResponse: true,
|
|
820
|
-
// prefill: false,
|
|
821
|
-
// outlayer: null,
|
|
822
|
-
} );
|
|
823
|
-
|
|
824
|
-
InfiniteScroll.create.pageLoad = function() {
|
|
825
|
-
this.canLoad = true;
|
|
826
|
-
this.on( 'scrollThreshold', this.onScrollThresholdLoad );
|
|
827
|
-
this.on( 'load', this.checkLastPage );
|
|
828
|
-
if ( this.options.outlayer ) {
|
|
829
|
-
this.on( 'append', this.onAppendOutlayer );
|
|
830
|
-
}
|
|
831
|
-
};
|
|
832
|
-
|
|
833
|
-
proto.onScrollThresholdLoad = function() {
|
|
834
|
-
if ( this.options.loadOnScroll ) this.loadNextPage();
|
|
835
|
-
};
|
|
836
|
-
|
|
837
|
-
let domParser = new DOMParser();
|
|
838
|
-
|
|
839
|
-
proto.loadNextPage = function() {
|
|
840
|
-
if ( this.isLoading || !this.canLoad ) return;
|
|
841
|
-
|
|
842
|
-
let { responseBody, domParseResponse, fetchOptions } = this.options;
|
|
843
|
-
let path = this.getAbsolutePath();
|
|
844
|
-
this.isLoading = true;
|
|
845
|
-
if ( typeof fetchOptions == 'function' ) fetchOptions = fetchOptions();
|
|
846
|
-
|
|
847
|
-
let fetchPromise = fetch( path, fetchOptions )
|
|
848
|
-
.then( ( response ) => {
|
|
849
|
-
if ( !response.ok ) {
|
|
850
|
-
let error = new Error( response.statusText );
|
|
851
|
-
this.onPageError( error, path, response );
|
|
852
|
-
return { response };
|
|
853
|
-
}
|
|
854
|
-
|
|
855
|
-
return response[ responseBody ]().then( ( body ) => {
|
|
856
|
-
let canDomParse = responseBody == 'text' && domParseResponse;
|
|
857
|
-
if ( canDomParse ) {
|
|
858
|
-
body = domParser.parseFromString( body, 'text/html' );
|
|
859
|
-
}
|
|
860
|
-
if ( response.status == 204 ) {
|
|
861
|
-
this.lastPageReached( body, path );
|
|
862
|
-
return { body, response };
|
|
863
|
-
} else {
|
|
864
|
-
return this.onPageLoad( body, path, response );
|
|
865
|
-
}
|
|
866
|
-
} );
|
|
867
|
-
} )
|
|
868
|
-
.catch( ( error ) => {
|
|
869
|
-
this.onPageError( error, path );
|
|
870
|
-
} );
|
|
871
|
-
|
|
872
|
-
this.dispatchEvent( 'request', null, [ path, fetchPromise ] );
|
|
873
|
-
|
|
874
|
-
return fetchPromise;
|
|
875
|
-
};
|
|
876
|
-
|
|
877
|
-
proto.onPageLoad = function( body, path, response ) {
|
|
878
|
-
// done loading if not appending
|
|
879
|
-
if ( !this.options.append ) {
|
|
880
|
-
this.isLoading = false;
|
|
881
|
-
}
|
|
882
|
-
this.pageIndex++;
|
|
883
|
-
this.loadCount++;
|
|
884
|
-
this.dispatchEvent( 'load', null, [ body, path, response ] );
|
|
885
|
-
return this.appendNextPage( body, path, response );
|
|
886
|
-
};
|
|
887
|
-
|
|
888
|
-
proto.appendNextPage = function( body, path, response ) {
|
|
889
|
-
let { append, responseBody, domParseResponse } = this.options;
|
|
890
|
-
// do not append json
|
|
891
|
-
let isDocument = responseBody == 'text' && domParseResponse;
|
|
892
|
-
if ( !isDocument || !append ) return { body, response };
|
|
893
|
-
|
|
894
|
-
let items = body.querySelectorAll( append );
|
|
895
|
-
let promiseValue = { body, response, items };
|
|
896
|
-
// last page hit if no items. #840
|
|
897
|
-
if ( !items || !items.length ) {
|
|
898
|
-
this.lastPageReached( body, path );
|
|
899
|
-
return promiseValue;
|
|
900
|
-
}
|
|
901
|
-
|
|
902
|
-
let fragment = getItemsFragment( items );
|
|
903
|
-
let appendReady = () => {
|
|
904
|
-
this.appendItems( items, fragment );
|
|
905
|
-
this.isLoading = false;
|
|
906
|
-
this.dispatchEvent( 'append', null, [ body, path, items, response ] );
|
|
907
|
-
return promiseValue;
|
|
908
|
-
};
|
|
909
|
-
|
|
910
|
-
// TODO add hook for option to trigger appendReady
|
|
911
|
-
if ( this.options.outlayer ) {
|
|
912
|
-
return this.appendOutlayerItems( fragment, appendReady );
|
|
913
|
-
} else {
|
|
914
|
-
return appendReady();
|
|
915
|
-
}
|
|
916
|
-
};
|
|
917
|
-
|
|
918
|
-
proto.appendItems = function( items, fragment ) {
|
|
919
|
-
if ( !items || !items.length ) return;
|
|
920
|
-
|
|
921
|
-
// get fragment if not provided
|
|
922
|
-
fragment = fragment || getItemsFragment( items );
|
|
923
|
-
refreshScripts( fragment );
|
|
924
|
-
this.element.appendChild( fragment );
|
|
925
|
-
};
|
|
926
|
-
|
|
927
|
-
function getItemsFragment( items ) {
|
|
928
|
-
// add items to fragment
|
|
929
|
-
let fragment = document.createDocumentFragment();
|
|
930
|
-
if ( items ) fragment.append( ...items );
|
|
931
|
-
return fragment;
|
|
932
|
-
}
|
|
933
|
-
|
|
934
|
-
// replace <script>s with copies so they load
|
|
935
|
-
// <script>s added by InfiniteScroll will not load
|
|
936
|
-
// similar to https://stackoverflow.com/questions/610995
|
|
937
|
-
function refreshScripts( fragment ) {
|
|
938
|
-
let scripts = fragment.querySelectorAll('script');
|
|
939
|
-
for ( let script of scripts ) {
|
|
940
|
-
let freshScript = document.createElement('script');
|
|
941
|
-
// copy attributes
|
|
942
|
-
let attrs = script.attributes;
|
|
943
|
-
for ( let attr of attrs ) {
|
|
944
|
-
freshScript.setAttribute( attr.name, attr.value );
|
|
945
|
-
}
|
|
946
|
-
// copy inner script code. #718, #782
|
|
947
|
-
freshScript.innerHTML = script.innerHTML;
|
|
948
|
-
script.parentNode.replaceChild( freshScript, script );
|
|
949
|
-
}
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
// ----- outlayer ----- //
|
|
953
|
-
|
|
954
|
-
proto.appendOutlayerItems = function( fragment, appendReady ) {
|
|
955
|
-
let imagesLoaded = InfiniteScroll.imagesLoaded || window.imagesLoaded;
|
|
956
|
-
if ( !imagesLoaded ) {
|
|
957
|
-
console.error('[InfiniteScroll] imagesLoaded required for outlayer option');
|
|
958
|
-
this.isLoading = false;
|
|
959
|
-
return;
|
|
960
|
-
}
|
|
961
|
-
// append once images loaded
|
|
962
|
-
return new Promise( function( resolve ) {
|
|
963
|
-
imagesLoaded( fragment, function() {
|
|
964
|
-
let bodyResponse = appendReady();
|
|
965
|
-
resolve( bodyResponse );
|
|
966
|
-
} );
|
|
967
|
-
} );
|
|
968
|
-
};
|
|
969
|
-
|
|
970
|
-
proto.onAppendOutlayer = function( response, path, items ) {
|
|
971
|
-
this.options.outlayer.appended( items );
|
|
972
|
-
};
|
|
973
|
-
|
|
974
|
-
// ----- checkLastPage ----- //
|
|
975
|
-
|
|
976
|
-
// check response for next element
|
|
977
|
-
proto.checkLastPage = function( body, path ) {
|
|
978
|
-
let { checkLastPage, path: pathOpt } = this.options;
|
|
979
|
-
if ( !checkLastPage ) return;
|
|
980
|
-
|
|
981
|
-
// if path is function, check if next path is truthy
|
|
982
|
-
if ( typeof pathOpt == 'function' ) {
|
|
983
|
-
let nextPath = this.getPath();
|
|
984
|
-
if ( !nextPath ) {
|
|
985
|
-
this.lastPageReached( body, path );
|
|
986
|
-
return;
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
// get selector from checkLastPage or path option
|
|
990
|
-
let selector;
|
|
991
|
-
if ( typeof checkLastPage == 'string' ) {
|
|
992
|
-
selector = checkLastPage;
|
|
993
|
-
} else if ( this.isPathSelector ) {
|
|
994
|
-
// path option is selector string
|
|
995
|
-
selector = pathOpt;
|
|
996
|
-
}
|
|
997
|
-
// check last page for selector
|
|
998
|
-
// bail if no selector or not document response
|
|
999
|
-
if ( !selector || !body.querySelector ) return;
|
|
1000
|
-
|
|
1001
|
-
// check if response has selector
|
|
1002
|
-
let nextElem = body.querySelector( selector );
|
|
1003
|
-
if ( !nextElem ) this.lastPageReached( body, path );
|
|
1004
|
-
};
|
|
1005
|
-
|
|
1006
|
-
proto.lastPageReached = function( body, path ) {
|
|
1007
|
-
this.canLoad = false;
|
|
1008
|
-
this.dispatchEvent( 'last', null, [ body, path ] );
|
|
1009
|
-
};
|
|
1010
|
-
|
|
1011
|
-
// ----- error ----- //
|
|
1012
|
-
|
|
1013
|
-
proto.onPageError = function( error, path, response ) {
|
|
1014
|
-
this.isLoading = false;
|
|
1015
|
-
this.canLoad = false;
|
|
1016
|
-
this.dispatchEvent( 'error', null, [ error, path, response ] );
|
|
1017
|
-
return error;
|
|
1018
|
-
};
|
|
1019
|
-
|
|
1020
|
-
// -------------------------- prefill -------------------------- //
|
|
1021
|
-
|
|
1022
|
-
InfiniteScroll.create.prefill = function() {
|
|
1023
|
-
if ( !this.options.prefill ) return;
|
|
1024
|
-
|
|
1025
|
-
let append = this.options.append;
|
|
1026
|
-
if ( !append ) {
|
|
1027
|
-
console.error(`append option required for prefill. Set as :${append}`);
|
|
1028
|
-
return;
|
|
1029
|
-
}
|
|
1030
|
-
this.updateMeasurements();
|
|
1031
|
-
this.updateScroller();
|
|
1032
|
-
this.isPrefilling = true;
|
|
1033
|
-
this.on( 'append', this.prefill );
|
|
1034
|
-
this.once( 'error', this.stopPrefill );
|
|
1035
|
-
this.once( 'last', this.stopPrefill );
|
|
1036
|
-
this.prefill();
|
|
1037
|
-
};
|
|
1038
|
-
|
|
1039
|
-
proto.prefill = function() {
|
|
1040
|
-
let distance = this.getPrefillDistance();
|
|
1041
|
-
this.isPrefilling = distance >= 0;
|
|
1042
|
-
if ( this.isPrefilling ) {
|
|
1043
|
-
this.log('prefill');
|
|
1044
|
-
this.loadNextPage();
|
|
1045
|
-
} else {
|
|
1046
|
-
this.stopPrefill();
|
|
1047
|
-
}
|
|
1048
|
-
};
|
|
1049
|
-
|
|
1050
|
-
proto.getPrefillDistance = function() {
|
|
1051
|
-
// element scroll
|
|
1052
|
-
if ( this.options.elementScroll ) {
|
|
1053
|
-
return this.scroller.clientHeight - this.scroller.scrollHeight;
|
|
1054
|
-
}
|
|
1055
|
-
// window
|
|
1056
|
-
return this.windowHeight - this.element.clientHeight;
|
|
1057
|
-
};
|
|
1058
|
-
|
|
1059
|
-
proto.stopPrefill = function() {
|
|
1060
|
-
this.log('stopPrefill');
|
|
1061
|
-
this.off( 'append', this.prefill );
|
|
1062
|
-
};
|
|
1063
|
-
|
|
1064
|
-
// -------------------------- -------------------------- //
|
|
1065
|
-
|
|
1066
|
-
return InfiniteScroll;
|
|
1067
|
-
|
|
1068
|
-
} ) );
|
|
1069
|
-
// scroll-watch
|
|
1070
|
-
( function( window, factory ) {
|
|
1071
|
-
// universal module definition
|
|
1072
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
1073
|
-
// CommonJS
|
|
1074
|
-
module.exports = factory(
|
|
1075
|
-
window,
|
|
1076
|
-
require('./core'),
|
|
1077
|
-
require('fizzy-ui-utils'),
|
|
1078
|
-
);
|
|
1079
|
-
} else {
|
|
1080
|
-
// browser global
|
|
1081
|
-
factory(
|
|
1082
|
-
window,
|
|
1083
|
-
window.InfiniteScroll,
|
|
1084
|
-
window.fizzyUIUtils,
|
|
1085
|
-
);
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
}( window, function factory( window, InfiniteScroll, utils ) {
|
|
1089
|
-
|
|
1090
|
-
let proto = InfiniteScroll.prototype;
|
|
1091
|
-
|
|
1092
|
-
// default options
|
|
1093
|
-
Object.assign( InfiniteScroll.defaults, {
|
|
1094
|
-
scrollThreshold: 400,
|
|
1095
|
-
// elementScroll: null,
|
|
1096
|
-
} );
|
|
1097
|
-
|
|
1098
|
-
InfiniteScroll.create.scrollWatch = function() {
|
|
1099
|
-
// events
|
|
1100
|
-
this.pageScrollHandler = this.onPageScroll.bind( this );
|
|
1101
|
-
this.resizeHandler = this.onResize.bind( this );
|
|
1102
|
-
|
|
1103
|
-
let scrollThreshold = this.options.scrollThreshold;
|
|
1104
|
-
let isEnable = scrollThreshold || scrollThreshold === 0;
|
|
1105
|
-
if ( isEnable ) this.enableScrollWatch();
|
|
1106
|
-
};
|
|
1107
|
-
|
|
1108
|
-
InfiniteScroll.destroy.scrollWatch = function() {
|
|
1109
|
-
this.disableScrollWatch();
|
|
1110
|
-
};
|
|
1111
|
-
|
|
1112
|
-
proto.enableScrollWatch = function() {
|
|
1113
|
-
if ( this.isScrollWatching ) return;
|
|
1114
|
-
|
|
1115
|
-
this.isScrollWatching = true;
|
|
1116
|
-
this.updateMeasurements();
|
|
1117
|
-
this.updateScroller();
|
|
1118
|
-
// TODO disable after error?
|
|
1119
|
-
this.on( 'last', this.disableScrollWatch );
|
|
1120
|
-
this.bindScrollWatchEvents( true );
|
|
1121
|
-
};
|
|
1122
|
-
|
|
1123
|
-
proto.disableScrollWatch = function() {
|
|
1124
|
-
if ( !this.isScrollWatching ) return;
|
|
1125
|
-
|
|
1126
|
-
this.bindScrollWatchEvents( false );
|
|
1127
|
-
delete this.isScrollWatching;
|
|
1128
|
-
};
|
|
1129
|
-
|
|
1130
|
-
proto.bindScrollWatchEvents = function( isBind ) {
|
|
1131
|
-
let addRemove = isBind ? 'addEventListener' : 'removeEventListener';
|
|
1132
|
-
this.scroller[ addRemove ]( 'scroll', this.pageScrollHandler );
|
|
1133
|
-
window[ addRemove ]( 'resize', this.resizeHandler );
|
|
1134
|
-
};
|
|
1135
|
-
|
|
1136
|
-
// jadams
|
|
1137
|
-
proto.onPageScroll = InfiniteScroll.throttle( function() {
|
|
1138
|
-
let distance = this.getBottomDistance();
|
|
1139
|
-
// if ( distance > 0 && distance <= this.options.scrollThreshold ) {
|
|
1140
|
-
if ( distance <= this.options.scrollThreshold ) {
|
|
1141
|
-
this.dispatchEvent('scrollThreshold');
|
|
1142
|
-
}
|
|
1143
|
-
} );
|
|
1144
|
-
|
|
1145
|
-
proto.getBottomDistance = function() {
|
|
1146
|
-
let bottom, scrollY;
|
|
1147
|
-
if ( this.options.elementScroll ) {
|
|
1148
|
-
bottom = this.scroller.scrollHeight;
|
|
1149
|
-
scrollY = this.scroller.scrollTop + this.scroller.clientHeight;
|
|
1150
|
-
} else {
|
|
1151
|
-
bottom = this.top + this.element.clientHeight;
|
|
1152
|
-
scrollY = window.scrollY + this.windowHeight;
|
|
1153
|
-
}
|
|
1154
|
-
// jadams
|
|
1155
|
-
// return bottom - scrollY + this.options.scrollOffset;
|
|
1156
|
-
return bottom - scrollY;
|
|
1157
|
-
};
|
|
1158
|
-
|
|
1159
|
-
proto.onResize = function() {
|
|
1160
|
-
this.updateMeasurements();
|
|
1161
|
-
};
|
|
1162
|
-
|
|
1163
|
-
utils.debounceMethod( InfiniteScroll, 'onResize', 150 );
|
|
1164
|
-
|
|
1165
|
-
// -------------------------- -------------------------- //
|
|
1166
|
-
|
|
1167
|
-
return InfiniteScroll;
|
|
1168
|
-
|
|
1169
|
-
} ) );
|
|
1170
|
-
// history
|
|
1171
|
-
( function( window, factory ) {
|
|
1172
|
-
// universal module definition
|
|
1173
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
1174
|
-
// CommonJS
|
|
1175
|
-
module.exports = factory(
|
|
1176
|
-
window,
|
|
1177
|
-
require('./core'),
|
|
1178
|
-
require('fizzy-ui-utils'),
|
|
1179
|
-
);
|
|
1180
|
-
} else {
|
|
1181
|
-
// browser global
|
|
1182
|
-
factory(
|
|
1183
|
-
window,
|
|
1184
|
-
window.InfiniteScroll,
|
|
1185
|
-
window.fizzyUIUtils,
|
|
1186
|
-
);
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
}( window, function factory( window, InfiniteScroll, utils ) {
|
|
1190
|
-
|
|
1191
|
-
let proto = InfiniteScroll.prototype;
|
|
1192
|
-
|
|
1193
|
-
Object.assign( InfiniteScroll.defaults, {
|
|
1194
|
-
history: 'replace',
|
|
1195
|
-
// historyTitle: false,
|
|
1196
|
-
} );
|
|
1197
|
-
|
|
1198
|
-
let link = document.createElement('a');
|
|
1199
|
-
|
|
1200
|
-
// ----- create/destroy ----- //
|
|
1201
|
-
|
|
1202
|
-
InfiniteScroll.create.history = function() {
|
|
1203
|
-
if ( !this.options.history ) return;
|
|
1204
|
-
|
|
1205
|
-
// check for same origin
|
|
1206
|
-
link.href = this.getAbsolutePath();
|
|
1207
|
-
// MS Edge does not have origin on link
|
|
1208
|
-
// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12236493/
|
|
1209
|
-
let linkOrigin = link.origin || link.protocol + '//' + link.host;
|
|
1210
|
-
let isSameOrigin = linkOrigin == location.origin;
|
|
1211
|
-
if ( !isSameOrigin ) {
|
|
1212
|
-
console.error( '[InfiniteScroll] cannot set history with different origin: ' +
|
|
1213
|
-
`${link.origin} on ${location.origin} . History behavior disabled.` );
|
|
1214
|
-
return;
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
// two ways to handle changing history
|
|
1218
|
-
if ( this.options.append ) {
|
|
1219
|
-
this.createHistoryAppend();
|
|
1220
|
-
} else {
|
|
1221
|
-
this.createHistoryPageLoad();
|
|
1222
|
-
}
|
|
1223
|
-
};
|
|
1224
|
-
|
|
1225
|
-
proto.createHistoryAppend = function() {
|
|
1226
|
-
this.updateMeasurements();
|
|
1227
|
-
this.updateScroller();
|
|
1228
|
-
// array of scroll positions of appended pages
|
|
1229
|
-
this.scrollPages = [
|
|
1230
|
-
// first page
|
|
1231
|
-
{
|
|
1232
|
-
top: 0,
|
|
1233
|
-
path: location.href,
|
|
1234
|
-
title: document.title,
|
|
1235
|
-
},
|
|
1236
|
-
];
|
|
1237
|
-
this.scrollPage = this.scrollPages[0];
|
|
1238
|
-
// events
|
|
1239
|
-
this.scrollHistoryHandler = this.onScrollHistory.bind( this );
|
|
1240
|
-
this.unloadHandler = this.onUnload.bind( this );
|
|
1241
|
-
this.scroller.addEventListener( 'scroll', this.scrollHistoryHandler );
|
|
1242
|
-
this.on( 'append', this.onAppendHistory );
|
|
1243
|
-
this.bindHistoryAppendEvents( true );
|
|
1244
|
-
};
|
|
1245
|
-
|
|
1246
|
-
proto.bindHistoryAppendEvents = function( isBind ) {
|
|
1247
|
-
let addRemove = isBind ? 'addEventListener' : 'removeEventListener';
|
|
1248
|
-
this.scroller[ addRemove ]( 'scroll', this.scrollHistoryHandler );
|
|
1249
|
-
window[ addRemove ]( 'unload', this.unloadHandler );
|
|
1250
|
-
};
|
|
1251
|
-
|
|
1252
|
-
proto.createHistoryPageLoad = function() {
|
|
1253
|
-
this.on( 'load', this.onPageLoadHistory );
|
|
1254
|
-
};
|
|
1255
|
-
|
|
1256
|
-
InfiniteScroll.destroy.history =
|
|
1257
|
-
proto.destroyHistory = function() {
|
|
1258
|
-
let isHistoryAppend = this.options.history && this.options.append;
|
|
1259
|
-
if ( isHistoryAppend ) {
|
|
1260
|
-
this.bindHistoryAppendEvents( false );
|
|
1261
|
-
}
|
|
1262
|
-
};
|
|
1263
|
-
|
|
1264
|
-
// ----- append history ----- //
|
|
1265
|
-
|
|
1266
|
-
proto.onAppendHistory = function( response, path, items ) {
|
|
1267
|
-
// do not proceed if no items. #779
|
|
1268
|
-
if ( !items || !items.length ) return;
|
|
1269
|
-
|
|
1270
|
-
let firstItem = items[0];
|
|
1271
|
-
let elemScrollY = this.getElementScrollY( firstItem );
|
|
1272
|
-
// resolve path
|
|
1273
|
-
link.href = path;
|
|
1274
|
-
// add page data to hash
|
|
1275
|
-
this.scrollPages.push({
|
|
1276
|
-
top: elemScrollY,
|
|
1277
|
-
path: link.href,
|
|
1278
|
-
title: response.title,
|
|
1279
|
-
});
|
|
1280
|
-
};
|
|
1281
|
-
|
|
1282
|
-
proto.getElementScrollY = function( elem ) {
|
|
1283
|
-
if ( this.options.elementScroll ) {
|
|
1284
|
-
return elem.offsetTop - this.top;
|
|
1285
|
-
} else {
|
|
1286
|
-
let rect = elem.getBoundingClientRect();
|
|
1287
|
-
return rect.top + window.scrollY;
|
|
1288
|
-
}
|
|
1289
|
-
};
|
|
1290
|
-
|
|
1291
|
-
proto.onScrollHistory = function() {
|
|
1292
|
-
// cycle through positions, find biggest without going over
|
|
1293
|
-
let scrollPage = this.getClosestScrollPage();
|
|
1294
|
-
// set history if changed
|
|
1295
|
-
if ( scrollPage != this.scrollPage ) {
|
|
1296
|
-
this.scrollPage = scrollPage;
|
|
1297
|
-
this.setHistory( scrollPage.title, scrollPage.path );
|
|
1298
|
-
}
|
|
1299
|
-
};
|
|
1300
|
-
|
|
1301
|
-
utils.debounceMethod( InfiniteScroll, 'onScrollHistory', 150 );
|
|
1302
|
-
|
|
1303
|
-
proto.getClosestScrollPage = function() {
|
|
1304
|
-
let scrollViewY;
|
|
1305
|
-
if ( this.options.elementScroll ) {
|
|
1306
|
-
scrollViewY = this.scroller.scrollTop + this.scroller.clientHeight / 2;
|
|
1307
|
-
} else {
|
|
1308
|
-
scrollViewY = window.scrollY + this.windowHeight / 2;
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
let scrollPage;
|
|
1312
|
-
for ( let page of this.scrollPages ) {
|
|
1313
|
-
if ( page.top >= scrollViewY ) break;
|
|
1314
|
-
|
|
1315
|
-
scrollPage = page;
|
|
1316
|
-
}
|
|
1317
|
-
return scrollPage;
|
|
1318
|
-
};
|
|
1319
|
-
|
|
1320
|
-
proto.setHistory = function( title, path ) {
|
|
1321
|
-
let optHistory = this.options.history;
|
|
1322
|
-
let historyMethod = optHistory && history[ optHistory + 'State' ];
|
|
1323
|
-
if ( !historyMethod ) return;
|
|
1324
|
-
|
|
1325
|
-
history[ optHistory + 'State' ]( null, title, path );
|
|
1326
|
-
if ( this.options.historyTitle ) document.title = title;
|
|
1327
|
-
this.dispatchEvent( 'history', null, [ title, path ] );
|
|
1328
|
-
};
|
|
1329
|
-
|
|
1330
|
-
// scroll to top to prevent initial scroll-reset after page refresh
|
|
1331
|
-
// https://stackoverflow.com/a/18633915/182183
|
|
1332
|
-
proto.onUnload = function() {
|
|
1333
|
-
if ( this.scrollPage.top === 0 ) return;
|
|
1334
|
-
|
|
1335
|
-
// calculate where scroll position would be on refresh
|
|
1336
|
-
let scrollY = window.scrollY - this.scrollPage.top + this.top;
|
|
1337
|
-
// disable scroll event before setting scroll #679
|
|
1338
|
-
this.destroyHistory();
|
|
1339
|
-
scrollTo( 0, scrollY );
|
|
1340
|
-
};
|
|
1341
|
-
|
|
1342
|
-
// ----- load history ----- //
|
|
1343
|
-
|
|
1344
|
-
// update URL
|
|
1345
|
-
proto.onPageLoadHistory = function( response, path ) {
|
|
1346
|
-
this.setHistory( response.title, path );
|
|
1347
|
-
};
|
|
1348
|
-
|
|
1349
|
-
// -------------------------- -------------------------- //
|
|
1350
|
-
|
|
1351
|
-
return InfiniteScroll;
|
|
1352
|
-
|
|
1353
|
-
} ) );
|
|
1354
|
-
// button
|
|
1355
|
-
( function( window, factory ) {
|
|
1356
|
-
// universal module definition
|
|
1357
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
1358
|
-
// CommonJS
|
|
1359
|
-
module.exports = factory(
|
|
1360
|
-
window,
|
|
1361
|
-
require('./core'),
|
|
1362
|
-
require('fizzy-ui-utils'),
|
|
1363
|
-
);
|
|
1364
|
-
} else {
|
|
1365
|
-
// browser global
|
|
1366
|
-
factory(
|
|
1367
|
-
window,
|
|
1368
|
-
window.InfiniteScroll,
|
|
1369
|
-
window.fizzyUIUtils,
|
|
1370
|
-
);
|
|
1371
|
-
}
|
|
1372
|
-
|
|
1373
|
-
}( window, function factory( window, InfiniteScroll, utils ) {
|
|
1374
|
-
|
|
1375
|
-
// -------------------------- InfiniteScrollButton -------------------------- //
|
|
1376
|
-
|
|
1377
|
-
class InfiniteScrollButton {
|
|
1378
|
-
constructor( element, infScroll ) {
|
|
1379
|
-
this.element = element;
|
|
1380
|
-
this.infScroll = infScroll;
|
|
1381
|
-
// events
|
|
1382
|
-
this.clickHandler = this.onClick.bind( this );
|
|
1383
|
-
this.element.addEventListener( 'click', this.clickHandler );
|
|
1384
|
-
infScroll.on( 'request', this.disable.bind( this ) );
|
|
1385
|
-
infScroll.on( 'load', this.enable.bind( this ) );
|
|
1386
|
-
infScroll.on( 'error', this.hide.bind( this ) );
|
|
1387
|
-
infScroll.on( 'last', this.hide.bind( this ) );
|
|
1388
|
-
}
|
|
1389
|
-
|
|
1390
|
-
onClick( event ) {
|
|
1391
|
-
event.preventDefault();
|
|
1392
|
-
this.infScroll.loadNextPage();
|
|
1393
|
-
}
|
|
1394
|
-
|
|
1395
|
-
enable() {
|
|
1396
|
-
this.element.removeAttribute('disabled');
|
|
1397
|
-
}
|
|
1398
|
-
|
|
1399
|
-
disable() {
|
|
1400
|
-
this.element.disabled = 'disabled';
|
|
1401
|
-
}
|
|
1402
|
-
|
|
1403
|
-
hide() {
|
|
1404
|
-
this.element.style.display = 'none';
|
|
1405
|
-
}
|
|
1406
|
-
|
|
1407
|
-
destroy() {
|
|
1408
|
-
this.element.removeEventListener( 'click', this.clickHandler );
|
|
1409
|
-
}
|
|
1410
|
-
|
|
1411
|
-
}
|
|
1412
|
-
|
|
1413
|
-
// -------------------------- InfiniteScroll methods -------------------------- //
|
|
1414
|
-
|
|
1415
|
-
// InfiniteScroll.defaults.button = null;
|
|
1416
|
-
|
|
1417
|
-
InfiniteScroll.create.button = function() {
|
|
1418
|
-
let buttonElem = utils.getQueryElement( this.options.button );
|
|
1419
|
-
if ( buttonElem ) {
|
|
1420
|
-
this.button = new InfiniteScrollButton( buttonElem, this );
|
|
1421
|
-
}
|
|
1422
|
-
};
|
|
1423
|
-
|
|
1424
|
-
InfiniteScroll.destroy.button = function() {
|
|
1425
|
-
if ( this.button ) this.button.destroy();
|
|
1426
|
-
};
|
|
1427
|
-
|
|
1428
|
-
// -------------------------- -------------------------- //
|
|
1429
|
-
|
|
1430
|
-
InfiniteScroll.Button = InfiniteScrollButton;
|
|
1431
|
-
|
|
1432
|
-
return InfiniteScroll;
|
|
1433
|
-
|
|
1434
|
-
} ) );
|
|
1435
|
-
// status
|
|
1436
|
-
( function( window, factory ) {
|
|
1437
|
-
// universal module definition
|
|
1438
|
-
if ( typeof module == 'object' && module.exports ) {
|
|
1439
|
-
// CommonJS
|
|
1440
|
-
module.exports = factory(
|
|
1441
|
-
window,
|
|
1442
|
-
require('./core'),
|
|
1443
|
-
require('fizzy-ui-utils'),
|
|
1444
|
-
);
|
|
1445
|
-
} else {
|
|
1446
|
-
// browser global
|
|
1447
|
-
factory(
|
|
1448
|
-
window,
|
|
1449
|
-
window.InfiniteScroll,
|
|
1450
|
-
window.fizzyUIUtils,
|
|
1451
|
-
);
|
|
1452
|
-
}
|
|
1453
|
-
|
|
1454
|
-
}( window, function factory( window, InfiniteScroll, utils ) {
|
|
1455
|
-
|
|
1456
|
-
let proto = InfiniteScroll.prototype;
|
|
1457
|
-
|
|
1458
|
-
// InfiniteScroll.defaults.status = null;
|
|
1459
|
-
|
|
1460
|
-
InfiniteScroll.create.status = function() {
|
|
1461
|
-
let statusElem = utils.getQueryElement( this.options.status );
|
|
1462
|
-
if ( !statusElem ) return;
|
|
1463
|
-
|
|
1464
|
-
// elements
|
|
1465
|
-
this.statusElement = statusElem;
|
|
1466
|
-
this.statusEventElements = {
|
|
1467
|
-
request: statusElem.querySelector('.infinite-scroll-request'),
|
|
1468
|
-
error: statusElem.querySelector('.infinite-scroll-error'),
|
|
1469
|
-
last: statusElem.querySelector('.infinite-scroll-last'),
|
|
1470
|
-
};
|
|
1471
|
-
// events
|
|
1472
|
-
this.on( 'request', this.showRequestStatus );
|
|
1473
|
-
this.on( 'error', this.showErrorStatus );
|
|
1474
|
-
this.on( 'last', this.showLastStatus );
|
|
1475
|
-
this.bindHideStatus('on');
|
|
1476
|
-
};
|
|
1477
|
-
|
|
1478
|
-
proto.bindHideStatus = function( bindMethod ) {
|
|
1479
|
-
let hideEvent = this.options.append ? 'append' : 'load';
|
|
1480
|
-
this[ bindMethod ]( hideEvent, this.hideAllStatus );
|
|
1481
|
-
};
|
|
1482
|
-
|
|
1483
|
-
proto.showRequestStatus = function() {
|
|
1484
|
-
this.showStatus('request');
|
|
1485
|
-
};
|
|
1486
|
-
|
|
1487
|
-
proto.showErrorStatus = function() {
|
|
1488
|
-
this.showStatus('error');
|
|
1489
|
-
};
|
|
1490
|
-
|
|
1491
|
-
proto.showLastStatus = function() {
|
|
1492
|
-
this.showStatus('last');
|
|
1493
|
-
// prevent last then append event race condition from showing last status #706
|
|
1494
|
-
this.bindHideStatus('off');
|
|
1495
|
-
};
|
|
1496
|
-
|
|
1497
|
-
proto.showStatus = function( eventName ) {
|
|
1498
|
-
show( this.statusElement );
|
|
1499
|
-
this.hideStatusEventElements();
|
|
1500
|
-
let eventElem = this.statusEventElements[ eventName ];
|
|
1501
|
-
show( eventElem );
|
|
1502
|
-
};
|
|
1503
|
-
|
|
1504
|
-
proto.hideAllStatus = function() {
|
|
1505
|
-
hide( this.statusElement );
|
|
1506
|
-
this.hideStatusEventElements();
|
|
1507
|
-
};
|
|
1508
|
-
|
|
1509
|
-
proto.hideStatusEventElements = function() {
|
|
1510
|
-
for ( let type in this.statusEventElements ) {
|
|
1511
|
-
let eventElem = this.statusEventElements[ type ];
|
|
1512
|
-
hide( eventElem );
|
|
1513
|
-
}
|
|
1514
|
-
};
|
|
1515
|
-
|
|
1516
|
-
// -------------------------- -------------------------- //
|
|
1517
|
-
|
|
1518
|
-
function hide( elem ) {
|
|
1519
|
-
setDisplay( elem, 'none' );
|
|
1520
|
-
}
|
|
1521
|
-
|
|
1522
|
-
function show( elem ) {
|
|
1523
|
-
setDisplay( elem, 'block' );
|
|
1524
|
-
}
|
|
1525
|
-
|
|
1526
|
-
function setDisplay( elem, value ) {
|
|
1527
|
-
if ( elem ) {
|
|
1528
|
-
elem.style.display = value;
|
|
1529
|
-
}
|
|
1530
|
-
}
|
|
1531
|
-
|
|
1532
|
-
// -------------------------- -------------------------- //
|
|
1533
|
-
|
|
1534
|
-
return InfiniteScroll;
|
|
1535
|
-
|
|
1536
|
-
} ) );
|
|
1537
|
-
/*!
|
|
1538
|
-
* imagesLoaded v4.1.4
|
|
1539
|
-
* JavaScript is all like "You images are done yet or what?"
|
|
1540
|
-
* MIT License
|
|
1541
|
-
*/
|
|
1542
|
-
|
|
1543
|
-
( function( window, factory ) { 'use strict';
|
|
1544
|
-
// universal module definition
|
|
1545
|
-
|
|
1546
|
-
/*global define: false, module: false, require: false */
|
|
1547
|
-
|
|
1548
|
-
if ( typeof define == 'function' && define.amd ) {
|
|
1549
|
-
// AMD
|
|
1550
|
-
define( [
|
|
1551
|
-
'ev-emitter/ev-emitter'
|
|
1552
|
-
], function( EvEmitter ) {
|
|
1553
|
-
return factory( window, EvEmitter );
|
|
1554
|
-
});
|
|
1555
|
-
} else if ( typeof module == 'object' && module.exports ) {
|
|
1556
|
-
// CommonJS
|
|
1557
|
-
module.exports = factory(
|
|
1558
|
-
window,
|
|
1559
|
-
require('ev-emitter')
|
|
1560
|
-
);
|
|
1561
|
-
} else {
|
|
1562
|
-
// browser global
|
|
1563
|
-
window.imagesLoaded = factory(
|
|
1564
|
-
window,
|
|
1565
|
-
window.EvEmitter
|
|
1566
|
-
);
|
|
1567
|
-
}
|
|
1568
|
-
|
|
1569
|
-
})( typeof window !== 'undefined' ? window : this,
|
|
1570
|
-
|
|
1571
|
-
// -------------------------- factory -------------------------- //
|
|
1572
|
-
|
|
1573
|
-
function factory( window, EvEmitter ) {
|
|
1574
|
-
|
|
1575
|
-
'use strict';
|
|
1576
|
-
|
|
1577
|
-
var $ = window.jQuery;
|
|
1578
|
-
var console = window.console;
|
|
1579
|
-
|
|
1580
|
-
// -------------------------- helpers -------------------------- //
|
|
1581
|
-
|
|
1582
|
-
// extend objects
|
|
1583
|
-
function extend( a, b ) {
|
|
1584
|
-
for ( var prop in b ) {
|
|
1585
|
-
a[ prop ] = b[ prop ];
|
|
1586
|
-
}
|
|
1587
|
-
return a;
|
|
1588
|
-
}
|
|
1589
|
-
|
|
1590
|
-
var arraySlice = Array.prototype.slice;
|
|
1591
|
-
|
|
1592
|
-
// turn element or nodeList into an array
|
|
1593
|
-
function makeArray( obj ) {
|
|
1594
|
-
if ( Array.isArray( obj ) ) {
|
|
1595
|
-
// use object if already an array
|
|
1596
|
-
return obj;
|
|
1597
|
-
}
|
|
1598
|
-
|
|
1599
|
-
var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
|
|
1600
|
-
if ( isArrayLike ) {
|
|
1601
|
-
// convert nodeList to array
|
|
1602
|
-
return arraySlice.call( obj );
|
|
1603
|
-
}
|
|
1604
|
-
|
|
1605
|
-
// array of single index
|
|
1606
|
-
return [ obj ];
|
|
1607
|
-
}
|
|
1608
|
-
|
|
1609
|
-
// -------------------------- imagesLoaded -------------------------- //
|
|
1610
|
-
|
|
1611
|
-
/**
|
|
1612
|
-
* @param {Array, Element, NodeList, String} elem
|
|
1613
|
-
* @param {Object or Function} options - if function, use as callback
|
|
1614
|
-
* @param {Function} onAlways - callback function
|
|
1615
|
-
*/
|
|
1616
|
-
function ImagesLoaded( elem, options, onAlways ) {
|
|
1617
|
-
// coerce ImagesLoaded() without new, to be new ImagesLoaded()
|
|
1618
|
-
if ( !( this instanceof ImagesLoaded ) ) {
|
|
1619
|
-
return new ImagesLoaded( elem, options, onAlways );
|
|
1620
|
-
}
|
|
1621
|
-
// use elem as selector string
|
|
1622
|
-
var queryElem = elem;
|
|
1623
|
-
if ( typeof elem == 'string' ) {
|
|
1624
|
-
queryElem = document.querySelectorAll( elem );
|
|
1625
|
-
}
|
|
1626
|
-
// bail if bad element
|
|
1627
|
-
if ( !queryElem ) {
|
|
1628
|
-
console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
|
|
1629
|
-
return;
|
|
1630
|
-
}
|
|
1631
|
-
|
|
1632
|
-
this.elements = makeArray( queryElem );
|
|
1633
|
-
this.options = extend( {}, this.options );
|
|
1634
|
-
// shift arguments if no options set
|
|
1635
|
-
if ( typeof options == 'function' ) {
|
|
1636
|
-
onAlways = options;
|
|
1637
|
-
} else {
|
|
1638
|
-
extend( this.options, options );
|
|
1639
|
-
}
|
|
1640
|
-
|
|
1641
|
-
if ( onAlways ) {
|
|
1642
|
-
this.on( 'always', onAlways );
|
|
1643
|
-
}
|
|
1644
|
-
|
|
1645
|
-
this.getImages();
|
|
1646
|
-
|
|
1647
|
-
if ( $ ) {
|
|
1648
|
-
// add jQuery Deferred object
|
|
1649
|
-
this.jqDeferred = new $.Deferred();
|
|
1650
|
-
}
|
|
1651
|
-
|
|
1652
|
-
// HACK check async to allow time to bind listeners
|
|
1653
|
-
setTimeout( this.check.bind( this ) );
|
|
1654
|
-
}
|
|
1655
|
-
|
|
1656
|
-
ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
|
|
1657
|
-
|
|
1658
|
-
ImagesLoaded.prototype.options = {};
|
|
1659
|
-
|
|
1660
|
-
ImagesLoaded.prototype.getImages = function() {
|
|
1661
|
-
this.images = [];
|
|
1662
|
-
|
|
1663
|
-
// filter & find items if we have an item selector
|
|
1664
|
-
this.elements.forEach( this.addElementImages, this );
|
|
1665
|
-
};
|
|
1666
|
-
|
|
1667
|
-
/**
|
|
1668
|
-
* @param {Node} element
|
|
1669
|
-
*/
|
|
1670
|
-
ImagesLoaded.prototype.addElementImages = function( elem ) {
|
|
1671
|
-
// filter siblings
|
|
1672
|
-
if ( elem.nodeName == 'IMG' ) {
|
|
1673
|
-
this.addImage( elem );
|
|
1674
|
-
}
|
|
1675
|
-
// get background image on element
|
|
1676
|
-
if ( this.options.background === true ) {
|
|
1677
|
-
this.addElementBackgroundImages( elem );
|
|
1678
|
-
}
|
|
1679
|
-
|
|
1680
|
-
// find children
|
|
1681
|
-
// no non-element nodes, #143
|
|
1682
|
-
var nodeType = elem.nodeType;
|
|
1683
|
-
if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
|
|
1684
|
-
return;
|
|
1685
|
-
}
|
|
1686
|
-
var childImgs = elem.querySelectorAll('img');
|
|
1687
|
-
// concat childElems to filterFound array
|
|
1688
|
-
for ( var i=0; i < childImgs.length; i++ ) {
|
|
1689
|
-
var img = childImgs[i];
|
|
1690
|
-
this.addImage( img );
|
|
1691
|
-
}
|
|
1692
|
-
|
|
1693
|
-
// get child background images
|
|
1694
|
-
if ( typeof this.options.background == 'string' ) {
|
|
1695
|
-
var children = elem.querySelectorAll( this.options.background );
|
|
1696
|
-
for ( i=0; i < children.length; i++ ) {
|
|
1697
|
-
var child = children[i];
|
|
1698
|
-
this.addElementBackgroundImages( child );
|
|
1699
|
-
}
|
|
1700
|
-
}
|
|
1701
|
-
};
|
|
1702
|
-
|
|
1703
|
-
var elementNodeTypes = {
|
|
1704
|
-
1: true,
|
|
1705
|
-
9: true,
|
|
1706
|
-
11: true
|
|
1707
|
-
};
|
|
1708
|
-
|
|
1709
|
-
ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
|
|
1710
|
-
var style = getComputedStyle( elem );
|
|
1711
|
-
if ( !style ) {
|
|
1712
|
-
// Firefox returns null if in a hidden iframe https://bugzil.la/548397
|
|
1713
|
-
return;
|
|
1714
|
-
}
|
|
1715
|
-
// get url inside url("...")
|
|
1716
|
-
var reURL = /url\((['"])?(.*?)\1\)/gi;
|
|
1717
|
-
var matches = reURL.exec( style.backgroundImage );
|
|
1718
|
-
while ( matches !== null ) {
|
|
1719
|
-
var url = matches && matches[2];
|
|
1720
|
-
if ( url ) {
|
|
1721
|
-
this.addBackground( url, elem );
|
|
1722
|
-
}
|
|
1723
|
-
matches = reURL.exec( style.backgroundImage );
|
|
1724
|
-
}
|
|
1725
|
-
};
|
|
1726
|
-
|
|
1727
|
-
/**
|
|
1728
|
-
* @param {Image} img
|
|
1729
|
-
*/
|
|
1730
|
-
ImagesLoaded.prototype.addImage = function( img ) {
|
|
1731
|
-
var loadingImage = new LoadingImage( img );
|
|
1732
|
-
this.images.push( loadingImage );
|
|
1733
|
-
};
|
|
1734
|
-
|
|
1735
|
-
ImagesLoaded.prototype.addBackground = function( url, elem ) {
|
|
1736
|
-
var background = new Background( url, elem );
|
|
1737
|
-
this.images.push( background );
|
|
1738
|
-
};
|
|
1739
|
-
|
|
1740
|
-
ImagesLoaded.prototype.check = function() {
|
|
1741
|
-
var _this = this;
|
|
1742
|
-
this.progressedCount = 0;
|
|
1743
|
-
this.hasAnyBroken = false;
|
|
1744
|
-
// complete if no images
|
|
1745
|
-
if ( !this.images.length ) {
|
|
1746
|
-
this.complete();
|
|
1747
|
-
return;
|
|
1748
|
-
}
|
|
1749
|
-
|
|
1750
|
-
function onProgress( image, elem, message ) {
|
|
1751
|
-
// HACK - Chrome triggers event before object properties have changed. #83
|
|
1752
|
-
setTimeout( function() {
|
|
1753
|
-
_this.progress( image, elem, message );
|
|
1754
|
-
});
|
|
1755
|
-
}
|
|
1756
|
-
|
|
1757
|
-
this.images.forEach( function( loadingImage ) {
|
|
1758
|
-
loadingImage.once( 'progress', onProgress );
|
|
1759
|
-
loadingImage.check();
|
|
1760
|
-
});
|
|
1761
|
-
};
|
|
1762
|
-
|
|
1763
|
-
ImagesLoaded.prototype.progress = function( image, elem, message ) {
|
|
1764
|
-
this.progressedCount++;
|
|
1765
|
-
this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
|
|
1766
|
-
// progress event
|
|
1767
|
-
this.emitEvent( 'progress', [ this, image, elem ] );
|
|
1768
|
-
if ( this.jqDeferred && this.jqDeferred.notify ) {
|
|
1769
|
-
this.jqDeferred.notify( this, image );
|
|
1770
|
-
}
|
|
1771
|
-
// check if completed
|
|
1772
|
-
if ( this.progressedCount == this.images.length ) {
|
|
1773
|
-
this.complete();
|
|
1774
|
-
}
|
|
1775
|
-
|
|
1776
|
-
if ( this.options.debug && console ) {
|
|
1777
|
-
console.log( 'progress: ' + message, image, elem );
|
|
1778
|
-
}
|
|
1779
|
-
};
|
|
1780
|
-
|
|
1781
|
-
ImagesLoaded.prototype.complete = function() {
|
|
1782
|
-
var eventName = this.hasAnyBroken ? 'fail' : 'done';
|
|
1783
|
-
this.isComplete = true;
|
|
1784
|
-
this.emitEvent( eventName, [ this ] );
|
|
1785
|
-
this.emitEvent( 'always', [ this ] );
|
|
1786
|
-
if ( this.jqDeferred ) {
|
|
1787
|
-
var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
|
|
1788
|
-
this.jqDeferred[ jqMethod ]( this );
|
|
1789
|
-
}
|
|
1790
|
-
};
|
|
1791
|
-
|
|
1792
|
-
// -------------------------- -------------------------- //
|
|
1793
|
-
|
|
1794
|
-
function LoadingImage( img ) {
|
|
1795
|
-
this.img = img;
|
|
1796
|
-
}
|
|
1797
|
-
|
|
1798
|
-
LoadingImage.prototype = Object.create( EvEmitter.prototype );
|
|
1799
|
-
|
|
1800
|
-
LoadingImage.prototype.check = function() {
|
|
1801
|
-
// If complete is true and browser supports natural sizes,
|
|
1802
|
-
// try to check for image status manually.
|
|
1803
|
-
var isComplete = this.getIsImageComplete();
|
|
1804
|
-
if ( isComplete ) {
|
|
1805
|
-
// report based on naturalWidth
|
|
1806
|
-
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
|
1807
|
-
return;
|
|
1808
|
-
}
|
|
1809
|
-
|
|
1810
|
-
// If none of the checks above matched, simulate loading on detached element.
|
|
1811
|
-
this.proxyImage = new Image();
|
|
1812
|
-
this.proxyImage.addEventListener( 'load', this );
|
|
1813
|
-
this.proxyImage.addEventListener( 'error', this );
|
|
1814
|
-
// bind to image as well for Firefox. #191
|
|
1815
|
-
this.img.addEventListener( 'load', this );
|
|
1816
|
-
this.img.addEventListener( 'error', this );
|
|
1817
|
-
this.proxyImage.src = this.img.src;
|
|
1818
|
-
};
|
|
1819
|
-
|
|
1820
|
-
LoadingImage.prototype.getIsImageComplete = function() {
|
|
1821
|
-
// check for non-zero, non-undefined naturalWidth
|
|
1822
|
-
// fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
|
|
1823
|
-
return this.img.complete && this.img.naturalWidth;
|
|
1824
|
-
};
|
|
1825
|
-
|
|
1826
|
-
LoadingImage.prototype.confirm = function( isLoaded, message ) {
|
|
1827
|
-
this.isLoaded = isLoaded;
|
|
1828
|
-
this.emitEvent( 'progress', [ this, this.img, message ] );
|
|
1829
|
-
};
|
|
1830
|
-
|
|
1831
|
-
// ----- events ----- //
|
|
1832
|
-
|
|
1833
|
-
// trigger specified handler for event type
|
|
1834
|
-
LoadingImage.prototype.handleEvent = function( event ) {
|
|
1835
|
-
var method = 'on' + event.type;
|
|
1836
|
-
if ( this[ method ] ) {
|
|
1837
|
-
this[ method ]( event );
|
|
1838
|
-
}
|
|
1839
|
-
};
|
|
1840
|
-
|
|
1841
|
-
LoadingImage.prototype.onload = function() {
|
|
1842
|
-
this.confirm( true, 'onload' );
|
|
1843
|
-
this.unbindEvents();
|
|
1844
|
-
};
|
|
1845
|
-
|
|
1846
|
-
LoadingImage.prototype.onerror = function() {
|
|
1847
|
-
this.confirm( false, 'onerror' );
|
|
1848
|
-
this.unbindEvents();
|
|
1849
|
-
};
|
|
1850
|
-
|
|
1851
|
-
LoadingImage.prototype.unbindEvents = function() {
|
|
1852
|
-
this.proxyImage.removeEventListener( 'load', this );
|
|
1853
|
-
this.proxyImage.removeEventListener( 'error', this );
|
|
1854
|
-
this.img.removeEventListener( 'load', this );
|
|
1855
|
-
this.img.removeEventListener( 'error', this );
|
|
1856
|
-
};
|
|
1857
|
-
|
|
1858
|
-
// -------------------------- Background -------------------------- //
|
|
1859
|
-
|
|
1860
|
-
function Background( url, element ) {
|
|
1861
|
-
this.url = url;
|
|
1862
|
-
this.element = element;
|
|
1863
|
-
this.img = new Image();
|
|
1864
|
-
}
|
|
1865
|
-
|
|
1866
|
-
// inherit LoadingImage prototype
|
|
1867
|
-
Background.prototype = Object.create( LoadingImage.prototype );
|
|
1868
|
-
|
|
1869
|
-
Background.prototype.check = function() {
|
|
1870
|
-
this.img.addEventListener( 'load', this );
|
|
1871
|
-
this.img.addEventListener( 'error', this );
|
|
1872
|
-
this.img.src = this.url;
|
|
1873
|
-
// check if image is already complete
|
|
1874
|
-
var isComplete = this.getIsImageComplete();
|
|
1875
|
-
if ( isComplete ) {
|
|
1876
|
-
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
|
1877
|
-
this.unbindEvents();
|
|
1878
|
-
}
|
|
1879
|
-
};
|
|
1880
|
-
|
|
1881
|
-
Background.prototype.unbindEvents = function() {
|
|
1882
|
-
this.img.removeEventListener( 'load', this );
|
|
1883
|
-
this.img.removeEventListener( 'error', this );
|
|
1884
|
-
};
|
|
1885
|
-
|
|
1886
|
-
Background.prototype.confirm = function( isLoaded, message ) {
|
|
1887
|
-
this.isLoaded = isLoaded;
|
|
1888
|
-
this.emitEvent( 'progress', [ this, this.element, message ] );
|
|
1889
|
-
};
|
|
1890
|
-
|
|
1891
|
-
// -------------------------- jQuery -------------------------- //
|
|
1892
|
-
|
|
1893
|
-
ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
|
|
1894
|
-
jQuery = jQuery || window.jQuery;
|
|
1895
|
-
if ( !jQuery ) {
|
|
1896
|
-
return;
|
|
1897
|
-
}
|
|
1898
|
-
// set local variable
|
|
1899
|
-
$ = jQuery;
|
|
1900
|
-
// $().imagesLoaded()
|
|
1901
|
-
$.fn.imagesLoaded = function( options, callback ) {
|
|
1902
|
-
var instance = new ImagesLoaded( this, options, callback );
|
|
1903
|
-
return instance.jqDeferred.promise( $(this) );
|
|
1904
|
-
};
|
|
1905
|
-
};
|
|
1906
|
-
// try making plugin
|
|
1907
|
-
ImagesLoaded.makeJQueryPlugin();
|
|
1908
|
-
|
|
1909
|
-
// -------------------------- -------------------------- //
|
|
1910
|
-
|
|
1911
|
-
return ImagesLoaded;
|
|
1912
|
-
|
|
1913
|
-
});
|