Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .
nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data
:
function synchronousCode() {
var getURL = function(url) {
return window.fetch(url).data.text().data;
};
var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
console.log('received bytes:',getURL(url).length);
};
nsynjs.run(synchronousCode,{},function(){
console.log('synchronousCode done');
});
Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):
var ajaxGet = function (ctx,url) {
var res = {};
var ex;
$.ajax(url)
.done(function (data) {
res.data = data;
})
.fail(function(e) {
ex = e;
})
.always(function() {
ctx.resume(ex);
});
return res;
};
ajaxGet.nsynjsHasCallback = true;
Шаг 2. Вставить синхронную логику в функцию:
function process() {
console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}
Шаг 3. Выполнить функцию синхронно через nnsynjs:
nsynjs.run(process,this,function () {
console.log("synchronous function finished");
});
Nsynjs будет оценивать все операторы и выражения шаг за шагом, приостанавливая выполнение в случае, если результат некоторой медленной функции не готов.
Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples
Если это помогает, scrollTop и scrollLeft обновляются в реальном времени в обработчике событий touchmove:
$(function()
{
var $div = $("#scroll")
var $p = $("#display");
var update = function(e)
{
$p.text( e.type +": "+ $div.scrollLeft() +", "+ $div.scrollTop() );
}
$div.bind( "touchmove", update )
.bind( "scroll", update );
});
Вот мой репозиторий, где я добавил обратный вызов onScrolling()
, чтобы сообщить мне, когда анимация прокрутки импульса происходит в animate()
: https://github.com/simpleshadow/iscroll/blob/ master / src / iscroll.js
Я сделал пример приложения, используя его предложение здесь: http://jsfiddle.net/simpleshadow/wQQEM/22/
@ robertlawson86 в Github сделал это предложение, чтобы помочь составить представление о том, когда нужно захватить позицию во время прокрутки импульса. См. Пример и обсуждение: https://github.com/cubiq/iscroll/issues/183
Я знаю, что это странно, но вы можете отслеживать scrollLeft / scrollTop, просто зарегистрировав событие touchstart:
e.addEventListener("touchstart",function(event){});
Получите положение горизонтальной полосы прокрутки во время прокрутки (через css overflow-y: scroll)
$('#myNode').bind('scroll', function(e){
var myPos = e.target.scrollLeft;
// do something with myPos but don't naughty
})
Это может помочь. Это решение jQuery, которое я использую, чтобы накладывать разбивку на страницы на боковые стороны IOS. Это не совсем тот случай, когда вы работаете. Я использую «переполненную прокрутку: авто», которая не ведет себя как «сенсорная» версия.
#yourDiv {
-webkit-overflow-scrolling: auto;
overflow:auto;
}
Я использую «переполнение прокрутки: авто», потому что она быстрее реагирует на событие touchhend , Unfortunatley, «переполнение прокрутки: касание» действительно, похоже, не выдерживает javascript и анимацию CSS, пока она находится в движении. Но по крайней мере вы можете получить информацию о местоположении из нее во время прокрутки.
var pageSwiping = false;
$('#yourDiv').on('scroll', function(e) {
if (pageSwiping !== true ) {
pageSwiping = true;
var offset = $('#'+e.target.id).scrollLeft();
$('#yourDiv').one( 'touchend',{elem:e.target.id,dragStart:offset},divMove);
};
});
var divMove = function(e) {
pageSwiping = false;
var elem = e.data.elem;
var dragEnd = $('#'+elem).scrollLeft();
var dragDelta = (dragEnd - e.data.dragStart)
// Make page-alignment decisions based on dragDelta
};
В iOS Developer Library в руководстве Safari есть объяснения:
В принципе, поток событий для прокрутки выглядит следующим образом: touch / start dragging (событие мыши) -> панорамирование / перемещение (без событий) -> stop (onscroll)
Таким образом, нет ничего похожего на непрерывное событие прокрутки, которое запускается, в то время как в кассе есть только onScroll в конце жеста.
Если вы найдете дополнительный способ сделать это, дайте мне знать:)
В аналогичной ситуации я использую scrollability.js , что делает действительно приятную работу, имитирующую поведение нативной прокрутки. Затем я слушаю событие «запуск прокрутки» и отслеживает атрибуты верхнего / левого элемента прокрутки. Я знаю, что это не идеально, но это достойная альтернатива.