【问题标题】:How to fix SCRIPT5007: Unable to get property 'parentNode' of undefined or null reference in Internet Explorer 11?如何修复 SCRIPT5007:无法在 Internet Explorer 11 中获取未定义或空引用的属性“parentNode”?
【发布时间】:2020-06-02 16:38:13
【问题描述】:

我的代码在其他浏览器上运行良好,但在 Internet Explorer 11 上我得到 SCRIPT5007: Unable to get property 'parentNode' of undefined or null reference。有谁知道如何修复该错误?这是我的代码:

var selected

function dragOver(e) {
  if (isBefore(selected, e.target)) e.target.parentNode.insertBefore(selected, e.target)
  else e.target.parentNode.insertBefore(selected, e.target.nextSibling)
}

function dragEnd() {
  selected = null
}

function dragStart(e) {
  e.dataTransfer.effectAllowed = "move"
  e.dataTransfer.setData("text/plain", null)
  selected = e.target
}

function isBefore(el1, el2) {
  var cur;
  if (el2.parentNode === el1.parentNode) {
    for (cur = el1.previousSibling; cur; cur = cur.previousSibling) {
      if (cur === el2) return true
    }
  } else return false;
}
<div class="sequence">
  <div draggable="true" ondragend="dragEnd()" ondragover="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="3">Yellow</div>
  <div draggable="true" ondragend="dragEnd()" ondragover="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="5">Red</div>
  <div draggable="true" ondragend="dragEnd()" ondragover="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="2">Green</div>
  <div draggable="true" ondragend="dragEnd()" ondragover="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="1">Blue</div>
  <div draggable="true" ondragend="dragEnd()" ondragover="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="4">Orange</div>
</div>

【问题讨论】:

  • 嘿,欢迎来到 StackOverlow ... 为什么不添加断点,看看发生了什么?您的问题没有给我们太多继续...parentNode of undefined 意味着您假设的元素存在并且具有parentNode 属性,不...所以看看你实际上有什么...
  • 你是如何绑定事件的?错误发生在什么函数上?
  • selected 开始时未定义。你用selectede.target 调用isBefore,所以el1isBefore 中是未定义的。
  • 错误发生在哪个函数中?在isBeforedragOver?如果是前者,请在调用isBefore之前检查selected的值。
  • 在 isBefore 函数中。

标签: javascript jquery internet-explorer-11


【解决方案1】:

我测试了你的代码,错误首先发生在e.dataTransfer.setData("text/plain", null),参数无效。这一行有两个错误:

  1. IE 仅接受 textURL 作为有效数据类型。解释可以参考this article

    尽管 Internet Explorer 一开始只引入“文本”和“URL”作为有效数据类型,但 HTML5 对此进行了扩展以允许指定任何 MIME 类型。 HTML5 将支持值“text”和“URL”以实现向后兼容性,但它们被映射到“text/plain”和“text/uri-list”。

  2. 我们应该使用具体的值作为数据,而不是 IE 中的null。我们可以使用事件目标的 id 作为数据。

所以这行应该改成:e.dataTransfer.setData("text", e.target.id)

在此之后,我们需要将ondragover 事件更改为ondragenter,因为我发现ondragover 不会在IE 中被触发。所以最终的代码应该像下面这样在 IE 11 中运行良好:

var selected

function dragOver(e) {
  if (isBefore(selected, e.target)) e.target.parentNode.insertBefore(selected, e.target)
  else e.target.parentNode.insertBefore(selected, e.target.nextSibling)
}

function dragEnd() {
  selected = null
}

function dragStart(e) {
  e.dataTransfer.effectAllowed = "move"
  e.dataTransfer.setData("text", e.target.id)
  selected = e.target
}

function isBefore(el1, el2) {
  var cur;
  if (el2.parentNode === el1.parentNode) {
    for (cur = el1.previousSibling; cur; cur = cur.previousSibling) {
      if (cur === el2) return true
    }
  } else return false;
}
<div class="sequence">
  <div draggable="true" ondragend="dragEnd()" ondragenter="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="3">Yellow</div>
  <div draggable="true" ondragend="dragEnd()" ondragenter="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="5">Red</div>
  <div draggable="true" ondragend="dragEnd()" ondragenter="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="2">Green</div>
  <div draggable="true" ondragend="dragEnd()" ondragenter="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="1">Blue</div>
  <div draggable="true" ondragend="dragEnd()" ondragenter="dragOver(event)" ondragstart="dragStart(event)" class="choice 2" id="4">Orange</div>
</div>

Online demo

【讨论】:

    【解决方案2】:

    在您的事件处理程序中尝试这样的事情:

    function dragOver( e ) {
      if (!e) e = window.event;
      if ( isBefore( selected, e.target ) ) e.target.parentNode.insertBefore( selected, e.target )
      else e.target.parentNode.insertBefore( selected, e.target.nextSibling )
    }
    

    参考: https://docstore.mik.ua/orelly/webprog/jscript/ch19_03.htm (19.3.2. IE 事件对象作为全局变量)

    【讨论】:

    • 感谢您的回答,但不幸的是它并没有解决我的问题。我也得到 SCRIPT87: Invalid argument. for e.dataTransfer.setData("text/plain", null)
    • 您还必须在 dragStart 中添加它,例如: function dragStart( e ) { if (!e) e = window.event; ...
    • 是的,当我尝试但没有成功时,我在 dragStart 中添加了它。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多