With jQuery, we can simulate submitting a form:
<form id="form1" method="post">
    <input name="key1" value="value1" />
    <input name="key2" value="value2" />
</form>
With an AJAX function call:
$.post('', { key1: 'value1', key2: 'value2' }, function() {
   // do call back
});
If we use jquery.form.js
$('#form1').ajaxSubmit({
    success: function() {
        // do call back
    }
});
I don't have the form in the markup and I want to submit a form with some dynamic content using the method 'POST'.
I want to make a function call to simulate the procedure, maybe something like:
utils.post('/url', {key1: 'value1', key2: 'value2'});
After that call, the effect is just the same as the form I have above and I submit it, with a natural synchronized way.
Is there a nice way to do this?
If the problem is not clear, I can make an ugly example to explain what I want:
util.post = function(url, fields) {
    var $form = $('<form action="'+url+'" method="post"></form>');
    var key, val;
    for(key in fields) {
        if(fields.hasOwnProperty(key)) {
            val = fields[key];
            $form.append('<input type="hidden" name="'+key+'" value="'+val+'" />');
        }
    }
    $form.submit();
}
The above method works but I think it is not nice enough. When the fields have a special character or something else it may cause an error.
You can use jQuery to construct the form functionally, rather than by concatenating strings, so special characters won't be a problem.
You will need to attach this form to the HTML body before submitting it; recent versions of Chrome now require this.
var util = {};
util.post = function(url, fields) {
    var $form = $('<form>', {
        action: url,
        method: 'post'
    });
    $.each(fields, function(key, val) {
         $('<input>').attr({
             type: "hidden",
             name: key,
             value: val
         }).appendTo($form);
    });
    $form.appendTo('body').submit();
}
                        Since the accepted answer may no longer work in e.g. Chromium based browsers in some circumstances, here's a workaround:
util.post = function(url, fields) {
  var $form = $('<form>', {
    action: url,
    method: 'post'
  }).append(
    $.map(fields, function(key, val) {
      return $('<input>').attr({
         type: "hidden",
         name: key,
         value: val
      }).appendTo($form);
    })
  )
  var w = window.open("about:blank")
  w.document.write($form[0].outerHTML)
  w.document.forms[0].submit()
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With