2015-02-11 21 views
1

我阅读了关于类似问题的建议,我跟着它。我从JavaScript发布一个值到要传递给PHP的表单。如果我将该值传递给textarea字段,但不是隐藏字段,则此功能完全正常。Javascript张贴到表单 - 如果字段被隐藏将无法工作

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在文本区域中显示旧的传记,其中人员改变它。
这是问题出在哪里,我需要在更改之前存储旧值的值。如果我将隐藏的输入更改为textarea,它将在PHP中得到回显。如果我将它隐藏起来,它不会得到回应。

+0

这听起来像你对我说的:“我想储存一些信息,而不是显示它”。那么为什么不把它存储在JS?另外还有一个错误,如果你的服务器需要超过200ms才能返回“加载”请求,那么“#bio”仍然是空的,为什么不在“加载”函数回调中设置超时以确保不会发生这种错误。 – 2015-02-11 15:53:40

回答

-1

您尚未发布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); 
} 
+0

只是好奇,为什么我需要传递两个表单的值,如果这个人只是要改变它的形式?这是一个AJAX的东西或形式的东西? – SaintCad 2015-02-11 15:52:58

+0

是啊所以隐藏的生物是旧的,生物传递是新的,因此'oldbio:hiddenbio,newbio:biotopass' – Adunahay 2015-02-11 15:54:09

+1

@SaintCad我不明白你的意见。我以为那正是你想要的?现在我很困惑,你能详细说明一下吗? – mmgross 2015-02-11 16:01:08

0

两件事情我已经注意到:

  1. <input type="hidden" id="hiddenbio" name="oldbio">没有value属性。
  2. 这一行var biotopass = $("#bio").val();你实际上只是抓住了新的生物,而你忽略的老生物

将其发送到服务器,这样你你不发送任何数据,即使你做了也不会有任何发送。所以,一旦你给隐藏的输入一个值,你所需要做的就是发送它。实际上发送一个表单的所有元素(所以你不必更新你的JS,如果你改变你的HTML,并且它自动类似于表单被正常发送的方式),将AJAX调用更改为:

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

第2行工作完美。不需要AJAX。谢谢! – SaintCad 2015-02-11 16:09:42

+0

请向我解释一下''var biotopass = $(“#bio”)。val();''正在向服务器发送任何东西?大声笑,只是从输入获取值,并存储在一个JS变量。 – 2015-02-11 16:20:24

+0

@SaintCad否需要AJAX?您已经在使用AJAX:'$ .post(“biochange.html”,{oldbio:biotopass});'这是一个AJAX调用。 – mmgross 2015-02-11 16:26:09

0

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

因此,这解释了为什么它与<textarea>但不是<input>

为了解决这个问题使用.get,而不是.load

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

你在哪里“#oldbio”隐藏