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

时间:2015-02-18 04:15:16

标签: javascript ajax prototypejs

我有一个在窗口加载时执行的功能

<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认为它已定义了该功能,但实际上它并没有。我希望我现在能说得更清楚。

2 个答案:

答案 0 :(得分:1)

您对<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();

这与函数foo无关。由于元素已被删除,因此它为null。您无法获取不存在的元素的tagName。你说你正在“调用这个函数”,但是你没有调用那个函数。您正在尝试获取元素的tagName,这是完全不同的事情。

话虽如此,将一个脚本标记放在一个可能会被删除的元素中似乎有点奇怪 - 你为什么这样做?

答案 1 :(得分:0)

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