0

我有两个文件,landing.php 和 test.php。Landing.php 有一个通过 ajax 使用 post 方法提交到 test.php 的表单。如果 ajax 调用成功,浏览器会加载 test.php,此时我遇到了问题。在尝试显示发送到 test.php 的发布数据的值时,我无法弄清楚我做错了什么。

以下是来自landing.php 的ajax 调用。通过查看 Firebug 中的帖子数据,我有理由确定这可以正常工作。

$('#searchForm').submit(function(e) {
    e.preventDefault();
    var data1 = $('#checkBoxDiv input').serialize() + '&' + 'barcodeID=' + $('#barcodeID').val();
    $.ajax({
        url: 'test.php',
        data: data1,
        type: 'POST',
        success: function() {
            window.location.href = "test.php";
        }
    });  
});  

下面是test.php 的内容。

<?php

$bar = $_POST['barcodeID'];

echo "<html>";
echo "<body>";
echo "<p>*" . $bar . "*</p>";
echo "</body>";
echo "</html>";
?>

如果我不使用<p>from test.php 中的星号,当我在浏览器中到达 test.php 时,我会看到一个完全空白的屏幕。然而,有了它们,我的屏幕上会出现“**”。然而,最令人困惑的部分是,如果我包括

echo $bar;

在 test.php 中,我$bar在发布数据查看器的 Firebug 响应选项卡中看到了(00-00102 - 完全符合它的值)的值。

经过一番研究,我读到那篇文章是您不想在 URL 栏中显示查询字符串时的首选方法,以及当您有大量数据要发送时使用的方法(这将是对我来说,当一切都说完后,它最终会变成大约五到六百个字符)。我查看了其他 stackoverflow 帖子和文章,试图复制推荐的内容,但仍然无法做到这一点。

我是在做完全错误的事情还是试图以不打算使用它们的方式使用这些方法?

4

5 回答 5

2

不要在 ajax 调用成功时更改窗口位置。该电话正在将数据发布到test.php您那里,您将收到回复。然后,您将重定向到带有空白帖子的页面,这只会导致星号。

如果您只想显示 test.php 的结果,请将您的$.ajax调用更改为以下内容:

$.ajax({
    url: 'test.php',
    data: data1,
    type: 'POST',
    success: function(response) {
        $('html').replaceWith(response);
    }
});

或者,如果您确实想更改页面,请忘记 ajax,只需将表单发布到test.php

于 2013-08-13T20:58:51.243 回答
2

AJAX 成功后您正在重新加载窗口,此时没有 POST 信息。

你可以做这样的事情:

$('#searchForm').submit(function(e) {
    e.preventDefault();
    var data1 = $('#checkBoxDiv input').serialize() + '&' + 'barcodeID=' + $('#barcodeID').val();
    $.ajax({
        url: 'test.php', // <-- POST exists during this call
        data: data1,
        type: 'POST',
        dataType: 'html',
        success: function(data) {
            $('html').replaceWith(data);
        }
    });  
});  
于 2013-08-13T20:59:40.583 回答
1

AJAX POST 将在一个回合内完成。这意味着,您通过 ajax 发布到 test.php 的值将仅通过该请求出现。您正在做的是,在收到来自 test.php 的响应后,您将重定向到 test.php。这是一个新的请求,它没有任何POST值。因此,里面什么都没有$_POST['barcodeID'];

此外,在您的代码中,您有两次 $('#barcodeID').val() 。尝试删除最后一个。:

var data1 = $('#checkBoxDiv input').serialize() + '&' + 'barcodeID=' + 
    $('#barcodeID').val();
    $('#barcodeID').val();
于 2013-08-13T21:00:16.550 回答
1

您将变量作为 POST 请求传递给 test.php 文件,这意味着 test.php 文件将获取该数据并对其进行操作。然后在该请求成功完成后,您将重定向到 test.php 而不传递任何变量。

如果您真的想提交一个表单(带有它附带的重定向),请使用 html 执行此操作:

<form action="test.php" method="post">
    <input type="text" name="barcodeID" />
</form>

如果您不需要重定向,请执行其他人的建议并在同一页面上显示输出(someDiv是您希望显示来自 test.php 的响应的 html 元素):

$('#searchForm').submit(function(e) {
    e.preventDefault();
    var data = $('#checkBoxDiv input').serialize() + '&' + 'barcodeID=' + $('#barcodeID').val();

    $.post('test.php', data, function(response) {
        $('someDiv').html(response);
    });
});

如果您必须使用 JavaScript 和重定向执行此操作,请将隐藏的虚拟表单附加到页面并提交:

$('<form action="test.php" method="post">' +
    '<input type="hidden" name="barcodeID" value="123456789" />' +
    '</form>')
    .appendTo('body')
    .submit();
于 2013-08-13T21:27:12.427 回答
1

如果您尝试使用 AJAX 将页面内容替换为表单提交的结果,test.php那么您需要将 AJAX 调用更改landing.php为:

$.ajax({
    url: 'test.php',
    data: data1,
    type: 'POST',
    success: function(response) {
        $('html').replaceWith(response);
    }
});

否则,我建议不要使用 AJAX,只需通过设置表单的 action 属性来使用 HTML 进行常规表单提交:

<form method="post" action="test.php">
于 2013-08-13T21:32:47.710 回答