【问题标题】:jQuery non-AJAX POSTjQuery 非 AJAX POST
【发布时间】:2011-04-02 15:24:55
【问题描述】:

jQuery 中有没有简单的非 AJAX POST 方法?

我正在寻找与页面上的表单等效的东西,只有通过 JavaScript 设置的隐藏字段,然后被 POST 编辑,导致浏览器加载通过 action 设置的页面。只是一个普通的 POST,但通过 jQuery 设置值。

我想我可以继续实现我当前的方法,但我很好奇 jQuery 是否提供了一种快速的方法。在后台,我想它会用所有隐藏值动态创建这个表单并提交它。

【问题讨论】:

标签: jquery jquery-plugins http-post


【解决方案1】:

稍微整理了Darin的优秀解决方案。

function myFunction(action, method, input) {
    'use strict';
    var form;
    form = $('<form />', {
        action: action,
        method: method,
        style: 'display: none;'
    });
    if (typeof input !== 'undefined' && input !== null) {
        $.each(input, function (name, value) {
            $('<input />', {
                type: 'hidden',
                name: name,
                value: value
            }).appendTo(form);
        });
    }
    form.appendTo('body').submit();
}

这是与 JSLint 兼容的,并确保尽管可能有 css 定义,但不会在 body 标记的末尾显示任何表单。用法也稍微简单一些,例如:

myFunction('/path/to/my/site/', 'post', {
    id: 1,
    quote: 'Quidquid Latine dictum sit altum videtur'
});

【讨论】:

  • 它似乎可以在没有将表单附加到页面的情况下工作。
  • 没关系,如果你不附加它,它在IE中不起作用。
【解决方案2】:

没有内置任何东西。您可以创建一个动态表单,使用隐藏字段填充它,将其添加到 DOM 并触发提交。这是一个例子:

function submit(action, method, values) {
    var form = $('<form/>', {
        action: action,
        method: method
    });
    $.each(values, function() {
        form.append($('<input/>', {
            type: 'hidden',
            name: this.name,
            value: this.value
        }));    
    });
    form.appendTo('body').submit();
}

submit('http://www.example.com', 'POST', [
    { name: 'key1', value: 'value1' },
    { name: 'key2', value: 'value2' },
    { name: 'key3', value: 'value3' },
]);

【讨论】:

  • 感谢您的解决方案!这对我尝试通过将其标记为 POST 来保护 ASP.NET MVC 中的删除操作非常有帮助。
  • +1 darin,在当天晚些时候才找到这个,但仍然与我今天的要求相关!!谢谢
  • @trinth 大多数有用的东西在 IE 中不起作用,但是这是一个非常有用的解决方案。
  • @ClainDsilva:同意它很有用,但是,其他人可能想知道这些警告,然后才能自己发现
  • @trinth 我看不出它在 IE9 中不起作用的任何原因,除非问题是数据中的尾随逗号。如果这就是您用于数据的内容,请去掉后面的逗号。
【解决方案3】:

我发现这些答案非常有用,并修改了 Anssi Herranen 的解决方案,以将数组正确发布到服务器端 php:

function jqueryPost(action, method, input) {
    "use strict";
    var form;
    form = $('<form />', {
        action: action,
        method: method,
        style: 'display: none;'
    });
    if (typeof input !== 'undefined') {

        $.each(input, function (name, value) {

            if( typeof value === 'object' ) {

                $.each(value, function(objName, objValue) { 

                    $('<input />', {
                        type: 'hidden',
                        name: name + '[]',
                        value: objValue
                    }).appendTo(form);
                } );      
            }
            else {

                $('<input />', {
                    type: 'hidden',
                    name: name,
                    value: value
                }).appendTo(form);
            }
        });
    }
    form.appendTo('body').submit();
}

【讨论】:

  • 我不明白为什么这被否决了。这应该是正确的答案。我希望我能先看到它,因为数组是我在回来看到这个之前处理了 30 分钟的问题。
  • 同意,这允许发布数组,接受的答案不允许。
【解决方案4】:

作者要求使用 jQuery 解决方案,但这可以使用 plain JavaScript 轻松完成:

function post (action, nameValueObj){
    var form = document.createElement("form");
    var i, input, prop;
    form.method = "post";
    form.action = action;
    for (prop in nameValueObj) { // Loop through properties: name-value pairs
        input = document.createElement("input");
        input.name = prop;
        input.value = nameValueObj[prop];
        input.type = "hidden";
        form.appendChild(input);
    }
    //document.body.appendChild(form); <-- Could be needed by some browsers?
    form.submit();
    return form;
}
// Example usage:
post("actionPage.html", {
    "field1": "hello",
    "field2": "world" 
    /* etc. */
});

【讨论】:

    【解决方案5】:

    我认为你可以使用类似的东西:

    paramters = {key1: 'value1', key2: 'value2'}
    
    jQuery.ajax({ 
       url:'/your/url', 
       data: jQuery.param(paramters),
       async:false,
       type:'POST',
       success: function(result){
           doSomethingWithYourResult(result);
       }
    })
    

    注意“asyn=false”设置

    【讨论】:

    • @biccio,这行不通。这仍然是 AJAX,它只是阻塞直到请求完成。
    • @Brad 很好用!!!它对服务器进行同步 POST 调用,传递您想要的每个值,就像带有隐藏字段的表单一样。该函数是 ajax,但它不像 ajax 那样工作,它像表单一样同步工作......
    • @biccio,是的,我明白这一点,但我想要同时完全重新加载页面的东西。这种方法不这样做。对于某些事情,这是一个很好的解决方案,但不适用于我的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2014-04-08
    • 2019-08-03
    • 2013-02-09
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多