jQuery .html() 的回调函数是什么?

23

我有以下代码:

$.ajax({
      type: 'GET',
      url: 'index.php?route=checkout/onepagecheckout/getpaypaldata',
      dataType: 'json',
      success: function(json) {
                              $('#pp_info').html(json['output']);
                              $('#payment').submit();
                              }
      });

ajax请求会接收到一个JSON对象,其中包含一个类似以下的HTML表单:

<form id="payment" method="post" action="https://www.paypal.com/cgi-bin/webscr">
<input type="hidden" value="_cart" name="cmd">
<input type="hidden" value="1" name="upload">
<input type="hidden" value="test@yahoo.ca" name="business">
<input type="hidden" value="Sample Item Name" name="item_name_1">
<input type="hidden" value="TESTI-1" name="item_number_1">
<input type="hidden" value="104.98" name="amount_1">
<input type="hidden" value="1" name="quantity_1">
<input type="hidden" value="0" name="weight_1">
<input type="hidden" value="Type" name="on0_1">
<input type="hidden" value="As Shown" name="os0_1">
<input type="hidden" value="Delivery Date" name="on1_1">
<input type="hidden" value="Jun 23,2012" name="os1_1">
<input type="hidden" value="Comments" name="on3_1">
<input type="hidden" value="test message" name="os3_1">
</form>

这段内容包含了PayPal处理订单所需的信息。除此之外,一切都很顺利,但我认为有时候在jQuery .html函数加载完HTML内容之前,表单就已经提交了。

是否有针对 .html 的回调函数或者其他方法可以解决这个问题?PayPal数据以HTML表单的形式出现,我无法更改它,因此我只有一个选择,那就是以某种方式加载HTML内容并提交表单!


2
首先,响应不是JSON格式的。它是HTML响应,请检查您的代码。 - Umesh Aawte
1
.html方法应该是同步的。正如UmeshA所指出的,你的问题很可能是其他原因引起的。 - hugomg
它是JSON格式,唯一的区别是HTML内容以字符串形式存储在jsonp ['output']中。JSON对象还包含其他一些信息。 - Tohid
这是我期望的结果,但实际上发生了什么,如果我在.html()和submit之间放置一个alert('bla bla');,一切都正常工作! - Tohid
1
这根本没有道理,但是使用setTimeout应该可以解决它。setTimeout(function(){$('#payment').submit();},0); - Kevin B
谢谢你,Kevin。我认为这至少暂时解决了问题 :) - Tohid
1个回答

46

你可以尝试这个

success: function(json) {
    $('#pp_info').html(json['output']).promise().done(function(){
        $('#payment').submit();
    });
}

4
jQuery promisedetail - The Alpha
1
以前没听说过 promise()。这打开了一个全新的世界! - dreagan
7
这只是setTimeout(fn)所做的事情。html方法没有回调函数,并且此Promise不会等待html方法完成。它只是将回调推送到回调队列中,这会导致它在附加的HTML中的JavaScript运行后被执行。在这种情况下,使用setTimeout会更清晰,而不是让人们认为.html()可以有回调。 - Kevin B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接