2010-08-05 9 views
0

Я создал приложение календаря для сайта, который я создаю, и я пытаюсь удалить элемент div с помощью javascript.
iFrame Javascript удалить дочерние элементы div

Процесс
-------------------
* Календарь Страница Нагрузки
* Пользователь нажимает на событие
* Событие всплывает с FancyBox окно, которое передается идентификатор Container Div и Event ID Div
* Пользователь нажимает Удалить событие
* The ДИВ указано (календарь событий 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 при удалении дочернего узла. Любая идея, как заставить это работать?

EDIT: Я использую ASP.Net так что этот код будет работать на Page_Load

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

Так что в основном только добавляет функцию btnClick к кнопке связи Remove Event. Событие срабатывает, и элементы найдены, просто он не удаляет дочерний элемент из родительского документа.

+0

В каком браузере вы получили сообщение об ошибке? Вы можете попробовать другой? –

+0

В Chrome (встроенный отладчик javascript) и Firefox (Firebug) – GambitSunob

+0

Я получаю ту же ошибку в обоих. И он не работает ни в одном из браузеров (IE, Firefox, Chrome, Safari). . Я постараюсь в ближайшее время поставить пример страницы, текущий сайт недоступен для наружного. – GambitSunob

ответ

1

Из предоставленной вами ссылки Я попытался проследить вызовы функций. Как показывают, как d1 и d2 определены, например, я получил:

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> 

As это ясно, 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 вашей функции removeElement. Вместо того, что я написал выше, это проще (и надежнее, так как вы не зависит от родительского узла всегда являющегося вторым узлом d1), чтобы сделать

d2.parentNode.removeChild(d2); 

, который оставляет меня интересно: why does removeChild need a parent node?

+0

Это сработало отлично. Я не понимал, что это должен быть прямой ребенок, я предполагал, что он сканирует все дети детей и т. Д. найти элемент. Мне определенно нравится одиночная кавычка над. Намного проще. :) Большое вам спасибо! – GambitSunob

Смежные вопросы