我正在处理一些遗留的HTML / JavaScript。其中一些我可以控制,其中一些是从我无法控制的地方生成的。
动态生成的表单包含隐藏字段。表单本身通过Velocity模板(Percussion Rhythmyx CMS)生成,JavaScript插入其他隐藏的表单字段。最终结果是使用相同“name”属性生成的隐藏表单字段。数据正在POST到Java / JSP服务器端代码,我对此知之甚少。
我知道共享相同“name”属性的表单字段是有效的。由于某种原因,POSTed数据未被识别为后端。 当我检查POST字符串时,相同名称键都不包含数据。
如果我在开发环境中操作代码,使得给定名称只存在一个输入字段,则数据会正确地发布到后端。这个问题并不一致,有时,它的工作正常。
我能做些什么来保证数据会被张贴?任何人都可以想到它不会出现的原因吗?
I should really update my answer and post code here, because POST requests without
variable strings indicates the problem is on the client side.
答案 0 :(得分:1)
这个怎么样:
<script type="text/JavaScript">
function disableBlankValues()
{
var elements = document.getElementById("form1").elements;
for (var i = 0; i < elements.length; i++)
{
if (elements[i].value == "")
elements[i].disabled = true;
}
}
</script>
<form action="page.php" method="POST" onsubmit="disableBlankValues()" id="form1">
<input type="hidden" name="field1" value="This is field 1."/>
<input type="hidden" name="field1" value=""/>
</form>
<小时/> 的修改
我现在意识到实际问题(具有相同名称的多个变量应该作为数组传递给JSP)并且我的解决方案可能不是OP正在寻找的,但是我将它留在这里以防它发生帮助那些偶然发现这篇文章的人。
答案 1 :(得分:0)
你可以使用类似的东西:
var form = document.getElementById('yourformid');
var elements = form.getElementsByName('repeatedName');
var count = 0;
for(var item in elements){
elements[item].name += count++;
}
通过这种方式,您将获得每个隐藏字段的名称:
name0
name1
name2
...
答案 2 :(得分:0)
我制定了一个强力解决方案。请注意,我很清楚这是一个黑客攻击。但是我不得不解决我无法控制的其他代码。
基本上,我已经创建了一个ONSUBMIT处理程序,它检查重复隐藏字段的表单,并确保它们都填充了正确的数据。这似乎保证POST字符串包含数据,无论表单如何呈现,Java后端似乎也对它感到满意。
我在以下情况下对此进行了测试:
我的'其他'条件包含一点点MooTools魔法,但它本来就是直接的东西。
也许别人会发现这一天有用......
感谢您的帮助!
<form method="post" name="loginform" id="loginform" action="/login" onsubmit="buildDeviceFP(this);">
<script type="text/javascript">
function insertFieldValues( fields, sValue )
{
if ( 'length' in fields )
{
// We got a collection of form fields
for ( var x = 0; x < fields.length; x++ ) {
fields[x].value = sValue;
}
}
else
{
// We got a single form field
fields.value = sValue;
}
}
function buildDeviceFP( oForm )
{
// Get the element collections for Device Fingerprint & Language input fields from the form.
var devicePrintElmts = oForm.elements.deviceprint;
var languageElmts = oForm.elements.language;
// 'devicePrintElmts' & 'languageElmts' *should* always exist. But just in case they don't...
if ( devicePrintElmts) {
insertFieldValues( devicePrintElmts, getFingerprint() );
} else if ( oForm.deviceprint ) {
oForm.deviceprint.value = getFingerprint();
} else {
$('logonbox').adopt(
new Element( 'input', {'type':'hidden', 'name':'deviceprint', 'value':getFingerprint()} )
);
}
if ( languageElmts) {
insertFieldValues( languageElmts, getLanguage() );
} else if ( oForm.language ) {
oForm.language.value = getLanguage();
} else {
$('logonbox').adopt(
new Element( 'input', {'type':'hidden', 'name':'language', 'value':getLanguage()} )
);
}
}
</script>