【问题标题】:Ajax & Jquery form submissionAjax & Jquery 表单提交
【发布时间】:2012-07-19 22:00:03
【问题描述】:

我正要用这个把头发从头上拔下来。

我确定问题很简单,我是 Jquery 的 Ajax 新手,我只是忽略了一些东西。但是,这很烦人。每次提交表单时,页面都会刷新,.ajax 会抛出 error:。这可能是什么原因造成的?我知道我肯定会将我的表单值传递给 Jquery。 newcomment.php 正在工作。我可以向它发布常规表单,但不能使用 jquery。

function postPhotoComment() {

    var comment = $("#comment").val();
    var album = $("#album").val();
    var photo = $("#photo").val();
    var dataString = "comment="+comment+"&album="+album+"&photo="+photo;

    $.ajax({
        type: "POST",
        url: "/includes/actions/photo-gallery/newcomment.php",
        data: dataString,
        success: function(res) {
            alert("Posted!");
        }
            error: function(res) {
            alert("Error!");
        }
    })  
}

编辑:这是我的 html 表单:

<form>
    <textarea id="comment" placeholder="Post Comment..."></textarea>
    <input id="album" type="hidden" value="<?php echo "$a"?>"/>
    <input id="photo" type="hidden" value="<?php echo "$p.$ext"?>"/><br/>
    <button id="photo-comment-submit" onclick="postPhotoComment()">Post</button>
</form>

我还注意到,如果我提供输入 names,Chrome 会将它们像 GET 变量一样放入 url 栏中。每次页面刷新后,它都会在 url 的末尾添加?。因此,它似乎在尝试定期提交表单。

【问题讨论】:

  • 您是如何触发 ajax 调用的,以及错误响应中的内容(尝试使用 console.log(res) 并检查控制台?
  • 显示运行 postPhotoComment() 函数的代码。以常规方式提交表单会刷新页面,除非您阻止了提交函数的默认操作,否则您可能会以常规方式和 ajax 提交表单,从而导致页面刷新。
  • @Tyrsius postPhotoComment() 只需通过 onclick="" 触发。
  • @RyanSmith 然后正如其他人所说,您的表单仍将尝试执行提交非 ajax 样式的默认操作。你需要从你的函数中返回 false,或者 preventDefault
  • @Tyrsius 这绝对是在执行默认操作,但即使返回 false 和 preventDefault,我仍然得到相同的结果。

标签: php jquery ajax forms


【解决方案1】:

您是否返回 false 以停止浏览器的默认操作?

$('form').submit(function(){
    var dataString = $(this).serialize(); // shortcut

    $.ajax({
        type: "POST",
        url: "/includes/actions/photo-gallery/newcomment.php",
        data: dataString,
        success: function(res) {
            alert("Posted!");
        }
        error: function(res) {
             alert("Error!");
        }
    });

  return false;// cancels the default action
});

【讨论】:

  • 错误回调被触发,因为当浏览器开始离开页面(提交表单)时,它会取消任何未完成的 XHR 请求。请求的取消被 jQuery 视为错误,因此触发错误处理程序。
【解决方案2】:

如果您调用 AJAX 表单提交代码的函数是表单的 onSubmit 方法,则您需要停止默认操作的发生——也就是说,您要停止正常提交。

为此,请使用event 对象的preventDefault 方法:

function postPhotoComment(evnt) {
    evnt.preventDefault();

    // existing code continues...

}

您也可以从您的事件中返回false,但请注意,这样做在不同的浏览器中会产生不同的效果,而且它不如直接调用preventDefaultstopPropagation 那样明确或可靠。

编辑 此外,错误处理程序可能会被调用,因为您的代码启动了 XHR 请求,但是当浏览器启动默认操作(提交表单)时,它会取消任何未决的 XHR 请求。这导致错误处理程序被触发。

编辑 2 我创建了一个带有工作演示的 jsFiddle:http://jsfiddle.net/wXrAU/

文档

【讨论】:

  • 这绝对是在执行默认操作,但即使返回 false 和 preventDefault,我仍然得到相同的结果。
  • @RyanSmith 你能设置一个 jsFiddle 以便我们看到它被复制吗? jsfiddle.net
  • post 部分并不重要,它是我感兴趣的 javascript。不过,如果你将事件绑定到提交按钮的 onclick,你应该尝试将其放在表单的 onsubmit 事件上。
【解决方案3】:

提交时请确保您return false;到表单,否则它仍然会作为“正常”表单提交而不使用Ajax并重新加载页面。

编辑:阅读 cmets 后,我认为这对您最合适: &lt;form action="url.php" onsubmit="return false;"&gt;&lt;/form&gt;

jsFiddle 使用适当的代码:http://jsfiddle.net/SO_AMK/ZVgNv/

PHP 有点搞砸了,但它可以工作。

【讨论】:

  • 我认为这是放置退货的错误位置。 Aron.Duby 有更好的解决方案。
【解决方案4】:

我实际上是通过删除&lt;form&gt; 标签来解决这个问题的。反正我不需要它们。但现在一切似乎都正常了。

【讨论】:

  • 我明白了。删除表单标签是一种可能的方法,因为您已经消除了在没有 javascript 的情况下提交表单的可能性。有效,但不符合渐进增强。这可能无关紧要(该功能取决于javascript),但我建议您至少为自己的信息寻求实际问题。再次检查一下:jsfiddle.net/wXrAU
【解决方案5】:

确保您编写了一个有效的、可通过 HTTP 访问的 url,而不仅仅是脚本的路径,例如

function postPhotoComment() {

    var comment = $("#comment").val();
    var album = $("#album").val();
    var photo = $("#photo").val();
    var dataString = "comment="+comment+"&album="+album+"&photo="+photo;

    $.ajax({
        type: "POST",
        url: "http://yoursite.com/whatever/newcomment.php", // here
        data: dataString,
        success: function(res) {
            alert("Posted!");
        }
            error: function(res) {
            alert("Error!");
        }
    })  
}

因为 JavaScript 是一种客户端语言。它对您的文件系统结构或任何类似的东西一无所知。 AJAX 请求是基于 HTTP 协议的。

【讨论】:

  • @Tyrsius 但谁知道所说的可以访问?
  • 即使它不可访问,相对而不是绝对的 URL 也不是问题。你的答案是完全错误的。
  • @Tyrsius 我已经在任何 cmets 之前修复了它,所以这里没有关于绝对/相对路径的内容。
  • 老兄,即使是现在,它仍然指出 url 是问题所在。我建议你删除这个。
  • @Tyrsius 没有。任何可能的原因仍然是一个原因。
猜你喜欢
  • 2021-09-30
  • 2011-04-23
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多