Skip to content
This repository has been archived by the owner on Apr 21, 2018. It is now read-only.

Commit

Permalink
tagged version 1.3
Browse files Browse the repository at this point in the history
  • Loading branch information
candrews committed Aug 5, 2009
0 parents commit 7e234fc
Show file tree
Hide file tree
Showing 6 changed files with 788 additions and 0 deletions.
Binary file added ajax-loader.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
251 changes: 251 additions & 0 deletions jquery.infinitescroll.js
Original file line number Original file line Diff line number Diff line change
@@ -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);
8 changes: 8 additions & 0 deletions jquery.infinitescroll.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

69 changes: 69 additions & 0 deletions readme.txt
Original file line number Original file line Diff line number Diff line change
@@ -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 added screenshot-1.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 7e234fc

Please sign in to comment.