php - jQuery 事件多次触发

标签 php html jquery css jquery-events

我在 jQuery 事件方面遇到问题。

首先让我解释一下页面的设置:

main-page.php 的组成为:

a) 标题( Logo 所在的位置)

b) 导航栏(其中有各种选择)

c) 动态内容区域(将加载导航栏上单击元素的内容)

d) 页脚

假设导航栏由 | 组成首页 |留言 |关于我们 | ...

HOME的内容是一个单独的PHP文件,带有单独的CSS和JS文件。所有选择都是如此。

一旦我选择 HOME(例如),我就会从动态内容区域中删除所有内容,并使用 AJAX 放置 HOME 的内容。同时,我删除与先前内容关联的所有 CSS/JS 文件,并链接与加载的内容关联的 CSS/JS 文件。这部分工作完美。

现在,如果我从一个选择切换到其他选择(假设从“主页”-->“消息”-->“关于我们”,然后返回“主页”),如果我单击“主页”内的按钮,它将多次触发该事件。如果该事件导致对服务器的 AJAX 调用(想象一下调用服务器 5 次而不是 1 次),情况会更糟。

**我在具有 radio-element 类的元素上使用 on() 事件的原因是因为它是 future 的 DOM 元素。最初该元素不在页面上。

JS代码示例:

$(document).on('click', '.radio-element', function(){

    $.ajax({
        
            url: "js/ajax/ajaxcall.php",
            success: function(output){

                $('#ajaxcall-container').html(output);
    
            }               
    });
        
});

我所做的是,一旦我单击具有 radio-element 类的元素,我就会进入服务器并获取 ajaxcall.php 脚本的输出。

观察 INSPECT ELEMENT 内的 NETWORK 选项卡,我发现单击事件正在多次执行 AJAX 调用。有时是 2 个,有时是 3 个,甚至 5 个。

我做了什么来解决这个问题(没有一个能 100% 工作):

A) 在绑定(bind)事件之前使用“off”取消绑定(bind)事件

$(document).off('click','.radio-element').on('click', '.radio-element', function(){ .... });

B) 使用事件。stopImmediatePropagation()

$(document).on('click', '.radio-element', function(event){ 

     event.stopImmediatePropagation();

     //rest of code

 });

下面是一个我还没有尝试过的解决方案,因为我在一篇文章中读到它不会停止事件绑定(bind)过程,它只会阻止多个事件执行(不知道这是否会导致其他问题)。

$(document).on('click', '.radio-element', function(event){ 

     if(event.handled !== true) 
    {
        //Code goes here
        event.handled = true;
    }

 });

多次事件触发的问题是,有一些 AJAX 调用执行不应多次执行的操作(例如,向客户端发送电子邮件)。

此外,这种行为(多个事件触发)不是我可以预测的。有时它工作得很好,有些时候它会连续触发事件 5 次。

我已经在网上搜索了一个星期了,但我尝试的所有方法都没有解决问题。任何解决方案将不胜感激:)

谢谢!

最佳答案

根据我在这里阅读的内容 - 我猜您多次通过单击绑定(bind)事件引入 js 文件。如果您使用自定义路由或单页应用程序并且不刷新页面,则很可能是基于您所说的。

您可以通过在点击事件(ajax 上方)中添加 console.log 来测试这个理论,然后使用它并检查日志。如果您单击它并且它记录了您多次记录的内容,那么您就知道这就是问题所在。我不认为这是ajax。

关于php - jQuery 事件多次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29799313/

相关文章:

php - 使用 UTF-8 在数据库中存储 HTML/特殊字符

php - 面向过程编程的设计模式和封装?

javascript - 在 .md 文件 : How to add background color to a text? 或将文本放在彩色框中?

html - 在 bootstrap 中定位侧边栏

javascript - 想在打开另一个 div 时关闭一个 div

php - 安装 XAMPP 时如何在 UAC 上工作

php - 将 JavaScript 变量发送到 PHP 变量

javascript - 如何识别jquery中保存的浏览器用户名和密码

jQuery 输入掩码的小时和分钟

javascript - 如何在 jquery 中制作 ul 和 li 的框图?