IE 9和IE 10不能不时地将文本输入到输入文本框中

时间:2013-10-03 02:55:59

标签: javascript html internet-explorer internet-explorer-9 internet-explorer-10

内部有一个iframe的网页。有时,iframe内的输入文本框控件被锁定/冻结。用户无法在其中输入文本。但文本框可以聚焦而不是褪色。没有代码可以禁用输入控件,但这并不总是发生。到目前为止,这只发生在IE 9和IE 10中.Firefox和Chrome都可以。

页面工作原理的简要说明如下:

  • 父页面上有一个按钮。通过点击它将构建一个 从头开始iframe并显示它。这是通过Javascript完成的。

  • 再次,iframe上有一个按钮可以关闭它。通过点击它 将从父页面的DOM中删除iframe。

如果您需要更多信息,请与我们联系。提前谢谢。

11 个答案:

答案 0 :(得分:35)

这个错误很烦人,更糟糕的是我们在google上找到的信息非常少。

微软只有一个关于IE9的链接,但IE10 / IE11中仍存在问题,更容易重现。

我刚刚创建了一个描述这个问题的小提琴

http://jsfiddle.net/WilliamLeung/T3JP9/1/

为什么M $多年来难以解决这个问题?

应该有三种解决方法

  1. 每次使用iframe
  2. 修改DOM时重置焦点
  3. 或安排"什么都不做"耗时的任务,可能会让IE神奇地回应鼠标事件,我无法告诉你为什么,也许M $可以

    设置耗时任务的示例代码

    setInterval(function () {
        var loopCount = 10000;
        var x = 0;
        for (var i = 0; i < loopCount; i++) {
            x = (x + Math.random() * 1000) >>> 0;
        }
        return x;
    }, 1000);
    
  4. 或重置DOM内容,然后将其从文档中删除

    someDivWithIframe.innerHTML = "";
    $(someDivWithIframe).remove();
    

    我不确定它是否对所有情况都有帮助,你应该尝试一下

答案 1 :(得分:5)

jQuery 的解决方案适用于IE11 ,而非其他解决方案。

$(theIframeElement).empty().remove();

在IE9 / 10上工作的另一个解决方案是在删除之前将iframe src设置为空

iframe.src=""

但这导致异常&#34;访问被拒绝&#34;在IE11上如果你使用的是较旧的jQuery版本&lt; 1.11.1

一些链接: 有关信息,jQuery还为其在iframe中显示内容的Dialog.js插件修复了此问题:http://bugs.jqueryui.com/ticket/9122

jQuery错误修复IE11&#34;访问被拒绝&#34;错误:http://bugs.jquery.com/ticket/14535

答案 2 :(得分:4)

我设法通过将焦点设置回主页来修复此错误。到目前为止我所做的是: 在主页面中放置一个不可见的HTML输入文本框。当iframe关闭时,我将焦点设置回该文本框。

有关此IE错误的详细信息,请参阅以下链接。

link1

link2

答案 3 :(得分:3)

在IE 11中,没有一个解决方案适合我。

通过在iframe中添加此代码来解决此问题:

$("input").first().focus().blur();

显然,如果您无法控制您的iframe,这将无法运作。

答案 4 :(得分:3)

这对我来说对IE11有用,

  • 问题原因(除了IE是愚蠢的):
    • 从iframe(css显示属性)
    • 中的显示中删除聚焦的输入元素
  • 问题:
    • 无法点击文字输入元素,但仍然可以选中它
  • 解决方法:
    • 在将输入字段从显示中取出之前,我们需要聚焦()一个已知的可见元素,所以在我们从输入字段中取出显示之前,我们有一行:document.body.focus();

答案 5 :(得分:2)

只是为了添加其他人所说的,当iframe中的某些输入具有焦点然后关闭导致所有其他输入失去焦点时,实际上是一个问题。确实有一个脚本将焦点设置为元素可以解决问题。但对我来说这是行不通的,因为我的一些输入被禁用了。所以对我有用的解决方案是

$("input[type=text]:not([disabled])").first().focus();

完整片段,因为我使用的是bootstrap模态,而模态有一个iframe。在打开模型之前和关闭之后,我将焦点设置为可编辑字段:

var modalInstance = $uibModal.open({
    // modal properties
  });
modalInstance.closed.then(function () {
  $("input[type=text]:not([disabled])").first().focus();
});
modalInstance.opened.then(function () {
  $("input[type=text]:not([disabled])").first().focus();

});

答案 6 :(得分:1)

我最初编写下面的插件来解决IE 8中的内存泄漏,但是它也解决了这个问题。

https://github.com/steelheaddigital/jquery.purgeFrame

答案 7 :(得分:1)

使用Javascript的简单解决方案对我有用,我在其他浏览器中看不到任何副作用:

<script>
  var pswElement = document.getElementById("password");
  pswElement.addEventListener("focus", myFocusFunction, true);

  function myFocusFunction() {    
    document.getElementById("password").select();
  }
</script>

无论如何都很难过MS也无法在更高版本中解决这样的问题。

答案 8 :(得分:0)

我也遇到了这个问题。正如William Leung指出的那样,IE有一个从DOM中移除Iframe对象的错误。

尝试以下方法:

$(someDivWithIframe).empty().remove();

答案 9 :(得分:0)

我对IE11,angularjs和使用IFrame有同样的问题。 我的模板使用ng-switch来更改视图模式。 其中一个视图模式包含IFrame。 我转离包含IFrame的视图模式的那一刻:

var iFrame = <HTMLIFrameElement>document.getElementById("myIFrame");
iFrame.focus();
this.mode = ViewModes.ModeWithoutIFrame;

解决了我的问题。

答案 10 :(得分:0)

这里有解决方案对我有用,在此页面上尝试过所有其他人!需要jQuery,但我确信如果有必要,可以在原生JavaScript中重写。

与许多其他解决方案一样,这应该添加到iframe的,假设您有权修改它:

$("body").focusout( function () { window.focus(); });