我有一个愚蠢的问题。
根据 div 的可见性,我想设置一个隐藏值
if($('#crewMember').is(':visible')) {
$('#visibility').attr('value', 'hidden')
} else {
$('#visibility').attr('value', 'visible')
}
这有效。我已经通过 FireBug 检查过,可以看到 HTML 已更改。
但是当我在表单提交后尝试获取此值时,我得到的是原始值,而不是更改后的值。
echo $_POST['visibility']
//returns default value, not the adjusted valueHow come?
怎么会这样?
编辑 一些示例代码
<html>
<script type="text/javascript">
$(document).ready(function() {
$('#div').click(function() {
$('#visibility').val('hidden');
$('#value').html('hidden value: ' + $('#visibility').val());
});
$('#value').html('hidden value: ' + $('#visibility').val());
});
<body>
<form method="post">
<div id="div">
click this area to change value
</div>
<div id="value"> <!-- This div will show the actual value of the hidden field -->
</div>
<input type="hidden" id="visibility" name="visibility" value="initial value" />
<input type="submit" name="button" value="button" />
</form>
</body>
</html>
当我提交此表单时,$_POST['visibility'] 始终包含字符串“初始值”。 即使我用 JS 将值更改为“隐藏”;
最佳答案
正如 ManseUK 所说,将 $("").attr('value',...)
更改为 $("").val(...)
(有关 .val,请参阅 jQuery documentation)
但是要回答为什么的问题,您需要了解 DOM 对象在 JavaScript 中的工作原理。对于每个元素(div、p、a、img、form、input、任何...),每个元素都是 DOM 中的一个对象。
这里是重要的部分:元素有一个值,而且每个属性也有一个值。在 jQuery 中,当您使用 .attr('value',...)
时,您真正要做的是创建一个名为“value”的属性。但这不会改变元素值,该值保持不变。
在 firebug 中,它将读取 JavaScript 属性并将其分层在元素之上,这解释了为什么它在 firebug 中以这种方式显示。但是,当将数据提交到服务器时,浏览器将不会提交属性值 - 仅提交元素的值(未更改)。但是使用 .val()
将更改 element 值,该值将提交到服务器。
也许这在原始 JavaScript 中比 jQuery 更有意义:
与.attr()
等效的是:element.setAttribute("value","...");
与.val()
等效的是:element.value = "...";
你看出区别了吗?在 .attr()
中,您从未更改过值,只更改了属性。
关于php - JS 改变值,PHP 获取旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9225846/