【问题标题】:InvalidStateError: DOM Exception 11 and Uncaught TypeError: Cannot call method 'submit' of nullInvalidStateError:DOM 异常 11 和未捕获的 TypeError:无法调用 null 的“提交”方法
【发布时间】:2013-07-05 19:17:11
【问题描述】:

我搜索了一个可能的答案并浏览了一些帖子,包括 How to fix "Uncaught TypeError: Cannot call method 'appendChild' of null"Receiving "InvalidStateError: DOM Exception 11" during websocket.send 但似乎都没有解决我的问题。 将数据从 html 表单保存到 mysql 数据库的保存按钮工作得非常好,直到页面开始出现两个错误

  1. 页面上的下拉菜单使用 ajax 从数据库中动态更新。它们仍然工作正常,并根据所选选项自动更新,但是当我单击任何下拉菜单时,错误控制台显示 "Uncaught error: InvalidStateError: DOM Exception 11 on createoptions.js line 37xmlhttp.send();

  2. 当我单击保存按钮时,没有任何响应或将数据保存到数据库,而是显示一个错误,上面写着 Uncaught TypeError: Cannnot call method "submit" of null。需要注意的是,调用 submit() 方法的对象已经存在。我使用了document.getElementById('studentdata').submit()",并且表格studentdata存在于同一页面上。

请强调这些错误的原因以及我可以做些什么来解决它们。以下是相关代码。

createoptions.js

function setdepartment(value){
  var xmlhttp;
  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function()
  {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
      document.getElementById("departmentselect1").innerHTML=xmlhttp.responseText;
    }
  }


  switch(value){
    case "Allied Health Sciences" : xmlhttp.open("GET","deptahs.php",true); break;
    case "Engineering and Inter-disciplinary sciences" : xmlhttp.open("GET","depteids.php",true); break;
    case "HIMSR" : xmlhttp.open("GET","depthimsr.php",true); break;
    case "Islamic Studies and Social Sciences" : xmlhttp.open("GET","deptisss.php",true); break;
    case "Management and Information Technology" : xmlhttp.open("GET","deptmanagement.php",true); break;
    case "Medicine (Unani)" : xmlhttp.open("GET","deptmedicine.php",true); break;
    case "Nursing" : xmlhttp.open("GET","deptnursing.php",true); break;
    case "Pharmacy" : xmlhttp.open("GET","deptpharmacy.php",true); break;
    case "Science" : xmlhttp.open("GET","deptscience.php",true); break;
  }  

  xmlhttp.send();

}

page.php 和被引用的行是<li><a class="button black" form="studentdata" onclick="document.getElementById('studentdata').submit()">Save</a></li>

<div class="navbutton">
  <aside>
    <ul>
      <li><a class="button black" href="logout.php">Logout</a></li>
      <li><a class="button black" onclick="addRow()">Add Row</a></li>
      <li><a href="#searchbox" class="button black" onclick="showsearch()">Search</a></li>
      <li><a href="#promotediv" class="button black" onclick="showpromote()">Promote</a></li>
      <li><a class="button black" form="studentdata" onclick="document.getElementById('studentdata').submit()">Save</a></li>
    </ul>
  </aside>
</div>

<form id="studentdata" action="savedata.php" method="POST">
  <div style=" padding-left:350px; ">   
    <div  class="dropdown dropdown-dark">
    <select name="facultyselect1" id="facultyselect1" style="width:300px;" class="dropdown-select " onfocus="setdepartment(this.value)" onchange="setdepartment(this.value)" required>
        <option value="">Select an option</option>

        <div id="facultyselect1">
                        <?php
                            @ $db = mysql_connect("localhost", "root", "");
                            mysql_select_db("university");
                            $strSQL = "SELECT facultyname FROM faculty";
                            $rs = mysql_query($strSQL);
                            $nr = mysql_num_rows($rs);
                            for ($i=0; $i<$nr; $i++) {
                            $r = mysql_fetch_array($rs);
                            echo "<OPTION VALUE=\"".$r["facultyname"]."\">".$r["facultyname"]."</OPTION>";
                            }
                        ?>
        </div>
      </SELECT>
    </div> 


    <div class="dropdown dropdown-dark">
      <select name="departmentselect1" id="departmentselect1" class="dropdown-select" onchange="setcourse(this.value)" onfocus="setcourse(this.value)" required>
        <option value="">Select an option</option>

        <div id="departmentselect1">
        </div>
      </select>
    </div> 

  </div>
</form>

【问题讨论】:

  • 可以显示 savedata.php 但我认为不需要。
  • setdepartment 函数中执行console.log( value );。它实际上是否匹配您的任何“案例”值?
  • 我在第二个下拉列表中得到了值,如果 setdepartment 函数工作正常的话。我更关心的是点击提交按钮时出现的第二个错误。
  • 我注意到两个具有相同 id 的元素。 id 应该始终是唯一的,因此请更改 id 为 departmentselect1 的元素之一。
  • 是的,但认真地使用相同的 id,我之前能够将数据保存到数据库中。 `Cannnot call method "submit" of null`的可能原因是什么。

标签: javascript html dom


【解决方案1】:

您的第一个错误"Uncaught error: InvalidStateError: DOM Exception 11 on createoptions.js line 37 是由操作 DOM 引起的。我认为这可能与您有两个 id 为 departmentselect1 的元素或具有相同 id 的 div 语法无效的事实有关,因为它不能是 select 元素的子元素。您可以在 Chrome 中单击此错误旁边的箭头,并将其跟踪到实际发生的位置。 Similar question.

Uncaught TypeError: Cannnot call method "submit" of null 表示document.getElementById('studentdata') 不匹配任何元素,因此返回nullnull 没有方法,因此会抛出这个错误。这很奇怪,但是因为您的表单具有双 id 并且语法无效,因此可能具有未定义的行为。尝试解决第一个问题,它可能会神奇地解决另一个问题。

编辑:

我仍然认为您应该在您的 setdepartment 函数中为不起作用的菜单调试 value 的值。如果值不匹配任何情况,您的函数会有什么行为?不起作用的菜单的响应数据是什么?

【讨论】:

  • 对不起,我犯了一个小错误,现在提交工作正常,幸运的是它与重复的 id 无关。是的,DOM 异常可能只是由于重复的 id。会尝试整理一下。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多