javascript缓存(可能)?
我需要从屏幕中删除一个元素,然后重新生成一个同名的元素 代码中有一个deleteObject函数和一个appendChild调用 在deleteObject函数中,它使用removeChild语句删除元素(如下所示) 看看这是我想要完成的。现在小提琴工作,但我的代码仍然没有。我认为这与“top”关键字有关。看看这个,了解我的想法 正如我前面所说,我有一个名为“container1”的元素需要删除,然后我有一个新的“container1”需要创建。当我从deleteObject函数中删除代码时,会显示新的“container1”,但是,当我包含代码时,它似乎有冲突,并且新的“container1”永远不会显示 我想知道是否存在某种javascript缓存?因为remove和create函数是背靠背调用的。有没有一种方法,我可以使用我的代码,但增加一些延迟 任何建议,谢谢javascript缓存(可能)?,javascript,Javascript,我需要从屏幕中删除一个元素,然后重新生成一个同名的元素 代码中有一个deleteObject函数和一个appendChild调用 在deleteObject函数中,它使用removeChild语句删除元素(如下所示) 看看这是我想要完成的。现在小提琴工作,但我的代码仍然没有。我认为这与“top”关键字有关。看看这个,了解我的想法 正如我前面所说,我有一个名为“container1”的元素需要删除,然后我有一个新的“container1”需要创建。当我从deleteObject函数中删除代码时,会
function deleteObject(id) {
try {
var obj = document.getElementById(id);
obj.parentNode.removeChild(obj);
} catch (e) {}
//do something
}
function hidePopWin() {
if (gPopupMask == null) {
return;
}
deleteObject('popupMask_' + popuplayer);
deleteObject('popcont_' + popuplayer);
popuplayer--;
if (popuplayer == 0) {
gPopupIsShown = false;
gPopupContainer = this.undefined;
gPopupIframe = this.undefined;
} else {
var showmask = document.getElementById('popupMask_' + popuplayer);
if (showmask) {
showmask.style.display = "block";
gPopupContainer = document.getElementById("popcont_" + popuplayer);
gPopupIframe = document.getElementById("iframe_layer" + popuplayer);
}
}
//console.log("got here: " )
}
更新:
这更准确地显示了正在发生的事情(然而,在fiddle中它工作,但在内部它不工作):查看此以了解更多信息,javascript中没有缓存,但是如果在javascript变量中有对对象的引用(看起来可能在示例代码中),对象实际上不会被销毁 仅此一点不应阻止您将DOM中的对象替换为另一个对象,因此肯定会发生其他事情。您必须包含一个更完整的导致问题的代码示例(包括您的HTML),以便我们知道如何更具体地为您提供建议 通过使用此函数,您可以简化文章中包含的代码:
function deleteObject(id) {
try {
var obj = document.getElementById(id);
obj.parentNode.removeChild(obj);
} catch(e) {}
}
然后,您可以将其称为:
deleteObject('popupMask_' + popuplayer);
deleteObject('popcont_' + popuplayer);
而且,这段代码没有在任何JS变量中保留对已删除对象的引用,因此这些对象将被JS垃圾收集器销毁。即使很琐碎,您可能忽略了实际加载的DOM? jsFiddle在
onLoad
上调用代码
如果调用
deleteObject('id')代码>,它在after文档/元素加载到DOM之前不会工作,因为ID在此之前不存在。好的,我试过调试它,它似乎与removeChild方法有关
这解决了问题-setTimeout(function(){obj.parentNode.removeChild(obj)},5)
我能想到的唯一解释是,removeChild(iframe obj)
是从iframe obj
的事件调用的。因此,删除执行此代码的DOM元素时,不可能执行javascript代码(像<代码> < p>看起来你有两件事你可能要考虑改变。首先,你想保持一个容器的状态,你正在添加/删除吗?使用冒泡是否更有意义?你不知道你在追求什么。你问如何删除一个元素并创建一个具有相同ID的新元素吗?名称?如果是这样的话,那么您可能希望将其作为您在js中创建的第一个对象
var myDiv = function(data){id: id, init: function(data.id){document.createElement('div'), return init}
myDiv.init("id") //makes a new div!
然后你的下一个对象就是弹出窗口,等等
你知道吗?一个很好的例子是没有本地存储挂钩的便笺:我不确定你对此是否满意,但这是一种处理以下问题的方法:
当您已经获得要删除的对象的引用时,只需重命名它,然后删除。这将使DOM中的名称不被使用,因此添加新元素后,它的名称将是唯一的。您是否在JavaScript控制台中看到任何错误?否-我看到两个函数都被调用。但屏幕并不表示新的cont您能描述一下JSFIDLE中的代码吗?它似乎不起作用(没有HTML)所以我们可以运行它来看看它是如何工作的,所以你需要解释你想要发生什么,什么是错误的。fiddle不会运行,调用代码太复杂,无法在fiddle中运行。基本上,fiddle中的代码是删除和显示弹出的div元素。问题是我必须隐藏一个div,然后显示一个新的div,但是被称为相同的名称。所以我希望fiddle中的代码将显示一个变量,该变量保持对象看起来不会破坏我试图破坏的原始div。@JeffV,你的问题很模糊。你能描述预期的行为吗?如果很难描述,你能创建清晰的屏幕截图吗s?在性能方面,捕获错误的效率不是很低吗?检查obj
是否为null应该可以完成这项工作。我添加了一个提琴,以便您可以看到我正在使用的内容。此代码非常旧,我们正在重构周围的项目,这就是为什么它突然不起作用的原因。当预期结果没有错误时,设置一个异常处理程序比多个if
检查更有效,它当然更小,更易于阅读。抛出和捕获异常比if
检查慢。在这样的代码中,性能上的细微差异很少是重要的考虑因素。可靠性、可读性和可维护性和大小通常是更重要的考虑因素。我会尝试一下您的代码,看看它是否能纠正我这边的问题。感谢您花时间查看它。我将把它放在我的代码中的什么位置?它将放在removechild行所在的位置?还是其他地方?