Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.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 从匿名函数中清除DOM_Javascript_Jquery - Fatal编程技术网

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更新了答案