Advertisement
  1. Web Design
  2. jQuery

कैसे इतिहास वेब एपीआई के साथ एक अनंत स्क्रॉल अनुभव बनाने के लिए

Scroll to top
Read Time: 19 min

() translation by (you can also view the original English article)

इस ट्यूटोरियल में हम अपने इतिहास वेब एपीआई कौशल को सुदृढ़ करने जा रहे हैं। हम उस वेब पर एक यूएक्स पैटर्न बनाने जा रहे हैं जो समान माप में प्यार और loathed है: अनंत स्क्रॉलिंग(infinite scrolling)

अनंत स्क्रॉलिंग एक इंटरफ़ेस पैटर्न है जो नई सामग्री को लोड करता है क्योंकि हम किसी दिए गए वेब पेज के अंत तक पहुंचते हैं। समझदारी से लागू होने पर अनंत स्क्रॉलिंग उपयोगकर्ताओं की सगाई को यकीनन रख सकती है; फेसबुक, ट्विटर और पिनइन्ट्रस्ट जैसे सामाजिक प्लेटफार्मों पर होने वाले कुछ बेहतरीन उदाहरण।

यह ध्यान देने योग्य है कि, हम अपने पिछले ट्यूटोरियल में जो कुछ हमने बनाया है, उससे हम एक महत्वपूर्ण पायदान ले रहे हैं, इतिहास वेब एपीआई के साथ लवली, चिकनी पृष्ठ बदलाव। इस ट्यूटोरियल में हम उपयोगकर्ता के स्क्रॉलिंग इंटरैक्शन से निपटेंगे, जो एक बहुत ही तीव्र दर पर हो सकता है। अगर हम अपने कोड से सावधान नहीं हैं, तो बदले में, हमारी वेबसाइट के प्रदर्शन को नुकसान पहुंचाएगा। सुनिश्चित करें कि आप इस पर प्रयास करने से पहले पिछले ट्यूटोरियल पढ़ते हैं, सिर्फ आपको यह समझने के लिए कि हम क्या कर रहे हैं।

फिर भी, यदि आप एक चुनौती के विचार से रोमांचित हैं, तो अपने सीटबेल्ट को जकड़ लें, तैयार रहें और चलो शुरू करो!

डेमो वेबसाइट का निर्माण

हमारी साइट एक स्थिर ब्लॉग है। आप इसे सादे एचटीएमएल से बना सकते हैं, या एक स्थिर साइट जनरेटर जैसे कि जैकल, मिडलमन, या हेक्सो का लाभ उठा सकते हैं। इस ट्यूटोरियल के लिए हमारा डेमो निम्न प्रकार से दिखता है:

The website postThe website postThe website post
सादा पुराने सफेद।

एचटीएमएल संरचना के संबंध में कुछ चीजें हैं जो आपके ध्यान की आवश्यकता होती हैं।

1
<!-- site header -->
2
<div class="content" id="main">
3
  <article class="article" id="article-5" data-article-id="5">
4
		<!-- content -->
5
	</article>
6
<!-- site footer -->
  1. जैसा कि आप ऊपर कोड स्निपेट से देख सकते हैं, आर्टकल को एक अद्वितीय ID के साथ एक HTML element में लपेटा जाना चाहिए। आप एक div या section तत्व का उपयोग कर सकते हैं, तत्व के लिए id नामकरण के कार्य में कोई संयम न हो।
  2. साथ ही, आर्टकल पर ही, आपको data-article-id ऐट्रब्यूट जोड़ने की आवश्यकता होगी जिसमें आलेख के संबंधित id संख्या शामिल है।

वेबसाइट शैलियों की अवधि में विस्तृत करने के लिए स्वतंत्र महसूस करें; इसे अधिक रंगीन, आकर्षक बनाना, या अधिक तत्व जोड़ने।

जावास्क्रिप्ट लोड करें

आरंभ करने के लिए, निम्न जावास्क्रिप्ट पुस्तकालयों को अपने ब्लॉग के प्रत्येक पृष्ठ पर निम्न क्रम में लोड करें।

  • jquery.js : लाइब्रेरी जो हम तत्वों को चुनने, नई सामग्री जोड़ने, नए वर्ग जोड़ने और AJAX अनुरोध करने के लिए उपयोग करेंगे।
  • history.js : एक पॉलीफ़िल जो ब्राउज़रों के मूल इतिहास एपीआई की ओर जाता है।

हमारे कस्टम जेक्वीरी(jQuery) प्लगइन

इन दो के अलावा, हमें अपनी जावास्क्रिप्ट फाइल को लोड करना होगा जहां हम स्क्रॉल को अनंत स्क्रॉल करने के लिए लिख सकते हैं। जिस तरीके से हम ले लेंगे, वह है कि हम जावास्क्रिप्ट को जेक्वीरी(jQuery) के प्लगइन में लपेटें, बल्कि इसे सीधे लिखने के बजाय, जैसा हमने पिछले ट्यूटोरियल में किया है।

हम जेक्वीरी प्लगइन बॉयलरप्लेट के साथ प्लगइन शुरू कर देंगे। यह एचटीएमएल 5 बॉयलरप्लेट के समान है, क्योंकि इसमें टेम्पलेट्स, पैटर्न और श्रेष्ठ प्रथाओं का एक संग्रह प्रदान करता है, जिस पर एक जेक्वीरी प्लगइन का निर्माण होता है।

बॉयलरप्लेट डाउनलोड करें, इसे अपनी वेबसाइट की निर्देशिका में रखें जहां सभी जावास्क्रिप्ट फाइलें मौजूद हैं (जैसे /assets/js/) और फ़ाइल को "keepscrolling.Jquery.js" में नाम बदलें। (यह नाम डोरियों से फाइन्डिंग निमो और उनकी प्रसिद्ध रेखा "कीप स्विमिंग") से प्रेरित था।

1
assets/js
2
├── keepscrolling.jquery.js
3
├── keepscrolling.jquery.js.map
4
└── src
5
    └── keepscrolling.jquery.js

प्लगइन हमें विकल्प या सेटिंग्स के साथ लचीलेपन को लागू करने की अनुमति देगा।

जेक्वीरी प्लगइन संरचना को देखकर

एक जेक्वीरी के प्लगइन को लिखने से थोड़ा अलग तरीके से सोचने की आवश्यकता होती है, इसलिए हम पहले यह जांचेंगे कि हमारे जेक्वीरी प्लगिन किसी भी कोड में जोड़ने से पहले संरचित है। जैसा कि आप नीचे देख सकते हैं, मैंने कोड को चार भागों में विभाजित किया है:

1
;( function( $, window, document, undefined ) {
2
3
	"use strict";
4
5
	// 1.

6
	var pluginName = "keepScrolling",
7
		 defaults = {};
8
9
	// 2.

10
	function Plugin ( element, options ) {
11
12
		this.element = element;
13
		this.settings = $.extend( {}, defaults, options );
14
15
		this._defaults = defaults;
16
		this._name = pluginName;
17
18
		this.init();
19
	}
20
21
	// 3.

22
	$.extend( Plugin.prototype, {
23
		init: function() {
24
			console.log( "Plugin initialized" );
25
		},
26
	} );
27
28
	// 4.

29
	$.fn[ pluginName ] = function( options ) {
30
		return this.each( function() {
31
			if ( !$.data( this, "plugin_" + pluginName ) ) {
32
				$.data( this, "plugin_" +
33
					pluginName, new Plugin( this, options ) );
34
			}
35
		} );
36
	};
37
38
} )( jQuery, window, document );
  1. कोड के पहले खंड में, हम अपना प्लगिन नाम निर्दिष्ट करते हैं,keepScrolling, जावास्क्रिप्ट सामान्य नामकरण सम्मेलनों के अनुसार "camel case" के साथ। हमारे पास एक वैरिएबल, defaults, जिसमें प्लगइन डिफ़ॉल्ट सेटिंग शामिल होनी चाहिए।
  2. इसके बाद, हमारे पास प्लगइन का मुख्य फ़ंक्शन Plugin() है। इस फ़ंक्शन को "constructor" से तुलना किया जा सकता है, जो इस स्थिति में, प्लगइन को इनिशियलाइज़ करना है और प्लगइन को तत्काल प्रदान करते समय किसी भी पारित होने के साथ डिफ़ॉल्ट सेटिंग्स को मर्ज करना है।
  3. तीसरा खंड है, जहां हम अनंत स्क्रॉलिंग की कार्यक्षमता को पूरा करने के लिए अपने स्वयं के कार्यों का निर्माण करेंगे।
  4. अंत में, चौथा खंड एक है जो संपूर्ण चीज़ को एक जेक्वीरी प्लगइन में कवर करना है।

इन सभी सेटों के साथ, अब हम हमारी जावास्क्रिप्ट रचना कर सकते हैं। और हम अपने प्लगइन के डिफ़ॉल्ट विकल्पों को परिभाषित करके शुरू करते हैं।

विकल्प

1
;( function( $, window, document, undefined ) {
2
3
	"use strict";
4
5
	var pluginName = "keepScrolling",
6
		 defaults = {
7
		 	floor: null,
8
			article: null,
9
			data: {}
10
		 };
11
	...
12
13
} )( jQuery, window, document );

जैसा कि आप ऊपर देख सकते हैं, हमने निर्धारित तीन विकल्प निर्धारित किए हैं:

  • floor: एक आईडी(id) चयनकर्ता-जैसे #floor या #footer- जिसका हम वेबसाइट या सामग्री के अंत पर विचार करते हैं। आमतौर पर, यह साइट पाद फुटर होगा।
  • article: एक क्लास सिलेक्टर जो आर्टिकल को कवर करता है।
  • data: चूंकि हमारे पास किसी भी बाह्य एपीआई तक पहुंच नहीं है (हमारी वेबसाइट स्थिर है) हमें आलेख डेटा का एक संग्रह, जैसे लेख URL, आईडी, और इस विकल्प तर्क के रूप में JSON प्रारूप में शीर्षक।

दी फंगक्शनस

यहां हमारे पास init() है। इस फ़ंक्शन में, हम कई कार्यों में जोड़ देंगे जो साइट आरंभीकरण के दौरान तुरंत चलाना होगा। उदाहरण के लिए, हम साइट का फर्श चुनते हैं।

1
$.extend( Plugin.prototype, {
2
3
	// The `init()` function.

4
	init: function() {
5
		this.siteFloor = $( this.settings.floor ); // select the element set as the site floor.

6
	},
7
} );

कुछ फंगक्शनस भी हैं जो हम आरंभीकरण के बाहर चलाएंगे। हम इन फ़ंक्शन को init फ़ंक्शन के बाद बनाने और जोड़ने के लिए जोड़ते हैं।

हम जिन कार्यों का पहला समूह लिखेंगे वे हम हैं जिन्हें हम "thing(चीज़)" प्राप्त करने या वापस लाने के लिए उपयोग करते हैं; स्ट्रिंग, एक ऑब्जेक्ट, या एक नंबर से कुछ जो प्लगइन में अन्य सभी फ़ंक्शन में पुन: प्रयोज्य होगा। इनमें चीजों में शामिल हैं:

पृष्ठ पर सभी लेख प्राप्त करें:

1
/**

2
 * Find and returns list of articles on the page.

3
 * @return {jQuery Object} List of selected articles.

4
 */
5
getArticles: function() {
6
	return $( this.element ).find( this.settings.article );
7
},

लेख का पता प्राप्त करें। वर्डप्रेस में, यह लोकप्रिय "पोस्ट स्लग" के रूप में जाना जाता है।

1
/**

2
 * Returns the article Address.

3
 * @param  {Integer} i The article index.

4
 * @return {String}    The article address, e.g. `post-two.html`

5
 */
6
getArticleAddr: function( i ) {
7
8
	var href = window.location.href;
9
	var root = href.substr( 0, href.lastIndexOf( "/" ) );
10
11
	return root + "/" + this.settings.data[ i ].address + ".html";
12
},

पुनः प्राप्त करने के लिए अगले लेख आईडी(id) और पता प्राप्त करें।

1
/**

2
 * Return the "next" article.

3
 * @return {Object} The `id` and `url` of the next article.

4
 */
5
getNextArticle: function() {
6
7
	// Select the last article.

8
	var $last = this.getArticles().last();
9
10
	var articlePrevURL;
11
12
	/**

13
	 * This is a simplified way to determine the content ID.

14
	 *

15
	 * Herein, we substract the last post ID by `1`.

16
	 * Ideally, we should be calling call an API endpoint, for example:

17
	 * https://www.techinasia.com/wp-json/techinasia/2.0/posts/329951/previous/

18
	 */
19
	var articleID = $last.data( "article-id" );
20
	var articlePrevID = parseInt( articleID, 10 ) - 1; // Previous ID

21
22
	// Loop into the Option `data`, and get the correspending Address.

23
	for ( var i = this.settings.data.length - 1; i >= 0; i-- ) {
24
		if ( this.settings.data[ i ].id === articlePrevID ) {
25
			articlePrevURL = this.getArticleAddr( i ) ;
26
		}
27
	}
28
29
	return {
30
		id: articlePrevID,
31
		url: articlePrevURL
32
	};
33
},

प्लगइन की उपयोगिता कार्य निम्न हैं; एक ऐसा कार्य जिसे एक विशेष "thing(चीज़)" करने के लिए जिम्मेदार है। इसमें शामिल है:

एक फ़ंक्शन जो बताता है कि कोई तत्व व्यूपोर्ट में प्रवेश कर रहा है या नहीं। हम इसे मुख्य रूप से यह बताते हैं कि परिभाषित साइट "floor(मंजिल)" व्यूपोर्ट के भीतर दिखाई दे रही है या नहीं।

1
/**

2
 * Detect whether the target element is visible.

3
 * https://stackoverflow.com/q/123999/

4
 *

5
 * @return {Boolean} `true` if the element in viewport, and `false` if not.

6
 */
7
isVisible: function() {
8
	if ( target instanceof jQuery ) {
9
		target = target[ 0 ];
10
	}
11
12
	var rect = target.getBoundingClientRect();
13
14
	return rect.bottom > 0 &&
15
		rect.right > 0 &&
16
		rect.left < ( window.innerWidth || document.documentElement.clientWidth ) &&
17
		rect.top < ( window.innerHeight || document.documentElement.clientHeight );
18
}, 

फ़ंक्शन निष्पादन को रोकता है जो एक समारोह; डिबेंस के रूप में जाना जाता है। जैसा कि पहले उल्लेख किया गया है, हम उपयोगकर्ता स्क्रॉलिंग गतिविधि से निपटेंगे जो कि बहुत अधिक दर पर होगा। इस प्रकार scroll इवेंट के भीतर एक फ़ंक्शन उपयोगकर्ता स्क्रॉलिंग के बाद अक्सर चलती है, जो सुस्त या लगी साइट पर स्क्रॉलिंग अनुभव को चालू कर देगा।

उपरोक्त डीबंस फ़ंक्शन निष्पादन आवृत्ति को कम करेगा। यह समारोह चलाने से पहले उपयोगकर्ता को स्क्रॉल करना बंद करने के बाद, wait पैरामीटर के माध्यम से, निर्दिष्ट समय की प्रतीक्षा करेंगे।

1
/**

2
 * Returns a function, that, as long as it continues to be invoked, will not b

3
 * triggered.

4
 * The function will be called after it stops being called for N milliseconds.

5
 * If immediate is passed, trigger the function on the leading edge, instead of

6
 * the trailing.

7
 *

8
 * @link https://davidwalsh.name/function-debounce

9
 * @link http://underscorejs.org/docs/underscore.html#section-83

10
 *

11
 * @param  {Function} func   	  Function to debounce

12
 * @param  {Integer}  wait      The time in ms before the Function run

13
 * @param  {Boolean}  immediate

14
 * @return {Void}

15
 */
16
isDebounced: function( func, wait, immediate ) {
17
	var timeout;
18
19
	return function() {
20
21
		var context = this,
22
		args = arguments;
23
24
		var later = function() {
25
			timeout = null;
26
			if ( !immediate ) {
27
				func.apply( context, args );
28
			}
29
		};
30
31
		var callNow = immediate && !timeout;
32
33
		clearTimeout( timeout );
34
		timeout = setTimeout( later, wait );
35
36
		if ( callNow ) {
37
			func.apply( context, args );
38
		}
39
	};
40
}, 

एक फ़ंक्शन जो निर्धारित करता है कि आगे बढ़ने या ऑपरेशन को रद्द करना है या नहीं।

1
/**

2
 * Whether to proceed ( or not to ) fetching a new article.

3
 * @return {Boolean} [description]

4
 */
5
isProceed: function() {
6
7
	if ( articleFetching // check if we are currently fetching a new content.

8
		  || articleEnding // check if no more article to load.

9
		  || !this.isVisible( this.siteFloor ) // check if the defined "floor" is visible.

10
		  ) {
11
		return;
12
	}
13
14
	if ( this.getNextArticle().id <= 0 ) {
15
		articleEnding = true;
16
		return;
17
	}
18
19
	return true;
20
},

हम पूर्ववर्ती उपयोगिता फ़ंक्शन का उपयोग करेंगे, isProceed(), यह जांचने के लिए कि सभी शर्तों को नई सामग्री खींचने के लिए आगे बढ़ना है या नहीं। यदि हां, तो जो फंगक्शन होगा, वह चल जाएगा, नई तत्व को लाएगा और आखिरी अनुच्छेद के बाद इसे जोड़ देगा।

1
/**

2
 * Function to fetch and append a new article.

3
 * @return {Void}

4
 */
5
fetch: function() {
6
7
	// Shall proceed or not?

8
	if ( !this.isProceed() ) {
9
		return;
10
	}
11
12
	var main = this.element;
13
	var $articleLast = this.getArticles().last();
14
15
	$.ajax( {
16
		url: this.getNextArticle().url,
17
		type: "GET",
18
		dataType: "html",
19
		beforeSend: function() {
20
			articleFetching = true;
21
		}
22
	} )
23
24
	/**

25
	 * When the request is complete and it successly

26
	 * retrieves the content, we append the content.

27
	 */
28
	.done( function( res ) {
29
		$articleLast
30
			.after( function() {
31
				if ( !res ) {
32
					return;
33
				}
34
				return $( res ).find( "#" + main.id ).html();
35
			} );
36
	} )
37
38
	/**

39
	 * When the function is complete, whether it `fail` or `done`,

40
	 * always set the `articleFetching` to false.

41
	 * It specifies that we are done fetching the new content.

42
	 */
43
	.always( function() {
44
		articleFetching = false;
45
	} );
46
},

इस फ़ंक्शन को init के अंदर जोड़ें। इसलिए फ़ंक्शन जल्द ही प्लग-इन प्रारंभ हो जायेगा, और तब शर्तों को पूरा होने पर नई सामग्री को पुनः प्राप्त करेगा।

1
init: function() {
2
	this.siteFloor = $( this.settings.floor ); // select the element set as the site floor.

3
	this.fetch();
4
},

अगला, हम इतिहास वेब एपीआई(API) के साथ ब्राउज़र इतिहास को बदलने के लिए एक फ़ंक्शन जोड़ देंगे। यह विशेष फंगक्शन हमारे पूर्ववर्ती कार्यों की अपेक्षा अधिक जटिल है। यहां मुश्किल भाग यह है कि जब हमें उपयोगकर्ता स्क्रॉल, दस्तावेज़ शीर्षक, साथ ही यूआरएल(URL) के दौरान इतिहास को बदलना चाहिए। फ़ंक्शन के पीछे के विचार को आसान बनाने में मदद करने के लिए निम्नलिखित एक उदाहरण है:

जैसा कि आप इस आंकड़े से देख सकते हैं, हमारे पास तीन रेखाएं हैं: "रूफ-लाइन", "मिड-लाइन", और "फ्लॉर -लाइन" जो कि व्यूपोर्ट के भीतर लेख की स्थिति को दर्शाती है। छवि दर्शाती है कि पहले लेख के नीचे, साथ ही साथ दूसरे लेख के शीर्ष, अब मिड-लाइन पर है। यह उपयोगकर्ता के इरादों को विशिष्ट नहीं बताता है कि वे किस लेख को देख रहे हैं; क्या यह पहली पोस्ट है या यह दूसरी पोस्ट है? इसलिए, हम ब्राउज़र इतिहास को तब नहीं बदलेंगे जब दो लेख इस स्थिति में हों।

हम इतिहास को अगले पश्चात रिकॉर्ड कर देंगे जब लेख शीर्ष "रूफ-लाइन" तक पहुंच जाएगा, क्योंकि यह व्यूपोर्ट के अधिकतर दृश्य भागों को लेता है।

हम पिछली पोस्ट के इतिहास को रिकॉर्ड करते हैं, जब इसके नीचे "फ्लॉर -लाइन" को हिट हो जाता है, इसी प्रकार, क्योंकि अब यह व्यूपोर्ट के सबसे अधिक दृश्य भाग लेता है।

यह "while" कोड है जिसमें आपको इसमें शामिल करने की आवश्यकता होगी:

1
init: function() {
2
	this.roofLine = Math.ceil( window.innerHeight * 0.4 ); // set the roofLine;

3
	this.siteFloor = $( this.settings.floor );
4
	this.fetch();
5
},
6
/**

7
 * Change the browser history.

8
 * @return {Void}

9
 */
10
history: function() {
11
12
	if ( !window.History.enabled ) {
13
		return;
14
	}
15
16
	this.getArticles()
17
		.each( function( index, article ) {
18
19
			var scrollTop = $( window ).scrollTop();
20
			var articleOffset = Math.floor( article.offsetTop - scrollTop );
21
22
			if ( articleOffset > this.threshold ) {
23
				return;
24
			}
25
26
			var articleFloor = ( article.clientHeight - ( this.threshold * 1.4 ) );
27
				 articleFloor = Math.floor( articleFloor * -1 );
28
29
			if ( articleOffset < articleFloor ) {
30
				return;
31
			}
32
33
			var articleID = $( article ).data( "article-id" );
34
				 articleID = parseInt( articleID, 10 );
35
36
			var articleIndex;
37
			for ( var i = this.settings.data.length - 1; i >= 0; i-- ) {
38
				if ( this.settings.data[ i ].id === articleID ) {
39
					articleIndex = i;
40
				}
41
			}
42
43
			var articleURL = this.getArticleAddr( articleIndex );
44
45
			if ( window.location.href !== articleURL ) {
46
				var articleTitle = this.settings.data[ articleIndex ].title;
47
				window.History.pushState( null, articleTitle, articleURL );
48
			}
49
		}.bind( this ) );
50
},

अन्त में, हम ऐसा फ़ंक्शन बनाते हैं जो fetch() और history() चलाएंगे जब उपयोगकर्ता पृष्ठ स्क्रॉल कर रहा होगा। ऐसा करने के लिए हम scroller() नामक एक नया फ़ंक्शन बनाते हैं, और इसे प्लग इन आरंभीकरण पर चलाते हैं।

1
/**

2
 * Functions to run during the scroll.

3
 * @return {Void}

4
 */
5
scroller: function() {
6
	window.addEventListener( "scroll", this.isDebounced( function() {
7
		this.fetch();
8
		this.history();
9
	}, 300 ).bind( this ), false );
10
}

और जैसा कि आप ऊपर देख सकते हैं,हम debounce को एजेएक्स का प्रदर्शन करते हैं और ब्राउज़र इतिहास बदलते हैं क्योंकि इन्हें एक महंगा ऑपरेशन होता है।

तत्व प्लेसहोल्डर जोड़ना

यह वैकल्पिक है, लेकिन उपयोगकर्ता अनुभव का सम्मान करने के लिए अनुशंसित है। प्लेसहोल्डर उपयोगकर्ता को प्रतिक्रिया देता है, संकेत देता है कि एक नया लेख उसके रास्ते पर है।

सबसे पहले, हम प्लेसहोल्डर टेम्पलेट बनाते हैं। सामान्य तौर पर इस प्रकार का टेम्पलेट साइट पाद लेख के बाद रखा जाता है।

1
<script type="text/template" id="tmpl-placeholder">
2
	<div class="placeholder placeholder--article" id="placeholder-article">
3
		<div class="container">
4
			<div class="placeholder__header animated">
5
				<h1></h1>

6
			</div>

7
			<div>
8
				<p class="placeholder__p-1 animated"></p>

9
				<p class="placeholder__p-2 animated"></p>

10
			</div>

11
		</div>

12
	</div>

13
</script>

ध्यान रखें कि प्लेसहोल्डर लेख, इसकी संरचना, आपके ब्लॉग की वास्तविक सामग्री के समान होना चाहिए। एचटीएमएल संरचना तदनुसार समायोजित करें।

प्लेसहोल्डर शैलियों सरल है। इसमें सभी मूलभूत शैलियों को वास्तविक लेख की तरह रखना है, एनीमेशन @keyframe जो लदान की भावना का अनुकरण करती है, और दृश्यता को टॉगल करने के लिए शैली (प्लेसहोल्डर शुरू में छुपा हुआ है, यह केवल तभी दिखाया जाता है जब मूल तत्व को आकर्षित करना होता है fetching क्लैस)।

1
.placeholder {
2
	color: @gray-light;
3
	padding-top: 60px;
4
	padding-bottom: 60px;
5
	border-top: 6px solid @gray-lighter;
6
	display: none;
7
	.fetching & {
8
		display: block;
9
	}
10
	p {
11
		display: block;
12
		height: 20px;
13
		background: @gray-light;
14
	}
15
	&__header {
16
		animation-delay:.1s;
17
		h1 {
18
			height: 30px;
19
			background-color: @gray-light;
20
		}
21
	}
22
	&__p-1 {
23
		animation-delay:.2s;
24
		width: 80%;
25
	}
26
	&__p-2 {
27
		animation-delay:.3s;
28
		width: 70%;
29
	}
30
}

फिर हम AJAX अनुरोध के दौरान प्लेसहोल्डर को दिखाने के लिए कुछ पंक्तियों को अपडेट करते हैं, निम्नानुसार।

1
/**

2
 * Initialize.

3
 * @return {Void}

4
 */
5
init: function() {
6
7
	this.roofLine = Math.ceil( window.innerHeight * 0.4 );
8
	this.siteFloor = $( this.settings.floor );
9
10
	this.addPlaceholder();
11
12
	this.fetch();
13
	this.scroller();
14
},
15
16
/**

17
 * Append the addPlaceholder.

18
 * Placeholder is used to indicate a new post is being loaded.

19
 * @return {Void}

20
 */
21
addPlaceholder: function() {
22
23
	var tmplPlaceholder = document.getElementById( "tmpl-placeholder" );
24
		 tmplPlaceholder = tmplPlaceholder.innerHTML;
25
26
		$( this.element ).append( tmplPlaceholder );
27
},
28
29
/**

30
 * Function to fetch and append a new article.

31
 * @return {Void}

32
 */
33
fetch: function() {
34
	...
35
36
	// Select the element wrapping the article.

37
	var main = this.element;
38
39
	$.ajax( {
40
41
		...
42
43
		beforeSend: function() {
44
45
			...
46
			// Add the 'fetching' class.

47
			$( main ).addClass( function() {
48
				return "fetching";
49
			} );
50
		}
51
	} )
52
53
	...
54
55
	.always( function() {
56
57
		...
58
		// Remove the 'fetching' class.

59
		$( main ).removeClass( function() {
60
			return "fetching";
61
		} );
62
	} );

इसी तरह हम प्लेसहोल्डर को संभालते हैं! हमारा प्लगइन पूरा हो गया है, और यह प्लगइन को परिनियोजित करने का समय है।

डिप्लॉयमेंट

प्लगइन की डिप्लॉयिंग काफी आसान है। हम उस तत्व को निर्दिष्ट करते हैं जो हमारे ब्लॉग लेख को छिपाते हैं, और हमारे प्लगइन को विकल्प सेट के साथ कहते हैं, जैसा कि निम्न है।

1
$( document ).ready( function() {
2
	$( "#main" ).keepScrolling({
3
		floor: "#footer",
4
		article: ".article",
5
		data : [{
6
			"id": 1,
7
			"address": "post-one",
8
			"title": "Post One"
9
		}, {
10
			"id": 2,
11
			"address": "post-two",
12
			"title": "Post Two"
13
		}, {
14
			"id": 3,
15
			"address": "post-three",
16
			"title": "Post Three"
17
		}, {
18
			"id": 4,
19
			"address": "post-four",
20
			"title": "Post Four"
21
		}, {
22
			"id": 5,
23
			"address": "post-five",
24
			"title": "Post Five"
25
		}]
26
	});
27
} );

अनंत स्क्रॉल अब कार्य करना चाहिए।

केवीऐट : वापस बटन

इस ट्यूटोरियल में, हमने एक अनंत स्क्रॉल अनुभव बनाया है; कुछ ऐसा है जिसे हम आमतौर पर क्वार्ट्ज, टेकिनिया और कई मोबाइल एप्लिकेशन जैसे समाचार साइटों पर देखा करते थे।

यद्यपि यह उपयोगकर्ता सगाई को बनाए रखने का एक प्रभावी तरीका साबित हुआ है, लेकिन इसमें भी नकारात्मक प्रभाव पड़ता है: यह ब्राउज़र में "बैक" बटन को तोड़ता है। जब आप बटन पर क्लिक करते हैं, तो यह आपको पिछली पिछली विज़िट की गई तत्व या पृष्ठ पर वापस स्क्रॉल नहीं करेगा।

वेबसाइट विभिन्न तरीकों से इस मुद्दे का समाधान करते हैं; क्वार्ट्ज, उदाहरण के लिए, आपको निर्दिष्ट(referred) यूआरएल पर भेज देगा; वह यूआरएल जो आपने पहले देखा है, लेकिन वेब इतिहास एपीआई के माध्यम से रिकॉर्ड किए गए एक नहीं। TechInAsia बस आपको वापस होमपेज पर ले जाएगा।

रैपिंग अप

यह ट्यूटोरियल कई चीजों को कवर करने में लंबा है! उनमें से कुछ समझना आसान है, जबकि कुछ टुकड़े पचाने में आसान नहीं हो सकते हैं। मदद करने के लिए, मैंने इस आलेख के पूरक के रूप में संदर्भों की एक सूची डाल दी है।

अंत में, पूर्ण स्रोत कोड पर गौर करें और डेमो देखें!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.