【问题标题】:AJAX, Laravel 4.2 - POST status cancelled, how to post to routeAJAX,Laravel 4.2 - POST 状态已取消,如何发布到路由
【发布时间】:2015-02-22 12:26:03
【问题描述】:

我一直在为这个问题绞尽脑汁。我有一个 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 旨在将 AJAX 发布到 ajaxtest url。

    <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

【问题讨论】:

    标签: php jquery ajax http laravel


    【解决方案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 中等待。它可能对用户不友好。

    【讨论】:

    • 好吧,它有点工作,我现在有一个 405 状态(方法不允许),尽管在路线上我已将其指定为 POST,对此真的很困惑。
    • @MatthewUnderwood 您要卸载到同一个域吗?例如你在http://sth.com/...。卸载后您是留在同一个域http://sth.com/... 还是移动到另一个http://newsth.com/...
    • 我正在卸载到同一个域。
    猜你喜欢
    • 2013-10-31
    • 2015-08-03
    • 2015-06-11
    • 2018-11-25
    • 1970-01-01
    • 2019-02-11
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多