2011-03-01 14 views
10

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> 
+0

Sé que es una publicación anterior pero ¡gracias! – peter

+0

La 'Actualización 7 de marzo:' anterior funcionó para mí – Mark

+0

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? –

Respuesta

3

Puede enlazar una función que registra la posición de desplazamiento actual y luego la vuelve a aplicar después de cada EndRequest.Puede ser algo como esto:

// Wrap everything up for tidiness' sake 
var FormHandlerProto = function() { 
    var Me = this; 

    this.lastScrollPos = 0; 

    this.SetupForm = function() { 
     // Bind a function to the form's scroll container 
     $("#ContainerId").bind("scroll", function() { 
      // Record the scroll position 
      Me.lastScrollPos = $(this).scrollTop(); 
     }); 
    } 

    this.ScrollForm = function() { 
     // Apply the last scroll position 
     $("#ContainerId").scrollTop(Me.lastScrollPos); 
    } 

    this.EndRequestHandler = function(sender, args) { 
     if (args.get_error() != undefined) 
      Me.ScrollForm(); 
     } 
    } 
} 

var FormHandler = new FormHandlerProto(); 
FormHandler.Setup(); // This assumes your scroll container doesn't get updated on postback. If it does, you'll want to call it in the EndRequestHandler. 

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(FormHandler.EndRequestHandler); 
+0

¡Muchísimas gracias por el código! Realmente me pusiste en el camino correcto. Tuve que hacer algunas modificaciones para que funcione, pero lo hice. Editaré mi pregunta para incluir la solución final. ¡Gracias de nuevo! –

Cuestiones relacionadas