【问题标题】:Javascript code working in IE11 but not in ChromeJavascript 代码在 IE11 中工作但在 Chrome 中不工作
【发布时间】:2015-11-24 19:37:17
【问题描述】:

我们在这里遇到了 IE11/Chrome 的一个奇怪问题。我们有这个小代码:

divFrmPost = document.getElementById('divFormPost'); 
divFrmPost.innerHTML = '<form name="formPost" method="post" \ action="http://someurl/servlet/myapp"> \    
    <input type="hidden" id="cd_user" name="cd_user" value="John Doe"> \    
    <input type="hidden" id="cod_user" name="cod_user" value="5013"> \    
    <input type="hidden" id="login" name="login" value="jdoe"> \    
    <input type="hidden" id="pwd" name="pwd" value="123456"> \    
    <input type="hidden" id="profile" name="profile" value="12"> \   
    <input type="hidden" id="" name="" value="128"> \
</form>'; 
frmPost = document.getElementById('formPost');
frmPost.submit(); 

当我们在 IE11 中运行时,表单处理正常,但是当我们在 Chrome (v44) 中运行时,它什么也不做,并且在控制台中出现此错误:

Uncaught TypeError: Cannot read property 'submit' of null

我们知道问题一定是最后一个隐藏字段,没有 id/name,但为什么它在 IE11 中有效,而在 Chrome 中无效?

编辑:在原始代码中,innerHTML 结构是单行的,我对其进行了编辑以便更好地阅读,但我忘了放反斜杠。

EDIT2:请避免评论战...

【问题讨论】:

  • 我没有看到任何 id formPost 所以你不能指望document.getElementById('formPost') 会返回一些东西。它可能在 IE 中工作,因为 name="formPost" 和变量 formPost (错字)可能已经持有这种形式
  • document.formPost.submit();应该工作。
  • 也许 Chrome 对它接受的内容比较挑剔。也许是因为找不到元素,因为你没有在表单标签中指定ID。

标签: javascript google-chrome internet-explorer-11


【解决方案1】:

让它工作

首先我们必须编辑代码以使其工作: 正如其他人所说,您正在寻找 id 但在表单上只有名称集,Chrome 和其他真正的浏览器不喜欢它。

divFrmPost = document.getElementById('divFormPost');
divFrmPost.innerHTML = '<form id="formPost" method="post" action="http://someurl/servlet/myapp">'    
   + '<input type="hidden" id="cd_user" name="cd_user" value="John Doe">'    
   + '<input type="hidden" id="cod_user" name="cod_user" value="5013">'    
   + '<input type="hidden" id="login" name="login" value="jdoe">'    
   + '<input type="hidden" id="pwd" name="pwd" value="123456">'    
   + '<input type="hidden" id="profile" name="profile" value="12">'    
   + '<input type="hidden" id="" name="" value="128">'
+'</form>';
frmPost = document.getElementById('formPost');
frmPost.submit();
&lt;div id="divFormPost"&gt;&lt;/div&gt;

多行字符串

要在多行上连接一个字符串,你应该使用 +

为什么它可以在 IE 上运行?

答案在这里

getElementById 方法

返回对具有指定 ID 或 NAME 属性值的第一个对象的引用。

来自MSDN Microsoft getElementById method

如果你没有定义&lt;!DOCTYPE&gt; IE 启用 Quirks 模式,可能因为 this 而在 IE 11 上对你有用

Quirks 模式通过支持 Internet Explorer 早期版本中的行为来强调兼容性而不是标准合规性。

【讨论】:

  • 感谢 SharpEdge!为什么它可以在 IE11 中工作?当您只提供 id 时,IE11 是否会将 name 解释为 id,而 Chrome 不提供?
  • 在 IE7 及之前的版本中,getElementById 也返回 name=id 的对象,我们可以在这里看到:quirksmode.org/dom/core/#t10
  • 微软以不尊重自己的规则而闻名,所以不要感到惊讶,关于这个论点有很多关于 SO 的问题。
  • 我不确定原始代码是否适用于 IE,我使用的是 linux,所以我无法尝试。按照 MSDN API 参考它应该不起作用。
【解决方案2】:

改变

name="formPost"

id="formPost"

或使用

getElementsByName();

您的代码将是

 divFrmPost = document.getElementById('divFormPost'); 
divFrmPost.innerHTML = '<form id="formPost" method="post" action="http://someurl/servlet/myapp">    
    <input type="hidden" id="cd_user" name="cd_user" value="John Doe">    
    <input type="hidden" id="cod_user" name="cod_user" value="5013">    
    <input type="hidden" id="login" name="login" value="jdoe">    
    <input type="hidden" id="pwd" name="pwd" value="123456">    
    <input type="hidden" id="profile" name="profile" value="12">    
    <input type="hidden" id="" name="" value="128">
</form>'; 
frmPost = document.getElementById('formPost');
frmPost.submit(); 

【讨论】:

  • 因为它的 IE。它以名称为 id。但是普通浏览器使用id和name
  • 以某种方式。这里的情况是你应该使用 id
【解决方案3】:

两个问题:

  1. 您不能通过传统的字符串表示法将字符串拆分为多行。我将其更改为Template String。您可以在行尾添加+ 以实现 IE 兼容性。

  2. 您的表单没有 ID。所以我添加了它。 &lt;form id="formPost" name="formPost" ...

这是工作代码:

        divFrmPost = document.getElementById('divFormPost'); 
        divFrmPost.innerHTML = `<form id="formPost" name="formPost" method="post" action="http://someurl/servlet/myapp">;    
            <input type="hidden" id="cd_user" name="cd_user" value="John Doe">    
            <input type="hidden" id="cod_user" name="cod_user" value="5013">    
            <input type="hidden" id="login" name="login" value="jdoe">    
            <input type="hidden" id="pwd" name="pwd" value="123456">    
            <input type="hidden" id="profile" name="profile" value="12">    
            <input type="hidden" id="" name="" value="128">
        </form>`; 
        frmPost = document.getElementById('formPost');
        frmPost.submit(); 

【讨论】:

  • 没有讽刺意味。我已经非常明确地指出,模板字符串不支持 IE,并提供了替代方案。
  • 请在您的控制台中输入:var wisdom = 'Now I see' + ' where I have got wrong';
  • @CharlieH 那么你需要添加引号来关闭/打开字符串。但顺便说一句,OP 可能已经在一行中做到了这一点(帖子中的可见性更好),这就是他没有转义字符串的原因。
  • 你的逻辑是错误的哥们!他说,即使表单中没有 id,该片段也可以在 IE 中使用。所以很明显,这个片段与他的真正问题无关。每个人都回答了,包括我,同时指着字符串和 id。即使没有答案,你也开始抱怨。试试这个alert("some goes without saying... like common sense")
  • 谢谢查理 H!我们知道问题出在 id/name 上,但我们真的很感兴趣为什么它在 IE11 上运行而不是在 Chrome 上运行。事实证明这是 IE7 和以前处理 getElementByID 函数的方式(有问题的应用程序在 iE7 兼容模式下运行)。请不要回答其他人 cmets:这很可悲,但今天的 Stack Overflow 被伪助手污染了,他们需要挑选每一件小事,而不是专注于真正的问题......我敢打赌我在这个问题上投了反对票来自他... ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2020-10-05
  • 2019-11-08
相关资源
最近更新 更多