【问题标题】:HtmlEditorExtender Ajax Control - Postback (asynchronous or not) Stealing Focus - the page does not maintain Scroll PositionHtmlEditorExtender Ajax 控件 - 回发(异步或非异步)窃取焦点 - 页面不保持滚动位置
【发布时间】:2012-03-27 03:46:07
【问题描述】:

下面的代码有一个链接可以导致回发(异步或非异步),然后是顶部填充为 5000 的 div :) - 以及在 Ajax 控件工具包 (4.1.51116) 中找到的新 HtmlEditorExtender 控件。

问题:

单击页面顶部的链接会导致 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 应该作为标签添加,但没有声誉:)

【问题讨论】:

  • 这只是一个猜测,但问题不在于您失去焦点,而是正在发生完整的回发,我正在处理类似的问题。

标签: asp.net asp.net-ajax postback ajaxcontroltoolkit


【解决方案1】:

您是否尝试将 MaintainScrollPositionOnPostback 添加到 Page 指令中?

【讨论】:

  • 是的,我试过了,但是 MaintainScrollPositionOnPostback 没有效果。
【解决方案2】:

不知道解决此问题的正确方法或首先发生此问题的原因,但这是一个肮脏的解决方法。

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" />

希望这会有所帮助... :)

附:焦点在回发之前被偷走,回发回来后又取回,所以如果编辑器控件离当前焦点很远,它看起来很难看,因为屏幕从一个跳到另一个又回来了。但如果您的页面高度相对较小,它可能会满足您的需求。

【讨论】:

  • 感谢 hofnarwillie,您的解决方案有点用。这确实会导致页面直接跳到顶部,而不是看起来的最后一个位置,但我想我可以保存滚动位置并再次恢复它。我暂时不回答这个问题,因为我想知道是否还有其他人有更好的解决方案。
【解决方案3】:

覆盖在您的页面上窃取焦点的函数,并移除焦点线:

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

【讨论】:

  • 是的,这成功了!有趣的是,我在谷歌搜索时看到了该页面,但认为它不适用于我的情况,但确实如此。所以我所做的只是将上面的脚本放在页面底部的脚本标签中,回发现在可以工作了!耶