Я смущен этим. Я создаю div в стиле лайтбокса с его собственным динамическим контентом, например:
//ADD LIGHTBOX DIV
var DG_lightbox = document.createElement('div');
DG_lightbox.className = "DG_lightbox";
DG_lightbox.id= "DG_lightbox";
document.body.appendChild(DG_lightbox);
//ADD MAIN CONTENT DIV
var DG_contentbox = document.createElement('div');
DG_contentbox.className = "DG_contentbox";
DG_contentbox.id= "DG_contentbox";
DG_lightbox.appendChild(DG_contentbox);
Очевидно, что гораздо больше контента, но все это добавлено в DG_lightbox div таким же образом. Лайтбокс имеет кнопку закрытия, которая должна выглядеть так:
function closeDG(){
DG_lightbox.parentNode.removeChild(DG_lightbox);
return false;
window.location.hash = "";
}
Он отлично работает в IE и Chrome, но в Firefox он, похоже, полностью не избавляется от объекта. Каждый второй раз создается лайтбокс, некоторые из содержания, как представляется, не инициализировать правильно, и когда снова закрывается, браузер должен думать об этом, прежде чем она будет удалена (как если бы в два раза содержание удаляется). После этого он работает нормально снова, до четвертого раза.
Поэтому, если я дважды использую removeChild()
в closeDG()
у меня нет этой проблемы, но страница обновляется, как будто return false
не работает для второго метода (дубликат return false
ничего не делает).
Мне бы хотелось использовать только один экземпляр removeChild()
, но я готов жить с дублирующимся методом, пока я могу предотвратить обновление страницы при ее вызове.
Веб-страница находится здесь: http://www.apennydreadful.com Нажмите "Главы> Начните здесь", чтобы увидеть сценарий в действии.
Любая помощь будет принята с благодарностью.
~ Гыз
UPDATE Похоже, что добавление второй removeChild
- это не то, что заставить ее работать. Вместо этого, поскольку вторая removeChild
заставляет код пропускать return false
, страница обновляется, обновляя также код... поэтому повторяющаяся ошибка на каждом другом клике никогда не достигается, но она все еще существует. Итак, опять же, я в недоумении. Даже если я $("#DG_lightbox").empty();
div, используя $("#DG_lightbox").empty();
перед использованием $("#DG_lightbox").remove();
результат тот же.
Поэтому мне удалось исправить свою проблему. Похоже, довольно простая проблема, не связанная с моим первоначальным вопросом. Динамический контент внутри div, который я пытался удалить, был определен внутри той же функции, которая создала этот родительский div. Что-то вроде этого:
function clickThis(){
var DG_lightbox = document.createElement('div');
DG_lightbox.className = "DG_lightbox";
DG_lightbox.id= "DG_lightbox";
document.body.appendChild(DG_lightbox);
var DG_tooltip = document.createElement('div');
DG_tooltip.className = "DG_tooltip";
DG_tooltip.id= "DG_tooltip";
DG_tooltip.innerHTML = " ";
DG_lightbox.appendChild(DG_tooltip);
};
Эти элементы были удалены и повторно созданы в соответствии со следующим щелчком мыши в Chrome и IE, но Firefox не имел этого. Не знаю, почему. Может быть, кто-то более осведомленный мог бы объяснить. В любом случае, я определил вары глобально, и теперь все правильно, как дождь.
Спасибо за всю помощь, как всегда, ~ gyz
Это не просто Firefox, где это происходит, поскольку я видел ту же проблему в Chrome. Обычная причина - наличие неожиданных текстовых узлов. Следующий HTML-код провалится точно так, как вы описываете:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Replace Test</title>
</head>
<body>
<p id="demo">Click the button to replace </p>
<button onclick="myFunction()">Try it</button>
<script>
var cnt = 1;
var para=document.createElement("p");
var innerDiv =document.createElement("div");
var node=document.createTextNode("If original text is still showing, click button again, count ="+cnt);
para.appendChild(node);
para.id = "p1";
innerDiv.appendChild(para);
function myFunction()
{
var target=document.getElementById("foo");
target.appendChild(innerDiv);
var current = target.firstChild;
target.removeChild(target.firstChild);
cnt = cnt +1;
window.console.log("btn pressed, cnt="+cnt);
}
</script>
<div id="foo">
<div id="bar">
<p>This is text that should vanish when the button is clicked.</p>
</div>
</div>
</body>
</html>
Проблема в том, что элемент div "bar" не является первым дочерним узлом "foo". Существует пара текстовых узлов, одна перед "баром" и одна за другой, каждая из которых содержит возврат каретки. С другой стороны, если HTML изменен на
<div id="foo"><div id="bar">
<p>This is text that should vanish when the button is clicked.</p>
</div></div>
скрипт работает правильно. Каретка возвращается в "бар" не имеет значения.
function clodeDG(){ jQuery("#DG_lightbox").empty(); jQuery("#DG_lightbox").remove(); }
div перед тем, как попытаться удалить его, я получаю тот же результат (предъявляя что-то подобное): function clodeDG(){ jQuery("#DG_lightbox").empty(); jQuery("#DG_lightbox").remove(); }