2

I have an ASP.NET page that contains an iframe. Inside that iframe, there is a form with a DefaultFocus and a DefaultButton set, as shown below.

<form id="Form1" method="post" runat="server" defaultfocus="txtSearchPhrase" defaultbutton="btnSearch">

When viewing this page in IE11, all of the content inside of the iframe appears to be shifted off the left side of the screen by about 100px or so. This does not happen in any other browser, including IE10.

If I remove the DefaultButton and DefaultFocus from the form, the problem disappears. I can then use Javascript to manually hookup the default button and focus, but since I have many different pages that are potentially rendered inside the iframe, it's not ideal to have to change each and every one of those pages.

Does anyone know what's causing this or if there's a better way to address it?

4

1 回答 1

3

我对此进行了调查,发现了一些有趣的事情。

首先,当您在 ASP .NET WebForms 中包含DefaultFocusDefaultButton在表单上时,ASP .NET 将自动发出两件事:

  1. 方法的定义WebForm_AutoFocus
  2. 对此方法的调用,类似于:WebForm_AutoFocus('defaultFocusElementID');它对设置DefaultFocusDefaultButton设置都执行此操作,但我不确定为什么它需要对DefaultButton设置执行此操作。

WebForm_AutoFocus方法尝试scrollIntoView在元素上调用该方法,但前提是浏览器被检测为“非 MS DOM”浏览器。奇怪的是,IE11被认为是 MS DOM 浏览器,至少就这种方法而言。因此,该scrollIntoView方法设计为在IE 浏览器上运行。

我想有人可能会争辩说该错误与scrollIntoViewIE11 中方法的实现有关,但它也可以被视为 MS JS 库中的错误,该库检测浏览器是否为 MS DOM 浏览器。我不确定——不管怎样,我都怪微软。:)

从哲学的角度来看,我建议不要使用DefaultFocusand DefaultButton,因为这些是 Microsoft 特定的东西,当你可以让你的代码远离 Microsoft 特定的东西时,你通常应该这样做。特别是当使用“微软方式”完全被打破时。相反,尝试这样的事情(如果您使用的是 jQuery):

<form data-defaultfocus="search">
  <asp:TextBox ID="search" />
</form>

<script type="text/javascript">

  // jQuery on document ready
  $(function() {
    var form = $('form'),
      defaultButtonID,
      defaultFocusID;

    if (form.data('defaultfocus')) {
      defaultFocusID = form.data('defaultfocus');

      $('#' + defaultFocusID).focus();
    }

    if (form.data('defaultbutton')) {
      defaultButtonID = form.data('defaultbutton');

      form.on('keypress', function(event) {
        if (event.keyCode === 13) {
          __doPostBack(defaultButtonID, '');
        }
      });
    }
  });

</script>

这不是经过测试的代码,但你明白了。然后你可以在你的表单元素上使用data-defaultbuttondata-defaultfocus而不是微软的方式,它实际上会工作,如果没有,你可以修复它,因为你控制代码!

我希望这有帮助。

更新

我发现这篇 Microsoft 知识库文章讨论了一个 .NET 4 补丁。此页面上的问题 2 似乎解决了您所描述的问题。

当您使用 Internet Explorer 11 访问基于 ASP.NET 的网页时,该网页会错误地呈现内容。

注意出现此问题的原因是 Internet Explorer 11 未被 ASP.NET 识别为 Internet Explorer。

我还没有尝试过,但这似乎可以解决它。

于 2013-11-15T16:57:18.603 回答