在IE中由jQuery设置的iframe`name`属性的奇怪行为

Alc*_*nja 10 forms iframe jquery internet-explorer

我正在通过将表单中的文件发布到iframe来进行ajax样式文件上传,并注意到IE中的一些奇怪的行为(似乎发生在6和8中).基本上在IE中,表单不target适合iframe,因此响应出现在新窗口中(而不是iframe中).您可以使用以下最小的HTML/JS集重现该问题:

<html>
<head>
  <script src="http://code.jquery.com/jquery-1.3.2.js"></script>
  <script>
    $(document).ready(function(){
      var frameName = "myFrame";
      var $iframe = $("<iframe src=\"about:blank\" />")
              .attr("name", frameName)
              .appendTo("body");
      var $uploadForm = $("<form action=\"http://www.google.com/search\" />")
              .attr("target", frameName)
              .append("<input type=\"text\" name=\"q\" />")
              .append("<input type=\"submit\" />")
              .appendTo("body");
    });
  </script>
</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

现在(在你发布答案之前),我做了一些调查(使用IE8的开发人员工具),看起来.attr("name", frameName)实际上是在添加属性submitName="myFrame"而不是简单name="myFrame".基于此,我通过将iframe创建代码更改为稍微麻烦来解决了这个问题:

var $iframe = $("<iframe src=\"about:blank\" name=\"" + frameName + "\" />")
        .appendTo("body");
Run Code Online (Sandbox Code Playgroud)

进行此更改会使表单根据需要发布到iframe中.

我的问题是:

  • 为什么不.attr("name", ...)按预期工作?
  • 这是jQuery中的错误,IE中的错误(当然不是!?!),还是我错过了一些明显的东西?
  • submitName属性来自何处及其目的是什么?

bob*_*nce 16

IE中的一个错误(肯定不是!?!)

我知道,很难相信,但我们确实存在.

历史上(*),设置name属性在IE中有很多问题.它往往只是部分持有.例如,在表单字段名称上,它不会form.elements[name]像它应该那样影响查找.这似乎是设置name属性不可靠的另一种情况.

虽然jQuery试图解决这样的浏览器错误,但它并没有捕获所有内容,并且没有任何已知的方法可以完全解决它.

(*:在IE中最多7个.如果您使用标准模式doctype在本机documentMode中运行IE8,并且必要时使用X-UA-Compatible标头/元,则这两个错误都不会出现.)

submitName在开发者工具出现的是一个IE漏洞的幕后的一些有趣的,因为它不会在公开可见的DOM出现在所有.它做同样的事情,如果你看一个<input>元素或<form>它的name属性创建后已被写入了.

所以似乎正在发生的事情是,IE-up-to-7重定向所有使用被称为name内部调用的其他不可见属性的属性,submitName表单字段会更改字段将作为表单提交的一部分生成的数据,但是它不会改变name用于HTMLCollection索引,无线电分组,getElementsByName 的真实属性,或者在[i]帧的情况下,用于定位.