2010-08-05 91 views
0

我已经为我建立的网站创建了一个日历应用程序,我试图用javascript去除div元素。
iFrame Javascript删除div子元素

进程
-------------------
*日历页面加载
*上的一个事件用户点击
*事件与弹出这是通过div容器ID的fancybox窗口,和事件ID股利
*用户点击删除*在div指定(日历事件DIV)事件
应该被移除

我使用JavaScript代码是:

<script language="javascript" type="text/javascript"> 
    function btnClick(container, objID) { 
     removeElement(container, objID); 
     parent.$.fancybox.close(); 
    } 
    function removeElement(par, div) { 
     var d1 = parent.document.getElementById(par); 
     var d2 = parent.document.getElementById(div); 

     d1.removeChild(d2); // The Problem Line DOM 8 Not Found Exception 
    } 
</script> 

使用警报显示找到了d1和d2,但是当子节点被删除时,我得到一个DOM 8异常。 任何想法如何让这个工作?

编辑: 我使用ASP.Net所以这个代码在Page_Load

if(Request.QueryString["Container"] != null) 
    lnkDelete.Attributes.Add("onclick", "btnClick(\"" + 
     Request.QueryString["Container"].ToString() + "\",\"" + 
     Request.QueryString["Control"].ToString() + "\");"); 

运行,因此它基本上只是增加了btnClick功能删除事件链接按钮。 该事件确实触发,并且找到元素,只是它不会从父文档中删除子元素。

+0

您在哪个浏览器中收到错误消息?你可以尝试另一个吗? – 2010-08-05 16:20:03

+0

在Chrome(内置javascript调试器)和Firefox(Firebug) – GambitSunob 2010-08-05 17:50:11

+0

中,我都遇到了同样的错误。并且它不适用于任何浏览器(IE,Firefox,Chrome,Safari) 我会尽快搭建一个示例页面,当前网站无法访问到外部。 – GambitSunob 2010-08-05 17:56:01

回答

1

从你提供的链接我试图跟踪函数调用。当你表现出,无论是d1d2定义,例如,我有:

d1.id = "cal_DayContent4" 
d2.id = "calendarID4" 

那么你的功能作用:

d1.removeChild(d2); 

但是让我们看看DOM:

<div id="cal_DayContent4" class="cal_DayContent"> 
    <div class="cal_DayNumber">5</div> 
    <div class="calendarg-Party"> 
     <div id="calendarID4" class="calendar-Calendar"> 
      … 
     </div> 
    </div> 
</div> 

由于这表明,d2不是d1的直接子,而是div的类calendarg-Party。如果这div始终是d1的第二个孩子,你可以这样做

d1.childNodes[1].removeChild(d2); 

和正确的节点将被删除。


就在方节点:我查了一下进一步一圈,发现这样的代码(插入了缩进):

(function (evt) { 
    with (this.ownerDocument ? this.ownerDocument : {}) { 
     with (this.form ? this.form : {}) { 
      with (this) { 
       return (function(evt){ 
        btnClick("cal_DayContent4","calendarID4"); 
       }).call(this, evt); 
      } 
     } 
    } 
}) 

我怀疑这是由一些ASP.NET写的东西(我不不了解ASP.NET的任何信息),但这真的很糟糕。 with声明在JavaScript中被认为是不好的做法,并且with reason。这样,很难理解这里发生了什么。


BTW2,你知道你可以安全地在JavaScript中交换单引号和双引号吗?这意味着你也可以写你的代码,如

if(Request.QueryString["Container"] != null) 
    lnkDelete.Attributes.Add("onclick", 'btnClick("' + 
     Request.QueryString["Container"].ToString() + '","' + 
     Request.QueryString["Control"].ToString() + '");'); 

这是,恕我直言,方式更容易阅读。


UPDATE:过了一会儿,我意识到这是不是所有必要的d1的ID发送给你的函数removeElement。取而代之的是我上面写的,它更容易(和更强大的,因为你不依赖总是停留d1第二个节点的父节点的)做

d2.parentNode.removeChild(d2); 

这让我疑惑:why does removeChild need a parent node?

+0

完美运作。我没有意识到它必须是一个直接的孩子,我认为它会扫描所有儿童的孩子等。找到元素。 我非常喜欢这个单曲的单引号,非常容易。:) 非常感谢! – GambitSunob 2010-08-05 19:48:41