Mam cztery kontrolki na stronie z panelem aktualizacji. Początkowo fokus myszy jest nastawiony na pierwszą kontrolę. Kiedy częściowo odsyłam stronę do serwera, fokus automatycznie przechodzi do pierwszej kontroli od ostatniej kontrolki skupionej z kontrolki, do której mam zakładkę. Czy istnieje sposób na utrzymanie ostatniego skupienia?Jak utrzymać pozycję fokusową w oknie UpdatePanel po częściowym przesła- niu strony?
5
A
Odpowiedz
10
Spójrz na Restoring Lost Focus in the Update Panel with Auto Post-Back Controls:
Podstawową ideą rozwiązania jest, aby zapisać identyfikator kontroli z wejściem ostrości przed panel aktualizacji jest aktualizowany i ustawić wejście skupić się z powrotem do tej kontroli po panel aktualizacji jest aktualizowany.
Mam następujący kod JavaScript, który przywraca utracony fokus w panelu aktualizacji.
var lastFocusedControlId = ""; function focusHandler(e) { document.activeElement = e.originalTarget; } function appInit() { if (typeof(window.addEventListener) !== "undefined") { window.addEventListener("focus", focusHandler, true); } Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(pageLoadingHandler); Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler); } function pageLoadingHandler(sender, args) { lastFocusedControlId = typeof(document.activeElement) === "undefined" ? "" : document.activeElement.id; } function focusControl(targetControl) { if (Sys.Browser.agent === Sys.Browser.InternetExplorer) { var focusTarget = targetControl; if (focusTarget && (typeof(focusTarget.contentEditable) !== "undefined")) { oldContentEditableSetting = focusTarget.contentEditable; focusTarget.contentEditable = false; } else { focusTarget = null; } targetControl.focus(); if (focusTarget) { focusTarget.contentEditable = oldContentEditableSetting; } } else { targetControl.focus(); } } function pageLoadedHandler(sender, args) { if (typeof(lastFocusedControlId) !== "undefined" && lastFocusedControlId != "") { var newFocused = $get(lastFocusedControlId); if (newFocused) { focusControl(newFocused); } } } Sys.Application.add_init(appInit);
3
Uważam to bardziej eleganckie:
(function(){
var focusElement;
function restoreFocus(){
if(focusElement){
if(focusElement.id){
$('#'+focusElement.id).focus();
} else {
$(focusElement).focus();
}
}
}
$(document).ready(function() {
$(document).on('focusin', function(objectData){
focusElement = objectData.currentTarget.activeElement;
});
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(restoreFocus);
});
})();