Javascript表单:仅更改字段

时间:2012-10-28 11:53:40

标签: javascript

我有一个带有表单的php网站,我通过php输出预选值。在表单提交上,我想检查哪些值已更改,只需通过javascript提交。

这些是我从php传递的预选值。保持关联数组结构非常重要。

var pbData = jQuery.parseJSON("{
"GameMode":"DEATHMATCH",
"Current Map":"VEGAS JUNKYARD",
"Current Missions":["VEGAS JUNKYARD","VILLA","PRESIDIO","KILL HOUSE","MURDERTOWN","CQB TRAINING","STREETS","THREE KINGDOMS CASINO","IMPORT\/EXPORT;"],
"RoundDuration":"3 minutes"}");

我在代码中标记了错误。

<script>
function displayVars(){
var form = document.getElementById('settings');
var elems = form.elements;
var txt = "";
for (var index = 0; index < elems.length; index++){
    var selIndex = elems[index].selectedIndex;
    if (typeof selIndex !== "undefined"){
        //the Index Name in the json-object and the name of the form-field are the same 
        var idxName = elems[index].name;
//HERE is the problem. I want to access the subobject via a variablename, so i can iterate through it, but that doesnt work.
        console.log ("pbData default = "+pbData.idxName); //always undefined
        if (elems[index].value !== pbData.idx_name){
            //building a POST-Url
            txt = txt + elems[index].name + "=" + elems[index].options[selIndex].value+"&";
        }
    }
}
console.log (txt);
return false;
}
</script>

我知道我可以用jQuery做到这一点。在我的情况下,因为我在任何情况下都将预选值作为php变量,我认为这样更容易。 我真的想知道如何通过包含对象名称的变量遍历子对象。

2 个答案:

答案 0 :(得分:1)

在Javascript中,您可以保留具有初始值的对象或数组,并仅发布那些已更改的值。

但事实上,我会做类似的事情,但在PHP中。您可以将原始值保留在会话中,并将发布的值与这些初始值进行比较,以查看更改的内容。这样,你就不会依赖Javascript了。不仅可以禁用Javascript,而且快速用户理论上可以在Javascript运行之前发布表单。将此检查移至PHP可以消除这种风险。

答案 1 :(得分:1)

这是由于你试图访问(JSON)对象的属性。考虑

var o1 = {idxName: true},
    o2 = {foo : 'bar'},
    idxName = 'foo';

o1.idxName;  // true
o2.idxName;  // undefined
o2[idxName]; // 'bar'

您需要通过pbData[idxName]访问该媒体资源。


此外,您没有在JSON字符串中转义引号,并且需要按如下方式转义换行符

var pbData = jQuery.parseJSON("{\
\"GameMode\":\"DEATHMATCH\",\
\"Current Map\":\"VEGAS JUNKYARD\",\
\"Current Missions\":[\"VEGAS JUNKYARD\",\"VILLA\",\"PRESIDIO\",\"KILL HOUSE\",\"MURDERTOWN\",\"CQB TRAINING\",\"STREETS\",\"THREE KINGDOMS CASINO\",\"IMPORT\/EXPORT;\"],\
\"RoundDuration\":\"3 minutes\"}");