【问题标题】:Object doesn't support property or method 'remove'对象不支持属性或方法“删除”
【发布时间】:2013-09-26 00:09:24
【问题描述】:

我知道 get document.getElementById 和 IE 存在一些问题,但不知道为什么 IE 对 .remove 有问题,而所有其他浏览器都没有。这里的任何帮助将不胜感激。我收到错误

SCRIPT438: Object doesn't support property or method 'remove'

来自错误控制台。 Javascript 适用于所有其他浏览器。
代码如下:

<script type="text/javascript"><!--
function removeModule() {

    <?php $tab = 1; ?>
    var module_row = <?php echo $module_row; ?>;

    if(!confirm('Are you sure?'))
    {
        return false;
    }

        var x = 1;
        while (x < module_row)
        {
            if (document.getElementById('tab-' + x).checked)
            {           
                document.getElementById('tab-' + x).remove();
                document.getElementById('module-' + x).remove();
                document.getElementById('tab-module-' + x).remove();
            }
            x++;
            <?php $tab++; ?>
        }
        $('#form').submit();

}
//--></script>

这是来自一个 opencart 模块,它是 tpl 文件。我在这里也包含了部分文件,希望有人能发现错误。

<?php echo $header; ?>
<div id="content">
    <div class="breadcrumb">
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
            <?php echo $breadcrumb['separator']; ?><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a>
        <?php } ?>
    </div>
    <?php if ($error_warning) { ?>
        <div class="warning"><?php echo $error_warning; ?></div>
    <?php } ?>
    <div class="box">
    <div class="heading">
        <h1><img src="view/image/module.png" alt="" /> <?php echo $heading_title; ?></h1>
        <div class="buttons">
            <a onclick="$('#form').submit();" class="button"><?php echo $button_save; ?></a>

            <a onclick="removeModule();" class="button"><?php echo $button_delete ?></a>            

            <a onclick="location = '<?php echo $cancel; ?>';" class="button"><?php echo $button_cancel; ?></a></div>
        </div>

        <div class="content">
            <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form">
            <div class="vtabsQS">
                <?php $module_row = 1; ?>               
                <?php foreach ($modules as $module) 
                {  ?>
                <div style="margin-left: -7px; float:left;">
                    <input type="checkbox" style="float: left; margin-top: 8px;" id="tab-<?php echo $module_row; ?>" onClick="" value="#tab-<?php echo $module_row; ?>"  />                 
                    <a href="#tab-module-<?php echo $module_row; ?>" id="module-<?php echo $module_row; ?>">
                        <?php foreach ($languages as $language) 
                        { ?> 
                            <label class="inputLrgTab"><?php if (!empty($module['language_id'][$language['language_id']])) { echo $module['language_id'][$language['language_id']];} ?></label> 
                        <?php } ?>                                      
                    </a><br />          
                </div>              
                <?php $module_row++; ?>
                <?php } ?>
                <span id="module-add" style="clear: both; margin-left: -7px;"><?php echo $button_add_module; ?>&nbsp;<img src="view/image/add.png" alt="" onclick="addModule();" /></span>
            </div>          


        <?php $module_row = 1; ?>
        <?php foreach ($modules as $module) { ?>
        <div id="tab-module-<?php echo $module_row; ?>" class="vtabs-content" style="margin-left:230px;">
          <table class="form">
            <tr>
              <td><?php echo $entry_title; ?></td>
              <td class="left">
                <?php foreach ($languages as $language) { ?>
                <img src="view/image/flags/<?php echo $language['image']; ?>" alt="<?php echo $language['name']; ?>" />
                <input class="inputLrg" type="text" name="<?php echo $classname; ?>_module[<?php echo $module_row; ?>][language_id][<?php echo $language['language_id']; ?>]" value="<?php if (!empty($module['language_id'][$language['language_id']])) { echo $module['language_id'][$language['language_id']];} ?>">
                <br />
                <?php } ?>
                <span class="error"><?php echo $error_title; ?></span>
              </td>
            </tr>
            <tr>
              <td><?php echo $entry_limit; ?></td>

【问题讨论】:

标签: javascript html internet-explorer


【解决方案1】:

remove() 作为 HTMLElements 上的方法不幸的是 not supported by Internet Explorer

您可以将this SO answer 中的解决方法用于普通的 javascript 解决方案。

但是,您似乎已经使用 jQuery,而是替换

document.getElementById('tab-' + x).remove();

$('#tab-' + x).remove();

【讨论】:

  • 采纳你的建议并替换为:$('#tab-' + x).remove(); $('#module-' + x).remove(); $('#tab-module-' + x).remove();现在它可以工作了!
  • @Bryan 欢迎您。如果这对您有用,您可以将此答案标记为解决方案,以便所有人都知道您的问题已解决。
【解决方案2】:

看来IE10也抛出这个错误..

这是我尝试使用对象outerHTML 属性的一种方式:

    if(typeof document.getElementById('id').remove=='function'){
       //If support  is found 
        document.getElementById('id').remove()
    }
    else{
      //If not
       document.getElementById('id').outerHTML='';
   }

【讨论】:

    【解决方案3】:

    你应该使用这个

    element.parentElement.removeChild(element);
    

    所有浏览器都支持,并且比仅仅破解有一些好处 删除子元素。

    这是继续使用.remove() 函数的另一种解决方法

    Element.prototype.remove = function() {
        this.parentElement.removeChild(this);
    }
    NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
        for(var i = this.length - 1; i >= 0; i--) {
            if(this[i] && this[i].parentElement) {
                this[i].parentElement.removeChild(this[i]);
            }
        }
    }
    

    然后你可以删除这样的元素

    document.getElementById("my-element").remove();
    

    document.getElementsByClassName("my-elements").remove();
    

    Here is Stack Overflow link for further info also source of this answer.

    【讨论】:

      【解决方案4】:

      您应该获取要删除的元素的父元素,并使用 remove child 方法查找并删除该元素

      element.parentNode.removeChild(element);
      

      这适用于所有浏览器,包括 IE。

      【讨论】:

      • parentElement 在 IE11 中为 null,但 parentNode(如这里)工作正常。谢谢!这应该被接受为最佳答案,因为它速度快,不使用任何其他库,也不搜索文档树。
      • 感谢@dean 的反馈
      • 非常优雅、干净和香草。
      • 我比使用 jQuery 的公认答案更喜欢这个。这个 vanilla Javascript 更好更干净。
      【解决方案5】:

      你可以填充 remove() 方法:

      (function (arr) {
        arr.forEach(function (item) {
          if (item.hasOwnProperty('remove')) {
            return;
          }
          Object.defineProperty(item, 'remove', {
            configurable: true,
            enumerable: true,
            writable: true,
            value: function remove() {
              this.parentNode.removeChild(this);
            }
          });
        });
      })([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-20
        • 2019-07-05
        • 2015-04-14
        • 2020-09-03
        • 2015-04-09
        • 2014-01-12
        • 2016-08-20
        • 2013-10-05
        相关资源
        最近更新 更多