具有相同“名称”属性的多个表单字段未发布

时间:2012-01-31 14:20:30

标签: javascript html jsp mootools

我正在处理一些遗留的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.

3 个答案:

答案 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后端似乎也对它感到满意。

我在以下情况下对此进行了测试:

  1. 代码生成隐藏字段的单个实例(有时会发生)
  2. 代码生成隐藏字段的多个实例
  3. 代码不会生成隐藏字段的实例(应该永远不会发生,但是嘿......)
  4. 我的'其他'条件包含一点点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>