Tengo un ASP.NET FormView dentro de un panel de actualización. Estoy guardando automáticamente el formulario configurando AutoPostBack = true para cada uno de los elementos dentro de FormView.Cómo evitar el desplazamiento de UpdatePanel en AutoPostBack?
Esto significa que el usuario puede hacer clic en algunos elementos en rápida sucesión y disparar algunas devoluciones de datos asíncronas casi al mismo tiempo.
El problema que tengo es que el usuario puede seguir desplazándose por el formulario mientras que las devoluciones de datos asincrónicas aún no están completas. El navegador siempre se desplaza de vuelta a la posición en la que estaba en la primera devolución de datos.
Page.MaintainScrollPositionOnPostback está establecido en False.
He intentado todo tipo de cosas en el Ajax y jQuery con:
- pageLoad
- add_initializeRequest
- add_endRequest
- document.ready
- etc ..
pero siempre parece que solo puedo acceder al desplazamiento Y a s estaba en la primera devolución de datos.
¿Hay alguna manera de recuperar el desplazamiento actual Y cuando se completa la devolución de datos, por lo que puedo detener el desplazamiento? ¿O quizás es posible desactivar el comportamiento de desplazamiento?
Gracias!
actualización
Gracias a @chprpipr, yo era capaz de conseguir que esto funcione. Aquí está mi solución abreviada:
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;
}
}
página principal:
...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);
}
También intenté llamar a la EndRequestHandler (tuvo que retirar el cheque args.error) para ver si se reduce el parpadeo cuando se desplaza, pero no es así Vale la pena señalar que la solución perfecta sería evitar que el navegador intente desplazarse: en este momento hay una fluctuación momentánea que no sería aceptable en aplicaciones con una gran base de usuarios.
(El código de la parte superior de desplazamiento no es mío - encontrado en la web.)
(Aquí hay una página útil de MSDN para el ciclo de vida del lado del cliente: http://msdn.microsoft.com/en-us/library/bb386417.aspx)
la actualización 7 de marzo:
que acaba de encontrar una manera extremadamente simple de hacer esto:
<script type="text/javascript">
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(beginRequest);
function beginRequest()
{
prm._scrollPosition = null;
}
</script>
Sé que es una publicación anterior pero ¡gracias! – peter
La 'Actualización 7 de marzo:' anterior funcionó para mí – Mark
Esto funcionó para mí inicialmente, y luego se detuvo ... No estoy seguro de qué pasó. Se ejecuta desde el principio y sigo obteniendo que '' Sys 'no está definido'. ¿Dónde debería estar el ciclo de vida de la página? –