This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

tagged version 1.3

  • Loading branch information...
candrews committed Aug 5, 2009
0 parents commit 7e234fca57223e0f8574c7ecfb9af2343d5da9f7
Binary file not shown.
@@ -0,0 +1,251 @@
+
+/*!
+// Infinite Scroll jQuery plugin
+// copyright Paul Irish, licensed GPL & MIT
+// version 1.2.090804
+
+// home and docs: http://www.infinite-scroll.com
+*/
+
+// todo: add preloading option.
+
+;(function($){
+
+ $.fn.infinitescroll = function(options,callback){
+
+ // console log wrapper.
+ function debug(){
+ if (opts.debug) { window.console && console.log.call(console,arguments)}
+ }
+
+ // grab each selector option and see if any fail.
+ function areSelectorsValid(opts){
+ for (var key in opts){
+ if (key.indexOf && key.indexOf('Selector') && $(opts[key]).length === 0){
+ debug('Your ' + key + ' found no elements.');
+ return false;
+ }
+ return true;
+ }
+ }
+
+
+ // find the number to increment in the path.
+ function determinePath(path){
+
+ path.match(relurl) ? path.match(relurl)[2] : path;
+
+ // there is a 2 in the url surrounded by slashes, e.g. /page/2/
+ if ( path.match(/^(.*?)\b2\b(.*?$)/) ){
+ path = path.match(/^(.*?)\b2\b(.*?$)/).slice(1);
+ } else
+ // if there is any 2 in the url at all.
+ if (path.match(/^(.*?)2(.*?$)/)){
+ debug('Trying backup next selector parse technique. Treacherous waters here, matey.');
+ path = path.match(/^(.*?)2(.*?$)/).slice(1);
+ } else {
+ debug('Sorry, we couldn\'t parse your Next (Previous Posts) URL. Verify your the css selector points to the correct A tag. If you still get this error: yell, scream, and kindly ask for help at infinite-scroll.com.');
+ props.isInvalidPage = true; //prevent it from running on this page.
+ }
+
+ return path;
+ }
+
+
+ // 'document' means the full document usually, but sometimes the content of the overflow'd div in local mode
+ function getDocumentHeight(){
+ // weird doubletouch of scrollheight because http://soulpass.com/2006/07/24/ie-and-scrollheight/
+ return opts.localMode ? ($(props.container)[0].scrollHeight && $(props.container)[0].scrollHeight)
+ // needs to be document's height. (not props.container's) html's height is wrong in IE.
+ : $(document).height()
+ }
+
+
+
+ function isNearBottom(opts,props){
+
+ // distance remaining in the scroll
+ // computed as: document height - distance already scroll - viewport height - buffer
+ var pixelsFromWindowBottomToBottom = getDocumentHeight() -
+ (opts.localMode ? $(props.container).scrollTop() :
+ // have to do this bs because safari doesnt report a scrollTop on the html element
+ ($(props.container).scrollTop() || $(props.container.ownerDocument.body).scrollTop())) -
+ $(opts.localMode ? props.container : window).height();
+
+ debug('math:',pixelsFromWindowBottomToBottom, props.pixelsFromNavToBottom);
+
+ // if distance remaining in the scroll (including buffer) is less than the orignal nav to bottom....
+ return (pixelsFromWindowBottomToBottom - opts.bufferPx < props.pixelsFromNavToBottom);
+ }
+
+ function showDoneMsg(){
+ props.loadingMsg
+ .find('img').hide()
+ .parent()
+ .find('div').html(opts.donetext).animate({opacity: 1},2000).fadeOut('normal');
+
+ // user provided callback when done
+ opts.errorCallback();
+ }
+
+ function infscrSetup(path,opts,props,callback){
+
+ if (props.isDuringAjax || props.isInvalidPage || props.isDone) return;
+
+ if ( !isNearBottom(opts,props) ) return;
+
+ // we dont want to fire the ajax multiple times
+ props.isDuringAjax = true;
+
+ // show the loading message and hide the previous/next links
+ props.loadingMsg.appendTo( opts.contentSelector ).show();
+ $( opts.navSelector ).hide();
+
+ // increment the URL bit. e.g. /page/3/
+ props.currPage++;
+
+ debug('heading into ajax',path);
+
+ // if we're dealing with a table we can't use DIVs
+ var box = $(opts.contentSelector).is('table') ? $('<tbody/>') : $('<div/>');
+
+ box
+ .attr('id','infscr-page-'+props.currPage)
+ .addClass('infscr-pages')
+ .appendTo( opts.contentSelector )
+ .load( path.join( props.currPage ) + ' ' + opts.itemSelector,null,function(){
+
+ // if we've hit the last page...
+ if (props.isDone){
+ showDoneMsg();
+ return false;
+
+ } else {
+
+ // if it didn't return anything
+ if (box.children().length == 0){
+ // fake an ajaxError so we can quit.
+ $.event.trigger( "ajaxError", [{status:404}] );
+ }
+
+ // fadeout currently makes the <em>'d text ugly in IE6
+ props.loadingMsg.fadeOut('normal' );
+
+ // smooth scroll to ease in the new content
+ if (opts.animate){
+ var scrollTo = $(window).scrollTop() + $('#infscr-loading').height() + opts.extraScrollPx + 'px';
+ $('html,body').animate({scrollTop: scrollTo}, 800,function(){ props.isDuringAjax = false; });
+ }
+
+ // pass in the new DOM element as context for the callback
+ callback.call( box[0] );
+
+ if (!opts.animate) props.isDuringAjax = false; // once the call is done, we can allow it again.
+ }
+ }); // end of load()
+
+
+ } // end of infscrSetup()
+
+
+
+
+ // lets get started.
+
+ var opts = $.extend({}, $.infinitescroll.defaults, options);
+ var props = $.infinitescroll; // shorthand
+ callback = callback || function(){};
+
+ if (!areSelectorsValid(opts)){ return false; }
+
+ // we doing this on an overflow:auto div?
+ props.container = opts.localMode ? this : document.documentElement;
+
+ // contentSelector we'll use for our .load()
+ opts.contentSelector = opts.contentSelector || this;
+
+
+ // get the relative URL - everything past the domain name.
+ var relurl = /(.*?\/\/).*?(\/.*)/;
+ var path = $(opts.nextSelector).attr('href');
+
+
+ if (!path) { debug('Navigation selector not found'); return; }
+
+ // set the path to be a relative URL from root.
+ path = determinePath(path);
+
+
+ // reset scrollTop in case of page refresh:
+ if (opts.localMode) $(props.container)[0].scrollTop = 0;
+
+ // distance from nav links to bottom
+ // computed as: height of the document + top offset of container - top offset of nav link
+ props.pixelsFromNavToBottom = getDocumentHeight() +
+ $(props.container).offset().top -
+ $(opts.navSelector).offset().top;
+
+ // define loading msg
+ props.loadingMsg = $('<div id="infscr-loading" style="text-align: center;"><img alt="Loading..." src="'+
+ opts.loadingImg+'" /><div>'+opts.loadingText+'</div></div>');
+ // preload the image
+ (new Image()).src = opts.loadingImg;
+
+
+
+ // set up our bindings
+ $(document).ajaxError(function(e,xhr,opt){
+ debug('Page not found. Self-destructing...');
+
+ // die if we're out of pages.
+ if (xhr.status == 404){
+ showDoneMsg();
+ props.isDone = true;
+ $(opts.localMode ? this : window).unbind('scroll.infscr');
+ }
+ });
+
+ // bind scroll handler to element (if its a local scroll) or window
+ $(opts.localMode ? this : window)
+ .bind('scroll.infscr', function(){ infscrSetup(path,opts,props,callback); } )
+ .trigger('scroll.infscr'); // trigger the event, in case it's a short page
+
+
+ return this;
+
+ } // end of $.fn.infinitescroll()
+
+
+
+ // options and read-only properties object
+
+ $.infinitescroll = {
+ defaults : {
+ debug : false,
+ preload : false,
+ nextSelector : "div.navigation a:first",
+ loadingImg : "http://www.infinite-scroll.com/loading.gif",
+ loadingText : "<em>Loading the next set of posts...</em>",
+ donetext : "<em>Congratulations, you've reached the end of the internet.</em>",
+ navSelector : "div.navigation",
+ contentSelector : null, // not really a selector. :) it's whatever the method was called on..
+ extraScrollPx : 150,
+ itemSelector : "div.post",
+ animate : false,
+ localMode : false,
+ bufferPx : 40,
+ errorCallback : function(){}
+ },
+ loadingImg : undefined,
+ loadingMsg : undefined,
+ container : undefined,
+ currPage : 1,
+ currDOMChunk : null, // defined in setup()'s load()
+ isDuringAjax : false,
+ isInvalidPage : false,
+ isDone : false // for when it goes all the way through the archive.
+ };
+
+
+
+})(jQuery);

Some generated files are not rendered by default. Learn more.

Oops, something went wrong.
@@ -0,0 +1,69 @@
+=== Plugin Name ===
+Contributors: paul.irish, dirkhaim, candrews
+Donate link: http://www.infinite-scroll.com
+Tags: ajax, pagination, scrolling, scroll, endless, reading
+Requires at least: 2.3
+Tested up to: 2.8.3
+Stable tag: 1.3
+
+Automatically append the next page of posts (via AJAX) to your page when a user scrolls to the bottom.
+
+== Description ==
+
+Infinite Scroll adds the following functionality to your wordpress installation: **When a user scrolls towards the bottom of the page, the next page of posts is automatically retrieved and appended**. This means they never need to click "Next Page", which *dramatically increases stickiness*.
+
+Features:
+
+* Fully embraces progressive enhancement: RSS readers and js-off folks will be happy.
+* Fully customizable by text, css, and images.
+* Works on 80% of wordpress themes, with little or no configuration.
+* Hackable source code to modify the behavior.
+* Tested back to 2.3, but probably works on earlier versions.
+* Requires no (hopefully) template hacking, only a knowledge of CSS selectors.
+
+Full information on [infinite-scroll.com](http://www.infinite-scroll.com)
+
+
+== Installation ==
+
+1. Download the plugin.
+1. Install it to your /wp-content/plugins/ directory
+1. Activate the plugin in your Wordpress Admin UI.
+1. Visit the Settings / Infinite Scroll page to [set up the css selectors](http://www.infinite-scroll.com/installation/).
+1. The plugin will now work for a logged in Admin, but will be disabled for all other users; you can change this.
+
+
+== Frequently Asked Questions ==
+
+= Can I change the number of posts loaded? =
+
+Yup. But that's a Wordpress thing. Go to Settings / Reading
+
+= Why is this FAQ so short? =
+
+Because it is. Go to [infinite-scroll.com](http://www.infinite-scroll.com) for more.
+
+== Screenshots ==
+
+1. Loading the next set of posts
+
+== Changelog ==
+
+= 1.3 =
+Use proper Wordpress function to register the javascript
+Use plugins_url to determine plugin url
+
+= 1.2 =
+* 2009 August 4th
+* getoption(’siteurl’) fix made.
+* jQuery plugin version updated. many more options available.
+* Release backwards compatible
+
+= 1.1 =
+* 2008 September 25
+* JavaScript rewritten as a proper jQuery plugin.
+* Added animation
+
+= 1.0 =
+* June 29 - 1.0 release.
+
Binary file not shown.
Oops, something went wrong.

0 comments on commit 7e234fc

Please sign in to comment.