【问题标题】:Stop event handler from running, after one click单击后停止事件处理程序的运行
【发布时间】:2020-02-15 15:10:00
【问题描述】:

我正在编写一些 JavaScript 代码来执行超链接跟踪。基本上,如果您点击一个链接,它会触发对另一个系统的跟踪。

但是,我只想在第一次点击时触发跟踪。
目前,我的事件处理程序会在每次点击时触发,我只希望它触发一次。

通过下面的代码,我使用的是while loop。这适用于第一个链接,但这意味着当我单击其他链接时,我的事件处理程序不会触发......所以它完全停止运行。

不确定处理此问题的最佳方法。

我正在使用event.target 在链接上从 aria-controls 的值中获取一个数字。只是为了解释我在下面做什么:

   var apples         = object.apples; 
   var click          = 0;

    function sendTrackingData(event) {
        if (event.domEvent.target.hasAttribute("aria-controls")) {

            // Grab the value of aria-controls attibute
            var buttonAriaControlValue = event.domEvent.target.attributes["aria-controls"].value;


            //Only send report on the first click click
            while (buttonAriaControlValue && click < 2) {
                click++;

                //Take the last number of the value
                var number = buttonAriaControlValue.charAt(buttonAriaControlValue.length-1);

                var integer = parseInt(number);
                var final = integer + 1

                reportingService.sendReport({}, 'ClickReport', 'The value is: ' + final + ' of ' + apples);
        }
    }
}

fruitLinks.onDOMEvent('click', sendTrackingData);

【问题讨论】:

    标签: javascript dom event-handling dom-events


    【解决方案1】:

    如果您希望每个链接都可单击一次,则不能使用全局变量(单击)。

    这里是一个简单的方法,你只需要改变两行注释

    function sendTrackingData(event) {
        let target = event.domEvent.target;
    
        if ( target.attributes['stopTrack'] ) return;
        target.attributes['stopTrack'] = Date.now();
    
        //let trackValue = 343; // Take it from some target.attritues
        //let type = 'apple'; // Take it from some target.attritues
        reportingService.sendReport({}, 'ClickReport', 'The value is: ' + trackValue + ' of ' + type);
    }
    
    fruitLinks.onDOMEvent('click', sendTrackingData);
    

    【讨论】:

    • 嘿@farvilain - 谢谢!想了解您为什么使用 Date.now?还有,['stopTrack'] - 我猜你的意思是 aria-control 属性对吧?
    • stopTrack 只是我选择的一个名称,以了解是否必须跟踪链接。使用你想要的,但要确保它是一个专用属性,不会分配给代码中的其他地方。 Date.now 只是我做的事情,而不是真/假...如果你愿意,用“真”替换它
    猜你喜欢
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2015-12-22
    • 2010-09-10
    • 2015-04-24
    相关资源
    最近更新 更多