Javascript 事件如;“DOMLastNodeRemoved”;防止代码的多次执行

Javascript 事件如;“DOMLastNodeRemoved”;防止代码的多次执行,javascript,jquery,events,genexus,Javascript,Jquery,Events,Genexus,首先:我知道有一些问题与此类似,但我找不到任何替代方案,只能问 你好! 是否存在类似“DOMLastNodeRemoved”(或FirstNode,因为您无法确定它何时将是最后一个删除的节点)的事件来阻止代码的多次执行 交易是这样的,我用的是Genexus。在这个奇怪的SPA概念中,使事件工作的唯一方法是使用DOMNodeRemoved事件。 但是每当你点击一个按钮,它就会插入很多节点,使函数执行25次而不是一次 让我们来看一个例子: 我目前使用以下代码: $(document).on("DOM

首先:我知道有一些问题与此类似,但我找不到任何替代方案,只能问

你好!

是否存在类似“DOMLastNodeRemoved”(或FirstNode,因为您无法确定它何时将是最后一个删除的节点)的事件来阻止代码的多次执行

交易是这样的,我用的是Genexus。在这个奇怪的SPA概念中,使事件工作的唯一方法是使用DOMNodeRemoved事件。 但是每当你点击一个按钮,它就会插入很多节点,使函数执行25次而不是一次

让我们来看一个例子:

我目前使用以下代码:

$(document).on("DOMNodeRemoved", function() {
$(".Button").click(function() {
    setTimeout(
        function() {
            toastrgx();
            $('.gx-warning-message').css('display', 'none');
        }, 800);
});
function toastrgx() {

    var meuLoader = new Loader($);
    meuLoader.Insert();

    setTimeout(function() {
        meuLoader.Remove();
        var text = $('.gx-warning-message').text();
        toastr.error(text, '');

    }, 500);

    };
});
我需要使用timeout,因为DOM仍在加载消息

不管怎样,通过这段代码,我将在图像中显示以下结果:

如果我使用像preventPropagation这样的东西(至少是我使用的方式),它只会运行我的代码一次,但会在控制台中返回很多错误(每次执行一个错误),并且还会破坏我的加载程序。 顺便说一句,我只有一个自定义脚本的权限,其他所有脚本都是由Genexus生成的。
因此,如果我使用任何其他正常事件,如document.ready,它将在我第一次在母版页中加载页面时触发,但是,如果我单击任何其他页面,它将不会再次触发事件

所以,我的问题是:

在我的情况下,有没有办法只执行一次代码?
这是不是像另一个事件或另一种使代码工作的方式一样,我看不清楚


如果这个问题听起来很傻,对不起,我是JS的新手。

在这种情况下,方法是创建一个应用程序并使用它的
show
函数,每当控件更新时(例如,加载页面或修改控件的属性时),生成的应用程序都会执行该函数

为什么是用户控件? 用户控件提供了与GeneXus生成的应用程序进行互操作的标准界面。这个界面很好,可以将您从生成的应用程序的内部工作中抽象出来

如果您试图通过包含脚本来扩展GeneXus,您将在没有事先通知的情况下暴露于意外的行为和更改

如何创建用户控件 要创建用户控件,我建议使用,for Atom。使用这个Atom包,您可以轻松创建GeneXus用户控件

按照,当软件包提示输入支持的平台时,选择
Web

如何让代码在加载页面时只执行一次 创建用户控件后,打开
src/Render.js
文件并按以下方式编辑
show
函数:

this.show = function() {
  if (!this.IsPostBack) {
    // This code will be executed only, when the page is loaded.
  }
}
if
中,您可以编写任何需要执行的代码,每页只执行一次

如何部署用户控件 要构建用户控件并将其部署到GeneXus安装目录,请按照软件包文档中描述的操作


部署用户控件后,应将其包含在母版页对象中,以开始使用它,而不是现在使用的脚本。

本例中的方法是创建并使用其
show
功能,该功能由生成的应用程序在每次更新控件时执行(例如,加载页面或修改控件的属性时)

为什么是用户控件? 用户控件提供了一个标准界面,可以与GeneXus生成的应用程序进行互操作。这个界面很好,可以将您从生成的应用程序的内部工作中抽象出来

如果您试图通过包含脚本来扩展GeneXus,您将在没有事先通知的情况下暴露于意外的行为和更改

如何创建用户控件 要创建用户控件,我建议使用,for Atom。使用此Atom包,您可以轻松创建GeneXus用户控件

按照,当软件包提示输入支持的平台时,选择
Web

如何让代码在加载页面时只执行一次 创建用户控件后,打开
src/Render.js
文件并按以下方式编辑
show
函数:

this.show = function() {
  if (!this.IsPostBack) {
    // This code will be executed only, when the page is loaded.
  }
}
if
中,您可以编写任何需要执行的代码,每页只执行一次

如何部署用户控件 要构建用户控件并将其部署到GeneXus安装目录,请按照软件包文档中描述的操作


一旦部署了用户控件,您应该将其包含在母版页对象中,开始使用它,而不是现在使用的脚本。

您的问题确实不清楚,因为您询问的是一个尝试的解决方案,而不是告诉我们您要解决的问题。从您尝试执行的操作来看可能是更好的方法,但这取决于您工作的环境。@Rorymcrossan如果我没有说清楚,很抱歉。我的问题是我需要执行函数toastrgx();只执行一次而不是多次,这会导致消息在屏幕上多次显示,就像您在屏幕截图中看到的那样。如果我使用“common document.on.ready()solution”,由于框架的结构,它将无法工作。@Kaddath每个页面中最多有2个按钮类,一个用于确认,另一个用于关闭表单。这不是“必需的”",但这是我发现它在框架结构下工作的唯一事件。我乐于接受建议,也许我没有想到一个事件可以解决我的问题?因此,总而言之,它们不是必需的,但这是唯一能让我的代码保持运行而不会像我在同一应用程序中单击另一个页面时那样丢失上下文的事情n、 我很乐意提供帮助(这里是GeneXus developer),但我不明白您想要实现什么。请告诉我您想要解决的基本问题。@ncardeli我正在尝试在JS中查找任何事件来执行我的函数