在动态更改数据之后(在ajax调用之后)检查函数是否存在

check if a function exist after dynamically changing data (after an ajax call)

本文关键字:之后 检查 函数 存在 是否 调用 动态 数据 ajax      更新时间:2023-12-21

我有一个在窗口加载时执行的函数

<div id="removeItOnAjaxCall">
<script>
    foo = function() {
    // some stuff
    }
</script>
</div>

还有一个ajax调用,可以像这样从DOM中删除此函数。

    new Ajax.Updater('chkboxpos, 'myscript.php', {
        onSuccess: function(response) {
            $('removeItOnAjaxCall').remove(); //now I don't have foo function in my DOM. but DOM think it is
        }
    });

现在,如果我调用这个函数,我会得到一个错误

element is null
var method = element.tagName.toLowerCase();

因为DOM认为它定义了那个函数,但实际上它没有。我希望我现在能说得更清楚。

您对<script>标记的工作方式感到困惑。一旦遇到并解析了脚本,就永远不会删除脚本中的任何定义,即使script标记或其封闭元素已被删除。函数未定义的唯一方法是显式定义,例如delete window.fun;fun = null

因此,你的担心是错误的。不需要检查函数是否仍然存在——不管您在ajax处理程序中操作了什么元素,它都存在。为什么你认为这个函数会变得未定义?

DOM从根本上与JS命名空间是分离的。函数不包含在DOM中;它们包含在JS命名空间中。DOM根本不知道哪些函数可能存在或不存在。您可能对DOM做的任何事情都不会影响JS逻辑或数据。由于函数不存在于DOM中,因此无法从DOM中删除它们。你说

现在,如果我调用这个函数,我会得到一个错误,因为DOM认为它定义了那个函数,但实际上它没有。

关于您的错误:

element is null
var method = element.tagName.toLowerCase();

这与函数CCD_ 5无关。由于该元素已被删除,因此它为null。无法获取不存在元素的tagName。你说你在"调用这个函数",但你没有调用那个函数。您正在尝试获取一个元素的tagName,这是一个完全不同的东西。

话虽如此,在可能要删除的元素中放置脚本标记似乎有点奇怪——你为什么这么做?

foo = function() {
  // some stuff
 }    
if(typeof foo == "function")){
    console.log("function exist");
}