Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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发送POST两次,从PHP接收两次/重复的结果_Javascript_Php_Ajax_Json - Fatal编程技术网

Javascript ajax发送POST两次,从PHP接收两次/重复的结果

Javascript ajax发送POST两次,从PHP接收两次/重复的结果,javascript,php,ajax,json,Javascript,Php,Ajax,Json,我发现我的JS向我的PHP文件发送了两次POST方法,这就是为什么我不断从我的PHP中获得双重/重复的结果 此JS事件将在.keyup()时执行ajax $(document).ready(function() { var getUrl = $('#url'); var youtube = regex here var web = regex here getUrl.keyup(function() { if (

我发现我的JS向我的PHP文件发送了两次POST方法,这就是为什么我不断从我的PHP中获得双重/重复的结果

此JS事件将在
.keyup()
时执行ajax

    $(document).ready(function() {  
    var getUrl = $('#url');
    var youtube = regex here
    var web = regex here    

        getUrl.keyup(function() {

        if  (youtube.test(getUrl.val())) {
        var youtube_url = getUrl.val().match(youtube)[0];
        $.ajax ({
                type:"POST",
            url:"getyoutube.php",
            data: {youtube_url:youtube_url},
            success: function(html) { $('.echotest').append(html); }
        }); }

    else if (web.test(getUrl.val())) {
        var extracted_url = getUrl.val().match(web)[0];                 
                    $.post("curl_fetch.php?url="+ extracted_url, {
                }, function(response){
           $('#loader').html($(response).fadeIn('slow'));
           $('#cur_image').val(1);
        });} 
    }); 
}); 
数据将由
getyoutube.php
接收,并且只打印一次特定youtube视频的json结果

 //some code ommitted
 $youtube ="https://gdata.youtube.com/feeds/api/videos/'.$matches[0].'?v=2&alt=jsonc";
 $curl = curl_init($youtube);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
 $return = curl_exec($curl);
 curl_close($curl);
 $test = json_decode($return, true);
 print_r($test);

我似乎不明白为什么我的AJAX帖子总是两次发送帖子,有两件事需要尝试:

1) 确保绑定和解除绑定密钥更新事件

2) 使用全局变量确保一次只发送一个ajax请求

i、 e:

var ajaxrequest = false; //GLOBAL

function getyoutubedata(){

  if(ajaxrequest != false){
     return;  
  }

  ajaxrequest = $.ajax ({
        type:"POST",
        url:"./includes/getyoutube.php",
        data: {youtube_url:youtube_url},
        success: function(html) { $('.echotest').append(html); ajaxrequest = false; }
  });

}
注意YouTube API支持JSONP回调,因此您可能想考虑通过

来做这件事。
3) 在调用上述函数之前,请尝试检查输入字段的内容是否已更改

您应该向我们显示带有
.keyup()
事件的代码,这可能是发生错误的地方。事件处理程序可以为ajax执行包装函数,而不是直接执行ajax。例如,如果触发了keyup事件,请尝试检查输入内容是否已更改。如果是的话,运行ajax,如果不是的话-什么都不做。

掩盖了这一点

 $.ajax ({
       type:"POST",
       url:"getyoutube.php",
       data: {youtube_url:youtube_url},
       success: function(html) { $('.echotest').append(html); }
        }); }   
对这个

$.post("./includes/getyoutube.php?url="+ youtube_url, {
    }, function(response){
    $('.echotest').append(response);
    });

POST方法现在只执行一次。虽然我无法从技术上解释它为什么有效

确保您不定期按多个键…甚至没有理由使用PHP脚本。YouTube的API接受JSONP回调。我也面临这个问题。但我的只是镀铬的。在FF中,opera仅支持单个请求。找不到任何解决方案,所以我改变了整个设计-_-实际上,还要注意的是,像“tab”和“ctrl”等键都是alzo键,即使它们不会直接更改某些内容。