3 votes

HtmlEditorExtender Ajax Control - Postback (asynchrone ou non) Voler le focus - la page ne maintient pas la position de défilement

Le code ci-dessous contient un lien pour provoquer un retour en arrière (asynchrone ou non) suivi d'une div avec un padding supérieur de 5000 :) - et le nouveau contrôle HtmlEditorExtender trouvé dans le Ajax Control Toolkit (4.1.51116).

Le Problème :

En cliquant sur le lien en haut de la page, le HtmlEditorExtender vole le focus, faisant défiler tout en bas de la page.

La Question :

Est-ce que quelqu'un sait s'il s'agit d'un bug connu ? Est-ce que quelqu'un pourrait proposer une solution de contournement ?

Je ne peux même pas imaginer comment utiliser ce contrôle sur une page avec d'autres contrôles qui provoquent des retours en arrière !

Le Code :

                test asynch postback - PLEASE DONT SCROLL DOWN!! :)

             Nooooooooooooooooooooooooo!!!!

HtmlEditorExtender devrait être ajouté en tant que balise, mais je n'ai pas la réputation :)

2voto

Evert Points 1962

Remplacez la fonction qui vole le focus sur votre page, avec la ligne de focus supprimée :

if (Sys.Extended && Sys.Extended.UI && Sys.Extended.UI.HtmlEditorExtenderBehavior && Sys.Extended.UI.HtmlEditorExtenderBehavior.prototype && Sys.Extended.UI.HtmlEditorExtenderBehavior.prototype._editableDiv_submit) {
Sys.Extended.UI.HtmlEditorExtenderBehavior.prototype._editableDiv_submit = function () {
//encode html
var char = 3;
var sel = null;

if (Sys.Browser.agent != Sys.Browser.Firefox) {
if (document.selection) {
sel = document.selection.createRange();
sel.moveStart('character', char);
sel.select();
}
else {
sel = window.getSelection();
sel.collapse(this._editableDiv.firstChild, char);
}
}

//Encoder les balises html
this._textbox._element.value = this._encodeHtml();
};
}

à partir d'ici:

http://ajaxcontroltoolkit.codeplex.com/workitem/27026

0voto

Widor Points 7307

Avez-vous essayé d'ajouter MaintainScrollPositionOnPostback à la directive Page ?

0voto

hofnarwillie Points 1022

Ne connaissez pas une correction appropriée pour cela ou la raison pour laquelle cela se produit en premier lieu, mais voici une solution de contournement.

1. Ajoutez ce script

    function pageLoad() {
        // if we did not redefined the '__doPostBack' method yet
        if (typeof window.__doPostBack_original == "undefined") {
            // save the original method
            window.__doPostBack_original = window.__doPostBack;
            // redefine it
            window.__doPostBack = function (eventTarget, eventArgument) {
                document.getElementById('<%=hdnLastFocus.ClientID %>').value = eventTarget;
                var retval = window.__doPostBack_original(eventTarget, eventArgument);
                return retval;
            };
        }

        window.onload = document.getElementById('<%=hdnLastFocus.ClientID %>').focus();
    }

2. Supprimez l'UpdatePanel

3. Ajoutez ce champ caché

Je espère que cela vous aidera... :)

P.S. Le focus est volé avant le postback et ensuite repris après que le postback revienne, donc si le contrôle de l'éditeur est loin du focus actuel, cela semble laid, car l'écran saute de l'un à l'autre et revient. Mais si votre page est relativement petite en hauteur, cela peut convenir à vos besoins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X