Si ningun plugin logra hacer lo que deseas, lo mejor es que crees uno de acuerdo a tus necesidades, despues de todo tienes jQuery mobile y este da facilidades.
Aca te dejo un simple plugin que hize:
var pullFresh = function(selector, options)
{
'use strict';
if( $(selector).find('._wrapper').length === 0)
{
$(selector).css('position', 'relative');
$(selector).wrapInner('<div class="_wrapper">');
}
var container = $(selector).find('._wrapper'),
drag = false,
start_pos,
callbacks = {},
perform_callback = function(callback)
{
var args = Array.prototype.slice.call(arguments);
if(callbacks[callback])
callbacks[callback].apply(null, args.slice(1));
},
pull_pos = function()
{
return parseInt($(container).css('top'), 10);
},
reset_pos = function()
{
drag = false;
$(container).stop().animate({
top : 0
}, 100);
},
set_default_opts = function(options)
{
var default_opts = {
threshold : 100,
offsetTop : 0
};
for(var opt in default_opts)
{
if( !options[opt] )
options[opt] = default_opts[opt];
}
return options;
};
options = set_default_opts(options || {});
this.on = function(type, callback)
{
if( $.inArray(type, ['refresh', 'pull', 'start-pull', 'end-pull', 'init']) === -1)
return false;
callbacks[type] = callback;
return this;
}
if( isNaN(pull_pos) )
{
$(container).css({
'top': 0,
'position' : 'relative'
});
}
$(container).on('vmousedown', function(event){
drag = true;
start_pos = event.pageY;
perform_callback('start');
});
$(container).on('vmouseup vmouseleave', function(event){
drag = false;
reset_pos();
perform_callback('end-pull');
});
$(container).on('vmousemove', function(event){
var pull_offset = (event.pageY - start_pos),
pull_percentage;
if( !drag )
return false;
if( ($(window).scrollTop() - $('.content').offset().top) > options.offsetTop )
return false;
if( pull_offset >= options.threshold || pull_offset < 0)
{
reset_pos();
perform_callback('end-pull');
if(pull_offset >= options.threshold)
perform_callback('refresh');
return false;
}
$(container).css('top', pull_offset);
perform_callback('pull', pull_offset, (pull_offset * 100) / options.threshold);
});
return this;
};
funciona de esta forma:
new pullFresh('.selector', {
threshold : 200
})
.on('refresh', function()
{
})
.on('pull', function(pos, percentage)
{
})
.on('end-pull', function()
{
});
la sintaxis:
new pullFresh(
selector, opciones )
.on(
evento, callback() )
demo:
http://jsfiddle.net/9zcccnkf/1/embedded/result/
http://jsfiddle.net/9zcccnkf/1/