HtmlEditorExtender Ajax Control - постбэк (асинхронный или нет) Stealing Focus - страница не поддерживает позицию прокрутки - PullRequest
3 голосов
/ 09 марта 2012

В приведенном ниже коде есть ссылка для возврата сообщения (асинхронного или нет), за которым следует div с верхним отступом 5000 :) и новый элемент управления HtmlEditorExtender, найденный в Ajax Control Toolkit (4.1.51116).

Проблема:

Щелчок по ссылке вверху страницы приводит к тому, что HtmlEditorExtender захватывает фокус, прокручиваясь до самого низа.

Вопрос:

Кто-нибудь знает, является ли это известной ошибкой? Кто-нибудь может придумать обходной путь?

Я даже не представляю, как использовать этот элемент управления на странице с другими элементами управления, которые вызывают обратную передачу!

Код:

    <div>
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
                <asp:LinkButton runat="server">test asynch postback - PLEASE DONT SCROLL DOWN!! :)</asp:LinkButton>
            </ContentTemplate>
        </asp:UpdatePanel>
        <br />
        <div style="padding-top: 5000px">
             Nooooooooooooooooooooooooo!!!!
            <asp:TextBox ID="txtPageBody" TextMode="MultiLine" Width="200px" runat="server" />
            <act:HtmlEditorExtender ID="htmlPageBody" runat="server" TargetControlID="txtPageBody" >
                <Toolbar>
                    <act:Bold />
                </Toolbar>
            </act:HtmlEditorExtender>
        </div>
    </div>

HtmlEditorExtender должен быть добавлен как тег, но не имеет репутации:)

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

отменяет функцию, которая крадет фокус на вашей странице, с удаленной линией фокуса:

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 () {
//html encode
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);
}
}

//Encode html tags
this._textbox._element.value = this._encodeHtml();
};
}

отсюда:

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

0 голосов
/ 10 марта 2012

Не знаю правильного решения этой проблемы или причины, по которой это происходит, но вот грязный обходной путь.

1. Добавить этот скрипт

<script type="text/javascript" language="javascript">
    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();
    }
</script>

2. Удалить панель обновления

3. Добавить это скрытое поле

<asp:HiddenField ID="hdnLastFocus" runat="server" />

Надеюсь, это поможет ...:)

P.S. Фокус украден до обратной передачи, а затем возвращен после возвращения обратной передачи, поэтому, если элемент управления редактора далек от текущего фокуса, он выглядит некрасиво, потому что экран переходит с одного на другой и обратно. Но если ваша страница относительно мала по высоте, она может удовлетворить ваши потребности.

0 голосов
/ 09 марта 2012

Вы пытались добавить MaintainScrollPositionOnPostback в директиву Page?

...