jQuery通过ajax加载页面,并在返回的ajax数据中发布表单

jQuery通过ajax加载页面,并在返回的ajax数据中发布表单,jquery,ajax,dom,forms,post,Jquery,Ajax,Dom,Forms,Post,我正在编写一个greasemonkey脚本,这样当用户单击一个复选框时,一个带有表单的页面将通过.ajax加载,表单将自动填写,然后发布。表单是我发现的多部分/表单数据,不能通过.ajax调用发布。为了解决这个问题,我做了以下工作: function getConvoPage() { $.get("/page_with_form.php", { id: theId }, function(data){ parsePage(data); } ); } functi

我正在编写一个greasemonkey脚本,这样当用户单击一个复选框时,一个带有表单的页面将通过.ajax加载,表单将自动填写,然后发布。表单是我发现的多部分/表单数据,不能通过.ajax调用发布。为了解决这个问题,我做了以下工作:

function getConvoPage() {
    $.get("/page_with_form.php", { id: theId }, function(data){
        parsePage(data);
    } );
}

function parsePage(data) {
    var dataObject = jQuery(data);
    dataObject.find('textarea[name="message_text"]').val('Thank you for your purchase!');
    dataObject.find('form[enctype="multipart/form-data"]').submit();
}
我可以设置textarea的值,并且我已经确认表单正在被找到,但是提交操作没有任何作用。我还尝试了trigger()和模拟单击提交按钮。这些都不起作用,这让我相信这是不可能的


我能做些什么来实现这一点,或者什么是可行的替代方法?

您需要将表单添加到页面中才能发布它。最简单的形式如下所示:

function parsePage(data) {
    var dataObject = jQuery(data);
    $('body').append( dataObject );

    dataObject.find('textarea[name="message_text"]').val('Thank you for your purchase!');
    dataObject.find('form[enctype="multipart/form-data"]').submit();
}
var asyncSubmitForm = function( form, callback ) {

    var f=$(form).clone();

    // the form is expected to already have the appropriate `action` and `method`
    // attributes set.

    var iframe = $('<iframe id="tempFrame"></iframe>');
    iframe.hide().appendTo('body');
    iframe.load(function() {
        if( callback ) callback(iframe);
        iframe.remove();
        iframe = null;
    });

    iframe.contents().find('body').append(f);
    f.submit();
};
function parsePage(data) {
    var dataObject = jQuery(data);

    dataObject.find('textarea[name="message_text"]').val('Thank you for your purchase!');
    asyncSubmitForm(dataObject.find('form[enctype="multipart/form-data"]'), function(iframe) {
       alert('form submitted. response ['+$(iframe).contents().html()+']');
    });
}
如果不希望表单导致重新加载整个页面,则可以创建隐藏的iframe,将iframe添加到页面,然后将表单添加到iframe。最后,提交表单,并等待iframe的
onload
事件(这可以通过jquery完成)

后一种方法可能如下所示:

function parsePage(data) {
    var dataObject = jQuery(data);
    $('body').append( dataObject );

    dataObject.find('textarea[name="message_text"]').val('Thank you for your purchase!');
    dataObject.find('form[enctype="multipart/form-data"]').submit();
}
var asyncSubmitForm = function( form, callback ) {

    var f=$(form).clone();

    // the form is expected to already have the appropriate `action` and `method`
    // attributes set.

    var iframe = $('<iframe id="tempFrame"></iframe>');
    iframe.hide().appendTo('body');
    iframe.load(function() {
        if( callback ) callback(iframe);
        iframe.remove();
        iframe = null;
    });

    iframe.contents().find('body').append(f);
    f.submit();
};
function parsePage(data) {
    var dataObject = jQuery(data);

    dataObject.find('textarea[name="message_text"]').val('Thank you for your purchase!');
    asyncSubmitForm(dataObject.find('form[enctype="multipart/form-data"]'), function(iframe) {
       alert('form submitted. response ['+$(iframe).contents().html()+']');
    });
}