Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数内部的AJAX响应缓存/onclick事件_Javascript_Php_Jquery_Ajax_Caching - Fatal编程技术网

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

Javascript 函数内部的AJAX响应缓存/onclick事件,javascript,php,jquery,ajax,caching,Javascript,Php,Jquery,Ajax,Caching,我使用AJAX执行一些服务器端操作,并刷新页面内的表,而无需重新加载页面本身。乍一看,一切都很好。但我用PHP编写了一个函数来发送电子邮件并通过AJAX执行。当我第二次启动此操作时,会触发旧的响应 到底发生了什么: 我正在点击一个按钮来执行“Sendmail操作” 模态询问我是否要执行该操作,我单击“是” 执行一个PHP脚本并发送电子邮件 PHP脚本完成后(~2s)模式关闭 该表(包含电子邮件等)将被刷新并更新状态 接下来会发生什么: 我点击一个按钮来执行“Sendmail操作”相同 或我

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

到底发生了什么:

  • 我正在点击一个按钮来执行“Sendmail操作”
  • 模态询问我是否要执行该操作,我单击“是”
  • 执行一个PHP脚本并发送电子邮件
  • PHP脚本完成后(~2s)模式关闭
  • 该表(包含电子邮件等)将被刷新并更新状态
接下来会发生什么:

  • 我点击一个按钮来执行“Sendmail操作”相同 或我表格中的其他条目
  • 模态询问我是否要执行该操作,我单击“是”
  • 该事件触发两次/4xAjax请求,而不是2次(我可以在Chrome控制台中看到)
  • 模式关闭,发送2封邮件
我试图摆脱这种行为:

  • 用JSHint检查我的JS
  • 检查我的PHP代码(apacheerror.log中没有错误)
  • 重新设计了PHP脚本(Sendmail),现在AJAX执行一个函数
  • 尝试了不同的浏览器
  • 停用的AJAX缓存
  • 使用Apache完全停用缓存(正确的头)
  • 在我的php.ini中停用会话缓存(我不使用会话)
  • 在PHP中取消设置所有变量
  • 已清除所有浏览器的缓存
  • 检查所有标题
  • 花了几个小时寻找解决办法
有关我的设置的详细信息:

  • jQuery 2.1.4
  • PHP5.4
  • Apache2.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'});
        }
    });
};

如何绑定单击事件以发送电子邮件?如果您在函数中执行了此操作,则每次调用该函数时,它都会注册一个新事件并将其加倍。@Jai正在执行文档中的操作,准备这样打开模式(缩写)
$(文档)。on('click',')。email resend、.email send、.show doc、.show acc、.more acc、.no、.yes、.term',function(){$.fn.doAction(classname,comEntry);});
然后在函数中执行类似于
$(document)的操作({
。那么我如何删除该函数的旧事件呢?嗯,我猜对了…!你可以把它放在该函数之外。在你有ajax调用的地方。听起来不错。我会尝试你的建议,如果可行(或不可行)就回来。用我的示例扩展你的答案,希望这能帮助所有有相同问题的人。