我阅读了关于一个类似问题的建议,并遵循了它。我将一个值从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中得到响应。如果我把它藏起来,它就不会得到回应。
我注意到两件事:
- 您的
<input type="hidden" id="hiddenbio" name="oldbio">
没有value
属性 - 使用这行
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);
}