У меня есть ASP.NET FormView внутри панели обновления. Я автоматически сохраняю форму, устанавливая AutoPostBack = true для каждого из элементов в FormView.
Это означает, что пользователь может быстро щелкнуть несколько элементов и сразу же отключить несколько асинхронных обратных передач.
Проблема заключается в том, что пользователь может продолжать прокручивать форму, пока асинхронные обратные вызовы еще не завершены. Браузер всегда прокручивается назад до положения, в котором он находился при первой обратной передаче.
Страница .MaintainScrollPositionOnPostback установлена в значение False.
Я пробовал всевозможные вещи в ajax и jquery с помощью:
- Pageload
- add_initializeRequest
- add_endRequest
- document.ready
- и т.д.
но я всегда только могу получить доступ к прокрутке Y, как это было при первой обратной передаче.
Есть ли способ получить текущую прокрутку Y после завершения обратной передачи, чтобы я мог остановить прокрутку? Или, возможно, можно отключить поведение прокрутки?
Спасибо!
Обновление
Благодаря @chprpipr, я смог заставить это работать. Здесь мое сокращенное решение:
var FormScrollerProto = function () {
var Me = this;
this.lastScrollPos = 0;
var myLogger;
this.Setup = function (logger) {
myLogger = logger;
// Bind a function to the window
$(window).bind("scroll", function () {
// Record the scroll position
Me.lastScrollPos = Me.GetScrollTop();
myLogger.Log("last: " + Me.lastScrollPos);
});
}
this.ScrollForm = function () {
// Apply the last scroll position
$(window).scrollTop(Me.lastScrollPos);
}
// Call this in pageRequestManager.EndRequest
this.EndRequestHandler = function (args) {
myLogger.Log(args.get_error());
if (args.get_error() == undefined) {
Me.ScrollForm();
}
}
this.GetScrollTop = function () {
return Me.FilterResults(
window.pageYOffset ? window.pageYOffset : 0,
document.documentElement ? document.documentElement.scrollTop : 0,
document.body ? document.body.scrollTop : 0
);
}
this.FilterResults = function (n_win, n_docel, n_body) {
var n_result = n_win ? n_win : 0;
if (n_docel && (!n_result || (n_result > n_docel)))
n_result = n_docel;
return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
}
Главная страница:
...snip...
var logger;
var FormScroller;
// Hook up Application event handlers.
var app = Sys.Application;
// app.add_load(ApplicationLoad); - use pageLoad instead
app.add_init(ApplicationInit);
// app.add_disposing(ApplicationDisposing);
// app.add_unload(ApplicationUnload);
// Application event handlers for component developers.
function ApplicationInit(sender) {
var prm = Sys.WebForms.PageRequestManager.getInstance();
if (!prm.get_isInAsyncPostBack()) {
prm.add_initializeRequest(InitializeRequest);
prm.add_beginRequest(BeginRequest);
prm.add_pageLoading(PageLoading);
prm.add_pageLoaded(PageLoaded);
prm.add_endRequest(EndRequest);
}
// Set up components
logger = new LoggerProto();
logger.Init(true);
logger.Log("APP:: Application init.");
FormScroller = new FormScrollerProto();
}
function InitializeRequest(sender, args) {
logger.Log("PRM:: Initializing async request.");
FormScroller.Setup(logger);
}
...snip...
function EndRequest(sender, args) {
logger.Log("PRM:: End of async request.");
maintainScroll(sender, args);
// Display any errors
processErrors(args);
}
...snip...
function maintainScroll(sender, args) {
logger.Log("maintain: " + winScrollTop);
FormScroller.EndRequestHandler(args);
}
Я также пробовал вызывать EndRequestHandler (должен был удалить проверку args.error), чтобы увидеть, уменьшилось ли оно при прокрутке, но это не так. Стоит отметить, что идеальным решением было бы остановить браузер, который будет прокручиваться вообще - прямо сейчас есть кратковременный дрожание, которое неприемлемо для приложений с большой базой пользователей.
(Верхний код прокрутки не мой - нашел его в Интернете.)
(Здесь полезная страница MSDN для жизненного цикла клиентов: http://msdn.microsoft.com/en-us/library/bb386417.aspx)
Обновление 7 марта:
Я просто нашел очень простой способ сделать это:
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(beginRequest);
function beginRequest()
{
prm._scrollPosition = null;
}
</script>