函数内部的AJAX响应缓存/ onclick事件

时间:2015-05-28 06:05:06

标签: javascript php jquery ajax caching

我使用AJAX执行一些服务器端操作并刷新页面内的表而不重新加载页面本身。在第一次观看时一切正常。但我在PHP中编写了一个函数来发送电子邮件并通过AJAX执行它。当我第二次启动此操作时,会触发旧响应。

究竟发生了什么:

  • 我点击按钮执行“Sendmail-Action”
  • 模态询问我是否要执行操作并单击是
  • 执行PHP脚本并发送电子邮件
  • 在PHP脚本完成后(~2s)
  • ,Modal将关闭
  • 表格(包含电子邮件等)会刷新并更新状态

接下来会发生什么:

  • 我点击一个按钮来执行相同的“Sendmail-Action” 或我表中的其他条目
  • 模态询问我是否要执行操作并单击是
  • 事件触发两次/ 4xAjax-Request而不是2(我可以在我的Chrome控制台中看到它)
  • 模态关闭,2个邮件发送

我试图摆脱这种行为:

  • 用JSHint检查了我的JS
  • 检查了我的PHP代码(apache error.log中没有错误)
  • 重新设计了PHP-Script(Sendmail),现在AJAX执行了一个函数
  • 尝试了不同的浏览器
  • 停用AJAX-Caching
  • 使用Apache完全停用缓存(正确的标题)
  • 在我的php.ini中停用会话缓存(我不使用会话)
  • 取消设置PHP中的所有变量
  • 清除了所有浏览器的缓存
  • 检查了所有标题
  • 搜索了几个小时的解决方案

有关我的设置的更多信息:

  • jQuery 2.1.4
  • php 5.4
  • Apache 2.2

我无法找到问题的解决方案,也许这是因为我将内容动态添加到表中。我过去遇到了同样的问题,我认为Modal(也是动态的)会触发两次点击“Yes-Button”。

1 个答案:

答案 0 :(得分:2)

您可以将ajax点击处理程序放在该函数之外:

$(document).on('click', '.email-resend, .email-send, .show-doc, .show-acc, .more-acc, .no, .yes, .termin', function(){
    $.fn.doAction(classname, comEntry);
}); 

正如您所提到的那样,您已将此功能放入该功能中。相反,你应该把它放在它之外:

$(document).on('click', '.bt-ok', function(){
   $.ajax({
     ....
   });
});

编辑@pandora:或者只使用第二个函数(在我的例子中),如下所示:

$(document).on('click', '.bt-ok', function(){
    $.fn.sendRequest($('#modal').attr('data-1'), $('#modal').attr('data-2'));
});

然后我可以像这样调用函数并执行AJAX:

$.fn.sendRequest = function(data1, data2) {
    $.ajax({
        url: 'target.php',
        cache: false,
        data: { gimme1 : data1, gimme2 : data2 },
        success: function(response) {
            // Show Error
            if(response.length > 0){
                alert(response);
            }

            // Reload Content
            $.fn.Reload('','');

            // Close Modal
            $('#modal').css({'display' : 'none'});
        }
    });
};