jQuery.trigger()函数之后的回调

use*_*911 6 javascript jquery events callback

我这里有一点问题.我必须触发一个包含$ .post()的事件来加载表单并将其分配给DOM.完成此操作后,我编辑了表单的字段.

我试过了:

$.when(function(){
    $('#type_rank_field').trigger('change'); //calls the $.post() to load the form
})
 .done(function(){
    $('#quest_'+questions[i].split('|')[1]).children('option[value="'+questions[i].split('|')[0]+'"]').attr('selected',true);
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,如果我这样离开它:

$('#type_rank_field').trigger('change');
$('#quest_'+questions[i].split('|')[1]).children('option[value="'+questions[i].split('|')[0]+'"]').attr('selected',true);
Run Code Online (Sandbox Code Playgroud)

这种变化甚至看起来像这样:

        $('#type_rank_field').live('change',function(){
        var id = $(this).children('option:selected').attr('id');
        var id_edited = get_id_from_id(id);
        $.post('ajax/load_questions_of_rank.ajax.php',{id: id_edited},function(data){
            //alert(data);
            $('#rank_fields').html(data);
        });
    });
Run Code Online (Sandbox Code Playgroud)

然后在表单正确加载并附加到DOM之前执行表单编辑.对于JavaScript家伙来说这可能是一个愚蠢的问题,但我主要是一个PHP家伙,所以不要残忍:-)

谢谢

Mat*_*and 8

可以分离出change处理程序代码吗?像这样的东西:

$('#type_rank_field').on('change',function(){
    handleChange($(this));
});

function handleChange(elem, callback) {
    var id = elem.children('option:selected').attr('id');
    var id_edited = get_id_from_id(id);
    $.post('ajax/load_questions_of_rank.ajax.php',{id: id_edited},function(data){
        //alert(data);
        $('#rank_fields').html(data);
        if (typeof callback === "function") {
            callback(data);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

然后,在AJAX调用完成时,change您可以调用handleChange传递回调来执行,而不是触发它:

handleChange($("#type_rank_field"), function(data) {
    $('#quest_'+questions[i].split('|')[1])
        .children('option[value="'+questions[i].split('|')[0]+'"]')
        .attr('selected',true);
});
Run Code Online (Sandbox Code Playgroud)


use*_*654 7

从事件处理程序返回promise对象:

$(document).on('change','#type_rank_field',function(){
    var id = $(this).children('option:selected').attr('id');
    var id_edited = get_id_from_id(id);
    return $.post('ajax/load_questions_of_rank.ajax.php',{id: id_edited},function(data){
        //alert(data);
        $('#rank_fields').html(data);
    });
});
Run Code Online (Sandbox Code Playgroud)

然后使用triggerHandler().

var promise = $('#type_rank_field').triggerHandler('change');
promise && promise.done(function(){
    // do stuff
});
Run Code Online (Sandbox Code Playgroud)

这是一个显示正在使用的功能的简单示例:http://jsfiddle.net/WQPXt/

  • @ROY:你是对的,`.live`不应再被使用了,但不是每一个正确的事实都能回答每一个问题.你的答案没有解决问题.它可以作为评论,但不是答案. (3认同)