Javascript发布到表单-won';如果字段是隐藏的,则不起作用


Javascript posting to form - won't work if field is hidden

我阅读了关于一个类似问题的建议,并遵循了它。我将一个值从javascript发布到一个表单,以传递给PHP。问题是,如果我将值传递给一个文本区域字段,而不是一个隐藏字段,那么一切都会很完美。

HTML

<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js" ></script>
<script src="updatepage.js"></script>
<head>
<body onload="loadbio()">
<form action="http://localhost/restricted/update.php" method="POST">
<input type="hidden" id="hiddenbio" name="oldbio">      <!-- Hidden to pass to PHP  -->
Biography: <br /><textarea id="bio" rows="8" cols="60" name="newbio"></textarea>
<br /><br />
<input type="submit" value="Submit"> 
</form>
</body>
</html> 

JS-

function loadbio () {
$("#bio").load('randomperson.html #biobox p') 
setTimeout (function () {
    var biotopass = $("#bio").val();
    $.post("biochange.html", { oldbio: biotopass });
    }, 200);
}

PHP

<html>
<body>
Old Bio: <?php echo $_POST["oldbio"]; ?><br />
New Bio: <?php echo $_POST["newbio"]; ?><br />
</body>
</html> 

因此loadbio()会从文件中取出旧的传记并将其发布到biochange.html。html会在用户更改传记的文本区域中显示旧传记。
这就是问题所在,我需要在旧值更改之前存储它的值。如果我将隐藏的输入更改为文本区域,它将在PHP中得到响应。如果我把它藏起来,它就不会得到回应。

我注意到两件事:

  1. 您的<input type="hidden" id="hiddenbio" name="oldbio">没有value属性
  2. 使用这行var biotopass = $("#bio").val();,您实际上只是获取新的个人简历并将其发送到服务器,而忽略旧的个人简历

所以你没有发送任何东西,即使你发送了,也不会有任何东西可以发送。所以,一旦你给你的隐藏输入一个值,你所需要做的就是发送它。实际上,有一个巧妙的技巧可以发送表单的所有元素(因此,如果您更改HTML,并且它自动类似于表单的正常发送方式,则不必更新JS),将AJAX调用更改为:

$.ajax({
    type: "POST",
    url: "biochange.html",
    data: $(form).serialize()
})

问题是.load将数据加载到元素的.innerHTML中。对于<textarea>元素,.innerHTML是以表单形式提交的数据,其中作为<input>value属性是以表单方式提交的数据。

这就解释了为什么它能用<textarea>而不能用<input>

要修复此问题,请使用.get而不是.load:

$.get("randomperson.html #biobox p", function(x){
  $("#oldbio, #newbio").val(x);
});

您的"#oldbio"隐藏在何处

您没有发布newbio。在行中:

$.post("biochange.html", { oldbio: biotopass });
}, 200);

您指定您只想发布oldbio。只需将其调整为这样的内容:

function loadbio () {
    $("#bio").load('randomperson.html #biobox p') 
    setTimeout (function () {
        var biotopass = $("#bio").val();
        var hiddenbio = $("#hiddenbio").val();
        $.post("biochange.html", { oldbio: hiddenbio, newbio: biotopass });
        }, 200);
}