8

我已经实现了一个基于按钮单击的 ajax 发布功能。代码是

$.ajax({
    type: "POST",
    url: "includes/phpscripts?action=manage",
    data: {location: loc, lat: latitude, lon: longitude, heading: head, filename: file},
    success: function(){
      $("#panoInfo").html("<div id='message'></div>");
      $("#message").html("Valid Submission");
  }
});

我指定了 POST 方法,因为我不希望变量通过 URL 可见。然而,他们是。

我发帖前的测试网址是

http://localhost/JMCTour/buildtour.php

然后

http://localhost/JMCTour/buildtour.php?filename=1-prefix_blended_fused.jpg&location=Start+of+Tour&lat=43.682211&long=-70.450705&heading=100&submit=Save

为什么?

4

3 回答 3

9

确保您的表单标签有method='POST'

<form method='POST'>
...
</form>
于 2013-09-18T23:08:08.180 回答
5

由于问题中缺乏信息,我在这里做了很多假设。

您的表单很可能看起来像这样:

<form>
    <input type="text" name="lon" />
    <input type="text" name="lat" />
    <input type="text" name="heading" />
    <input type="file" name="image" />

    <input type="button" id="submit" value="Submit" />
</form>

我们马上就有问题了,你的文件输入。不能使用 jQuery 的 ajax 方法通过 ajax 发送文件,而不包括在幕后正确处理文件的附加插件或编写代码来提交到隐藏的 iframe 或其他方法(html5?flash?)。

忽略文件输入,这就是您最初的问题所在。

$("#submit").click(function(){
    $.ajax(...);
});

我省略了 ajax 选项,因为它们无关紧要。问题在于,由于表单中的按钮是表单中的最后一个输入并且没有提交按钮,因此它将像提交按钮一样提交表单,除非您阻止该默认操作。如果您不阻止该默认操作,则表单将使用默认类型“GET”提交,因为您没有在表单中设置类型。

要防止点击事件的默认动作,要么返回 false,要么使用event.preventDefault()

$("#submit").click(function(event){
    event.preventDefault();
    $.ajax(...);
});

修复文件输入问题可能已经在其他几个 SO 问题中得到解答。

于 2012-06-06T20:36:54.833 回答
5

来自jQuery.ajax 的文档(强调我的):

数据

要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 GET 请求的 url。请参阅 processData 选项以防止此自动处理。对象必须是键/值对。如果 value 是一个数组,jQuery 会根据传统设置的值(如下所述)序列化具有相同键的多个值。

因此:

processDataBoolean

默认值:真

默认情况下,作为对象(从技术上讲,除了字符串之外的任何内容)传入 data 选项的数据将被处理并转换为查询字符串,适合默认的内容类型“application/x-www-form-urlencoded” . 如果要发送 DOMDocument 或其他未处理的数据,请将此选项设置为 false。

于 2012-06-06T19:47:12.910 回答