4

我正在重构我使用$.ajaxjQuery Forms Plugin 提交表单的用途。API声明可以将传递给的任何选项传递$.ajax$.ajaxSubmit. 我希望修改中的选项对象beforeSubmit,添加一个data属性。提醒options.beforeSubmitin的值processSubmit表明这是由处理程序初始化的选项对象并且数据已设置,但由于选项对象已被初始化且没有data属性,因此它不包含在发送到服务器的帖子中。beforeSubmit是否可以在 中或以其他方式修改选项对象?

文档准备好后,我将处理程序绑定到submit()

$("#myform").submit(function() {
    var options = { dataType: 'json',
            beforeSubmit: processSubmit,
            success: endSubmit };
    $(this).ajaxSubmit(options);
    return false;
});

processSubmit(arr, $form, options)函数将要发送到服务器的数据打包为 JSON:

function processSubmit(arr, $form, options) {
    var followers =[];
    $($("#follower-multi-select").children().filter("li")).each(function() {
      if ($(this).hasClass("selected")) {
        var fwr =  $(this).attr("id");
        followers.push(fwr);
      }
    });

    var postData = { followers : followers };
    alert('beforeSubmit is: ' + options.beforeSubmit);

    options.data = 'json='+$.toJSON(postData);
    alert('data set: ' + options.data);
}

表单 HTML:

<form id="myform" action="/myaction" method="post">
    <fieldset>
        <legend>Choose your competitors</legend>
        <ul id="follower-multi-select" class="follower-multi-select">
            {% for f in follower_thumbs %}
            <li id="{{ f.hashedkey }}"><img src='{{ f.thumb }}' alt="{{ f.name }}" /><span class="name-multi-select">{{ f.name }}</span></li>
            {% endfor %}
        </ul>
    </fieldset>
    <input id="send" type="submit" class="large" value="send" />
</form>
4

1 回答 1

3

而不是beforeSubmit您应该使用option beforeSerialize因此您的数据在序列化时会被包含在内。您没有设置.data传递给的选项,而是$.ajax()设置选项,这是插件上的一个属性,用于在序列化时包含额外数据。当发生时,序列化已经完成,你需要在此之前介入,像这样:.data$.ajaxSubmit()beforeSubmit

$("#myform").submit(function() {
    var options = { dataType: 'json',
            beforeSerialize: processSubmit,
            success: endSubmit };
    $(this).ajaxSubmit(options);
    return false;
});

function processSubmit($form, options) {
    var followers = $("#follower-multi-select > li.selected").map(function() {
        return this.id;
    }).get();

    var postData = { followers : followers };
    alert('beforeSubmit is: ' + options.beforeSubmit);

    options.data = 'json='+$.toJSON(postData);
    alert('data set: ' + options.data);
}

我还在这里使用.map()了和>子选择器来简化数组的获取,但是您的原始方法有效……请注意回调中的参数不同的重要区别 from beforeSubmit,回调没有arr参数beforeSerialize

于 2010-07-08T10:38:40.510 回答