Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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 Eventlistener内部的Eventlistener_Javascript_Addeventlistener_Event Listener_Removeeventlistener - Fatal编程技术网

Javascript Eventlistener内部的Eventlistener

Javascript Eventlistener内部的Eventlistener,javascript,addeventlistener,event-listener,removeeventlistener,Javascript,Addeventlistener,Event Listener,Removeeventlistener,我有一个在freshsales iframe中运行的代码。我在iframe中的应用程序代码放在iframe加载事件侦听器中。所以我的javascript应用程序在应用程序窗口加载后启动。长话短说:我的应用程序在事件侦听器中运行 但当我在不刷新的情况下重新加载页面时就会出现问题(我不刷新页面,我只是从一个选项卡跳到另一个选项卡,当我打开我的应用程序工作的选项卡时,“app.activated”事件触发,我的javascript应用程序启动。到目前为止,一切都很好。但当我转到另一个选项卡并再次转到我

我有一个在freshsales iframe中运行的代码。我在iframe中的应用程序代码放在iframe加载事件侦听器中。所以我的javascript应用程序在应用程序窗口加载后启动。长话短说:我的应用程序在事件侦听器中运行

但当我在不刷新的情况下重新加载页面时就会出现问题(我不刷新页面,我只是从一个选项卡跳到另一个选项卡,当我打开我的应用程序工作的选项卡时,“app.activated”事件触发,我的javascript应用程序启动。到目前为止,一切都很好。但当我转到另一个选项卡并再次转到我的选项卡时,附加到我的应用程序的事件侦听器又被创建了(只是我的连字号)正因为如此,每次我都会跳回我的应用程序,一个新的事件监听器连接到同一个对象。因此,当我单击相关对象时,会触发多个事件,相关函数会运行一次以上

我在此附上代码:

var client;
$(document).ready( function() {
    app.initialized()
        .then(function(_client) {
            client = _client;
            client.events.on("app.activated",
                function() {
                    console.log("APP LOADED");

                    //These are event listener functions that fires 2 or more times when app is loaded more than 1 time
                    let nextButtonScript = function(){
                        getReportDataAndFill(  );
                    } 
                    let prevButtonScript = function(){
                      getReportDataAndFill(  );
                    }

                    //I added these lines to prevent double attachment of event listener to same object, but that didnt helped
                    document.getElementById("skvPrevMonth").removeEventListener("click", prevButtonScript);
                    document.getElementById("skvNextMonth").removeEventListener("click", nextButtonScript);
                    //I add event listener to elements here
                    document.getElementById("skvPrevMonth").addEventListener("click", prevButtonScript);
                    document.getElementById("skvNextMonth").addEventListener("click", nextButtonScript);
                });
        });
});
总之,当我运行此代码时,当我跳转到另一个选项卡并再次来到我的应用程序选项卡(触发“app.activated”事件),然后当我单击“skvPrevMonth”按钮时,它的事件侦听器函数触发2次。如果我再次跳转另一个选项卡并再次出现,它将触发3次,依此类推

非常感谢您的帮助。
非常感谢。

您的函数
nextButtonScript
prevButtonScript
都是在
应用程序中定义的。激活的
回调。这意味着每次运行回调时,这些变量都会引用不同的函数,而不是相同的函数。这就是为什么它不会删除旧的侦听器的原因:因为您是告诉它删除当前的函数,但是那些还没有被添加。旧的函数,以及它们不同的引用,仍然存在


在回调的作用域之外定义这两个函数(它们似乎没有使用任何需要内部作用域的变量),它应该可以工作,因为引用在事件触发期间保持不变:)您的函数
nextButtonScript
prevButtonScript
正在
应用程序中定义。已激活
回调。这意味着每次运行回调时,这些变量都包含对不同函数的引用,而不是对相同函数的引用。这就是为什么它没有删除旧的侦听器:因为您告诉它删除当前的函数,但这些函数尚未添加。旧的,有着不同的参考,仍然存在


在回调的作用域之外定义这两个函数(它们似乎没有使用任何需要内部作用域的变量),它应该可以工作,因为在事件触发期间引用将保持不变:)

只需创建一个变量,如
listenersAdded
。当
app.initialized()
首次运行时,将其设置为true,然后仅在该变量为false时添加侦听器。我尝试将变量添加为标志,但这不起作用。我认为这是因为每次运行主回调时都会创建一个不同的变量使其成为一个全局变量非常感谢!只需创建一个变量,如
listenersAdded
。当
app.initialized()
首次运行时,将其设置为true,然后仅在该变量为false时添加侦听器。我尝试将变量添加为标志,但这不起作用。我认为这是因为每次运行主回调时都会创建一个不同的变量使其成为一个全局变量非常感谢!我认为这应该行得通,但我简化了代码。事实上,它们都需要很多内部变量。因此,将功能移到外部并不是那么容易。无论如何,谢谢你的好主意。非常感谢你的解释。是的,这就像每次创建新对象一样,它的内部变量为每个对象创建的方式不同。你是对的!我认为这应该行得通,但我简化了代码。事实上,它们都需要很多内部变量。因此,将功能移到外部并不是那么容易。无论如何,谢谢你的好主意。非常感谢你的解释。是的,这就像每次创建新对象一样,它的内部变量为每个对象创建的方式不同。你是对的!