我有一个在窗口加载时执行的功能
<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认为它已定义了该功能,但实际上它并没有。我希望我现在能说得更清楚。
答案 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");
}