像“DOMLastNodeRemoved”这样的事件可以防止多次执行代码

时间:2017-12-13 11:16:07

标签: javascript jquery events genexus

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

您好!

有没有像“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);

    };
});

我需要使用超时,因为DOM仍在加载消息。

无论如何,使用此代码我将在图像中显示此结果:

enter image description here

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

所以,我的问题是:

在我的情况下,有没有办法只执行一次代码?
是不是我没有看到像其他事件或其他方式使代码工作的东西?

如果问题听起来很愚蠢,抱歉,我是JS的新手。

1 个答案:

答案 0 :(得分:2)

在这种情况下的方法是创建User Control并使用其show函数,每次控件更新时由生成的应用程序执行(例如,页面加载时)或当控制的属性被修改时。)

为什么用户控制?

用户控件提供了一个标准接口,可与GeneXus生成的应用程序进行互操作。这个接口很好documented,并从生成的应用程序的内部工作中抽象出来。

如果您尝试通过包含脚本来扩展GeneXus,您将面临意外行为和更改,恕不另行通知。

如何创建用户控件

要创建用户控件,我建议使用GeneXus User Control Generator,用于Atom。使用此Atom包,您可以轻松创建GeneXus用户控件。

按照steps to create a User Control并在提示输入受支持的平台时选择Web

如何在加载页面时只执行一次代码

创建用户控件后,打开src/<YourUserControlName>Render.js文件并以这种方式编辑show函数:

this.show = function() {
  if (!this.IsPostBack) {
    // This code will be executed only, when the page is loaded.
  }
}

if内,您可以编码每页只需执行一次的任何内容。

如何部署用户控件

要构建用户控件并将其部署到GeneXus安装目录,请按照程序包文档中描述的build process steps进行操作。

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