Javascript 从匿名函数中清除DOM
假设我有以下代码:Javascript 从匿名函数中清除DOM,javascript,jquery,Javascript,Jquery,假设我有以下代码: <script type="text/javascript"> $(function($){ //some code here... }); </script> 此代码将在加载页面后运行,但每次调用$window.triggerload;时也会运行 我的问题是: 那个匿名函数住在哪里? 是否可以将其移除,如果可以,如何移除? 问候 编辑:我并不是要求其他方法,比如开关,让我过滤匿名函数的执行。我无法修改插入该函数的代码,因此我唯一可能的解决方
<script type="text/javascript">
$(function($){
//some code here...
});
</script>
此代码将在加载页面后运行,但每次调用$window.triggerload;时也会运行
我的问题是:
那个匿名函数住在哪里?
是否可以将其移除,如果可以,如何移除?
问候
编辑:我并不是要求其他方法,比如开关,让我过滤匿名函数的执行。我无法修改插入该函数的代码,因此我唯一可能的解决方案是找到如何在加载该函数后删除该函数。您可以维护一个简单的状态变量,以确定是否执行匿名函数
var is_window_inited = false;
$(function($){
if( is_window_inited )
return;
is_window_inited = true;
//some code here...
});
这是将函数绑定到文档对象onready事件的快捷方式
您可以查看$document.data“events”中所有$function$bound事件,并从中解除绑定
2.显然ready没有存储在数据中,但是通过查看jquery源代码,我们可以在第3119行中找到我们要查找的内容,其中所有document.ready和其他特殊事件都被插入到Deferred对象中,然后根据一些条件和超时触发。因此,它们存储在延迟对象中
最后,为了回答您的问题,调用$.Callbacks.empty应该从回调列表中删除所有就绪函数,至少从我对代码的理解中是这样;由于某些原因,它并没有,如本文所示:-idk,这对于jquery开发人员来说是一个更大的问题。但是,如fiddle中所示,您可以通过设置一个简单标志来防止就绪事件运行。尝试以下操作:
$(function($){
//some code here...
arguments.callee = null;
});
要回答你的问题,我们必须看 哪个叫 正如您所见,jQuery只是将就绪回调推送到一个承诺:
jQuery.ready.promise().done(fn);
从这里没有办法操纵实际堆栈
TLDR:无法删除该函数
var is_window_inited = false;
$(function($){
if( is_window_inited )
return;
is_window_inited = true;
//some code here...
});
替代方法:
这不是触发本机事件的好方法,例如$window.trigger'load'
您可以改为触发自己的自定义事件:
$(window).trigger('page:load'); // Or something simulare.
然后确保在本机事件触发时触发该事件:
$(window).once('load', function() { // <- I'm using .once because load should only fire one time, and this way jQuery will unbind the listener for me
$(window).trigger('page:load');
});
在窗口加载时,您想删除该函数,那么为什么需要该函数?不,我想在页面加载后和手动触发另一个“加载”事件之前,在某个随机时间点删除它。为什么您要再次触发加载?你的页面怎么能加载两次?@TimRogers在处理整个DOM替换时,手动触发另一个“加载”事件是很常见的。就像通过AJAX再次获取整个页面一样,并将当前页面替换为$body.htmlresponse@亚历山大不常见,而且方法愚蠢。使用自定义事件。我无法修改插入匿名函数的代码。@alexandernst给我几分钟时间。我会考虑一下并更新我的答案@alexandernst即使经过充分的研究,我也无法找到解除onLoad处理程序绑定的方法。可以在jQuery1.4及更低版本上执行此操作。但在新版本上没有。你能告诉我为什么打$window.triggerload吗?让我们看看是否有其他选择。不起作用,参数。被调用方在严格模式下不起作用。如果需要重用函数,请为其指定一个名称。函数a{console.loga==arguments.callee}@alexanderst我认为NULL所说的是100%正确的。经过一些研究,发现了同样的情况。您可能希望使用自定义事件,除非您正在编写一些快速代码。无论如何,让我们知道你为什么要触发这个事件。正如我在问题的编辑中已经说过的,有一些JS代码我无法以任何方式修改。我唯一能做的就是添加更多的JS来完成我应该做的事情,也就是说,再次请求整个内容,替换整个主体,然后触发“加载”事件,这样新加载的代码就可以完成它的任务,但所有这些都避免了运行旧的JS代码。实际上,我可以通过$window.data“events”;,找到我要查找的内容;。糟糕的是,我得到了3个objects函数,我不知道如何只删除我感兴趣的一个。让我尝试删除所有内容并检查这是否解决了我的问题。是否可以找到jQuery绑定的所有事件?@alexandernst更新了答案