2015-02-11 56 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」隱藏