首先:我知道有一些与此类似的问题,但我找不到任何替代方案,但要问。
您好!
有没有像“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仍在加载消息。
无论如何,使用此代码我将在图像中显示此结果:
如果我使用的是preventPropagation(至少我使用的方式),它只会运行我的代码一次,但会在控制台中返回很多错误(每次执行一次)并且还会破坏我的加载程序。 顺便说一句,我只有一个自定义脚本,其他一切都是由Genexus生成的 因此,如果我使用任何其他正常事件,例如document.ready,它将在我第一次在MasterPage中加载页面时触发,但是,如果我点击任何其他页面,它将不会再次触发该事件。
所以,我的问题是:
在我的情况下,有没有办法只执行一次代码?
是不是我没有看到像其他事件或其他方式使代码工作的东西?
如果问题听起来很愚蠢,抱歉,我是JS的新手。
答案 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进行操作。
部署用户控件后,应将其包含在母版页对象中,以便开始使用它,而不是现在使用的脚本。