【问题标题】:Why can't jQuery update array data before ajax post?为什么 jQuery 不能在 ajax 发布之前更新数组数据?
【发布时间】:2013-07-14 22:56:44
【问题描述】:

我正在尝试创建一个数组并获取表单提交的所有值并将它们放入该数组中。我需要这样做,因为在此代码的 .each 函数期间,我必须对每个客户端的所有值进行额外的加密。这是一个包含数百个正在变化的字段的表单。所以它必须是一个数组才能工作。我尝试在 jQuery 中执行以下操作和其他几种类似的类型,但没有骰子。任何人都可以帮忙吗?谢谢。

编辑:发布我的工作解决方案。谢谢您的帮助。 编辑 2:接受 sabithpocker 的回答,因为它允许我保留我的键名。

【问题讨论】:

  • 最好不要将 jsfiddle 链接留在评论中,而是将其发布在问题正文中。

标签: javascript jquery ajax arrays


【解决方案1】:
var inputArray = {};

//jQuery(this).serializeArray() = [{name: "field1", value:"val1"}, {name:field2...}...]

jQuery(this).serializeArray().each(function(index, value) {
    inputArray[value.name] = encrypt(value.value);
});

//now inputArray = [{name: "field1", value:"ENCRYPTED_val1"}, {name:field2...}...]

//now to form the POST message
postMessages = [];
$(inputArray).each(function(i,v){
    postMessages.push(v.name + "=" + v.value);
});
postMessage = postMessages.join('&');

查看serializeArray() 以查看 JSON 数组格式。

http://jsfiddle.net/kv9U3/

很明显,问题在于您的情况下的this 不是您想象的数组。请澄清this 指针所指的内容,或者只是通过console.log(this) 验证自己

当您更新答案时,在您的情况下,this 指针指的是您提交的表单,您想如何迭代表单?你想用每个来实现什么?

更新

大写而不是加密

http://jsfiddle.net/kv9U3/6/

$('#x').submit(function (e) {
    e.preventDefault();
    var inputArray = [];
    console.log(jQuery(this).serializeArray());
    jQuery(jQuery(this).serializeArray()).each(function (index, value) {
        item = {};
        item[value.name] = value.value.toUpperCase();
        inputArray[index] = item;
    });
    console.log(inputArray);
    postMessages = [];
    $(inputArray).each(function (i, v) {
        for(var k in v)
            postMessages[i] = k + "=" + v[k];
        console.log(i, v);
    });
    postMessage = postMessages.join('&');

    console.log(postMessage);
    return false;
});

【讨论】:

  • 在原帖中发布了脚本的完整源代码。
  • 你是否试图在form 左右获取input 元素的值?
  • 我的印象是 jQuery(this) 是我的表单后数组。
  • Firebug 返回这个错误 jQuery(...).serializeArray(...).each is not a function
  • 您可以在 jQuery API 文档中查看 serializeArray 的文档,如我的回答中所链接。
【解决方案2】:

问题是#cja_form 不会使用each 列出其字段。您可以改用serialize()

inputArray = jQuery(this).serialize();

再版,如果你需要编辑每个元素,你可以使用这个:

var input = {};

$(this).find('input, select, textarea').each(function(){
    var element = $(this);
    input[element.attr('name')] = element.val();
});

完整代码

jQuery(document).ready(function($){ 
    $("#cja_form").submit(function(event){
        $("#submitapp").attr("disabled","disabled");
        $("#cja_status").html('<div class="cja_pending">Please wait while we process your application.</div>');

        var input = {};

        $(this).find('input, select, textarea').each(function(){
            var element = $(this);
            input[element.attr('name')] = element.val();
        });

        $.post('../wp-content/plugins/coffey-jobapp/processes/public-form.php', input)
        .success(function(result){
            if (result.indexOf("success") === -1) {
                $("#submitapp").removeAttr('disabled');
                $("#cja_status").html('<div class="cja_fail">'+result+'</div>');
            }
            else {
                page = document.URL;

                if (page.indexOf('?') === -1) {
                    window.location = page + '?action=success';
                }
                else { 
                    window.location = page + '&action=success';
                }
            }
        })
        .error(function(){
            $("#submitapp").removeAttr('disabled');
            $("#cja_status").html('<div class="cja_fail"><strong>Failed to submit article! Check your internet connection.</strong></div>');
        });

        event.preventDefault(); 
        event.returnValue = false;

        return false;
    });
});

原答案:

javascript中没有关联数组,你需要一个哈希/对象:

var input = {};

jQuery(this).each(function(k, v){
    input[k] = v;
});

【讨论】:

  • 尝试了,但没有成功。我把脚本的其余部分放好。
  • 我在提交之前使用了 serialize() 但现在我必须能够在客户端通过网络之前修改值。我把它拿出来想在数组制作完成后你会提交它而不必再次序列化。
  • 这就是我之前的脚本。我需要做一个 .each 循环并修改每个值。
  • 更新了我的答案,诀窍是找到任何生成POST 变量的字段:$(this).find('input, select, textarea')
  • 问题在于我使用单选框,以及各种各样的东西。还修改值以将内容修改为文本字段中的乱码,因此如果他们收到错误返回,他们将不得不再次重做表单。这就是为什么我选择做一个数组。作为一种安全的方式来运行 POST 数组列表并将其放入为操作和提交而制作的数组中。
【解决方案3】:

这是我的工作解决方案。在此示例中,它将 cat 添加到所有条目,然后将其作为数组发送到 PHP 页面。从那里我通过 $_POST['data'] 访问我的数组。我在http://blog.johnryding.com/post/1548511993/how-to-submit-javascript-arrays-through-jquery-ajax-call找到了这个解决方案

jQuery(document).ready(function () { 
    jQuery("#cja_form").submit(function(event){
        jQuery("#submitapp").attr("disabled","disabled");
        jQuery("#cja_status").html('<div class="cja_pending">Please wait while we process your application.</div>');
        var data = [];
        jQuery.each(jQuery(this).serializeArray(), function(index, value) {
            data[index] = value.value + "cat";
        });
            jQuery.post('../wp-content/plugins/coffey-jobapp/processes/public-form.php', {'data[]': data})
            .success(function(result){
                if (result.indexOf("success") === -1) {
                    jQuery("#submitapp").removeAttr('disabled');
                    jQuery("#cja_status").html('<div class="cja_fail">'+result+'</div>');
                    } else {
                        page = document.URL;
                        if(page.indexOf('?') === -1) {
                            window.location = page+'?action=success';
                    } else { 
                        window.location = page+'&action=success';
                    }
                }
                })
                .error(function(){
                        jQuery("#submitapp").removeAttr('disabled');
                        jQuery("#cja_status").html('<div class="cja_fail"><strong>Failed to submit article! Check your internet connection.</strong></div>');
                });

        event.preventDefault(); 
        event.returnValue = false;

    });
});

【讨论】:

  • sabithpocker 有一个更好的解决方案。这有效,但您丢失了密钥名称。 :(
猜你喜欢
  • 2012-10-19
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
相关资源
最近更新 更多