AJAX,Laravel 4.2 - POST状态取消,如何发布路由

时间:2015-02-22 12:26:03

标签: php jquery ajax http laravel

我一直在讨论这个问题。我有一个Jquery块,它将一个AJAX帖子发送到网站内的url。当用户重定向远离他们所在的当前页面时,会发生此逻辑。

问题是我在使用Jquery脚本的URL上,我重定向远离页面,然后检查chrome中的开发人员控制台并找到状态为已取消的POST。我检查了我的数据库中的表,它没有插入记录,所以我认为状态意味着它永远不会到达URL。

定义了ajaxtest路由的路径文件

<?php
 Route::post('ajaxtest', array('before' => 'adminFilter', 'uses' =>    'TestsController@ajaxTest'));
?>

Controller中涉及的方法

  <?php
   public function ajaxTest() {
   DB::table('test_ajax')->insert(
            array('test_string' => 'TestTest')
        );
   if (Request::isJson())  {
        $name = Input::get('name');
        $age = Input::get('age');
        DB::table('test_ajax')->insert(
            array('test_string' => $name.'|'.$age)
        );
    } else {
        DB::table('test_ajax')->insert(
            array('test_string' => $name.'|'.$age)
        );
    }
}
?>

如果用户重定向远离当前页面,则涉及的Jquery旨在向ajaxtest url发布AJAX帖子。

    <script type="text/javascript">
     console.log("Host url" + window.location.host);
     var formFlag = false;

    $("#submitTest").click(function() {
     formFlag = true;
    });
    window.onbeforeunload = function(){
    if(!formFlag){
        return "Your changes may not be saved.";
    }
}
$( window ).unload(function() {
    $.post("<?php echo Request::root(); ?>/ajaxtest/", { name: "John", age: "26" });
});
</script>

开发者控制台上的请求信息,状态为已取消。

Request URL:http://192.168.0.9/ajaxtest/
Request Headers
Provisional headers are shown
Accept:*/*
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Origin:http://192.168.0.9
Referer:http://192.168.0.9/tests/question
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
X-Requested-With:XMLHttpRequest
Form Dataview sourceview URL encoded
name:John
age:26

1 个答案:

答案 0 :(得分:1)

由于$.post是异步方法,$( window ).unload(..)不等待执行它并取消它。尝试更改此

$( window ).unload(function() {
    $.post("<?php echo Request::root(); ?>/ajaxtest/", { name: "John", age: "26" });
});

对此:

$( window ).unload(function() {
    $.ajax({
        type: 'POST',
        url: '<?php echo Request::root(); ?>/ajaxtest/',
        data: { name: "John", age: "26" },
        async: false
    });
});

它像同步方法一样调用POST,因此浏览器应该等到它结束然后卸载。 但这并不是建议等待unload中的某些事情。它可能不是用户友好的。