Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript缓存(可能)?_Javascript - Fatal编程技术网

javascript缓存(可能)?

javascript缓存(可能)?,javascript,Javascript,我需要从屏幕中删除一个元素,然后重新生成一个同名的元素 代码中有一个deleteObject函数和一个appendChild调用 在deleteObject函数中,它使用removeChild语句删除元素(如下所示) 看看这是我想要完成的。现在小提琴工作,但我的代码仍然没有。我认为这与“top”关键字有关。看看这个,了解我的想法 正如我前面所说,我有一个名为“container1”的元素需要删除,然后我有一个新的“container1”需要创建。当我从deleteObject函数中删除代码时,会

我需要从屏幕中删除一个元素,然后重新生成一个同名的元素

代码中有一个deleteObject函数和一个appendChild调用

在deleteObject函数中,它使用removeChild语句删除元素(如下所示)

看看这是我想要完成的。现在小提琴工作,但我的代码仍然没有。我认为这与“top”关键字有关。看看这个,了解我的想法

正如我前面所说,我有一个名为“container1”的元素需要删除,然后我有一个新的“container1”需要创建。当我从deleteObject函数中删除代码时,会显示新的“container1”,但是,当我包含代码时,它似乎有冲突,并且新的“container1”永远不会显示

我想知道是否存在某种javascript缓存?因为remove和create函数是背靠背调用的。有没有一种方法,我可以使用我的代码,但增加一些延迟

任何建议,谢谢

    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行所在的位置?还是其他地方?