【问题标题】:Chosen.js : automatically select freshly created value in ajax callbackChosen.js :在 ajax 回调中自动选择新创建的值
【发布时间】:2017-09-15 16:39:16
【问题描述】:

我在 ajax 中有这段代码:

主要功能

    $.ajax({
        type:"POST",
        url:dest_url,
        data:$(this).serialize(),
        dataType: 'json',
        success: function(data){
            if($.isEmptyObject(data.error)){
                listRefresh(data.id);
                $('#site_id').val(data.id).trigger("chosen:updated");
            }else{
                console.log(data.error);
            }
        },
        error: function(data){

        }
    }
})

函数列表刷新()

function listRefresh(id){
    $('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
    $.ajaxSetup({
        header:$('meta[name="_token"]').attr('content')
    })
    var src_url = location.href + '?sites='+id;
    $.ajax({
        url: location.href,
        type: 'GET',
        cache: false
    })
    .done(function(id) {
        $('.panel-heading').load(src_url + " .panel-heading >*");
        $('#site_id').load(src_url+ " #site_id >*", function(id) {
            $('.fa-spin').remove();
            $('#site_id_chosen').show();
        }).val(id).trigger("chosen:updated");
    })
    .fail(function() {
        $('#site_id').load(location.href+ " #site_id >*", function() {
            $(this).val('').trigger("chosen:updated");
            $('.fa-spin').remove();
            $('#site_id_chosen').show();
        });
    });
}

除了更新所选的选定值外,一切正常。 当我做console.log(data.id); 时,它可以工作。 当我从控制台执行$('#site_id').val(40).trigger("chosen:updated"); 时,它可以工作。

我以为是因为ajax是异步的,但是我的代码在成功回调中,所以应该定义data.id...

我也尝试在 listRefresh() 函数中更新选定的值,但没有任何效果。

编辑

还是不行,不知道为什么... 这是我的完整代码,用你的更新:

//Création d'un nouveau site en ajax
    $('#creer-site form').on('submit',function(e){
        var base = "{{ url('/') }}";
        var dest_url = base + '/sites'; 
        $.ajaxSetup({
            header:$('meta[name="_token"]').attr('content')
        })
        e.preventDefault(e);
        $.ajax({
            type:"POST",
            url:dest_url,
            data:$(this).serialize(),
            dataType: 'json',
            success: function(data){
                if($.isEmptyObject(data.error)){
                    console.log(data);
                    $('.alert').remove();
                    $('.modal').modal('hide');
                    successHtml = '<div class="alert alert-success alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Fermer</span></button><span class="fa fa-check fa-lg"></span>';
                    successHtml += data.message;
                    successHtml += '</div>';
                    $('.header-container').after( successHtml );
                    listRefresh(data.id); // on rafraichit la liste et on sélectionne l'objet nouvellement créé
                }else{
                    console.log(data.error);
                }
            },
            error: function(data){
                $('.alert').remove();
                $('.modal').animate({ scrollTop: 0 }, 'fast');
                errorsHtml = '<div class="alert alert-danger"><span class="fa fa-warning fa-lg"></span><strong> Une ou plusieurs erreurs ont été detectées :</strong><ul>';
                $.each(data.responseJSON, function(key, value) {
                    errorsHtml += '<li>' + value + '</li>';
                });
                errorsHtml += '</ul></div>';
                $('#creer-site form').prepend( errorsHtml );
            }
        })
    });

    // on rafraichit la liste et on sélectionne l'objet nouvellement créé
    function listRefresh(id){
        $('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
        $.ajaxSetup({
            header:$('meta[name="_token"]').attr('content')
        })
        var src_url = location.href + '?sites='+id;
        $.ajax({
            url: location.href,
            type: 'GET',
            cache: false
        })
        .done(function(id) {
            $('.panel-heading').load(src_url + " .panel-heading >*");
            $("#site_id").chosen("destroy");
            $('#site_id').load(src_url+ " #site_id >*", function(id) {
                $("#site_id").chosen({
                    no_results_text: "Aucun résultat pour ", 
                    search_contains: true, 
                    placeholder_text_single: "Sélectionner...", 
                    allow_single_deselect:true, 
                    width: "300px"
                }).val(id).trigger("chosen:updated");
                $('.fa-spin').remove();
                $('#site_id_chosen').show();
            });
        })
        .fail(function() {
            $('#site_id').load(location.href+ " #site_id >*", function() {
                $(this).val('').trigger("chosen:updated");
                $('.fa-spin').remove();
                $('#site_id_chosen').show();
            });
        });
    }

编辑 2

由于某种原因,js 变量在 ajax 调用期间丢失,根据调试:当我观看“id”变量时,它在函数启动 ajax 调用的确切时刻变为“未定义”。

临时解决方案是将 id 写入隐藏输入中,这样我可以再次在 ajax 调用中获取它(它非常有效),但这非常难看...

如果你有更好的解决方案,也许能解释为什么变量丢失,我将不胜感激:)

编辑 3

我最新的“错误”的解决方案在这里:Variable lost in ajax request

【问题讨论】:

  • 您可以尝试删除.val(id).trigger("chosen:updated");$('#site_id').val(data.id).trigger("chosen:updated");,然后将$('#site_id').val(id).trigger('chosen:updated'); 放入$('#site_id').load 回调中吗?同时删除该回调中的id 参数。

标签: javascript jquery ajax jquery-chosen ajaxform


【解决方案1】:

你的问题在这个片段中:

$('#site_id').load(src_url+ " #site_id >*", function(id) {
        $('.fa-spin').remove();
        $('#site_id_chosen').show();
 }).val(id).trigger("chosen:updated");

val(id) 会在 load 方法在未来运行时立即应用。 此外,您已经在主 ajax 中调用了相同的方法。

因此我建议移动这一行:

$('#site_id').val(data.id).trigger("chosen:updated");

在成功加载方法回调中。

load 方法从服务器获取数据并将返回的 HTML 放入匹配的元素中(即:总是 site_id)。从代码中,没有关于您的 html 的任何信息,我假设 load 功能会覆盖您选择的元素。这意味着您需要在新元素上重新创建一个新实例并删除前一个。这是以下两个操作:

  1. $("#site_id").chosen("destroy"); 加载
  2. 之前
  3. $("#site_id").chosen({...你的选项..}).val(data.id).trigger("chosen:updated");成功加载回调

您的代码将是:

$.ajax({
    type: "POST",
    url: dest_url,
    data: $(this).serialize(),
    dataType: 'json',
    success: function (data) {
        if ($.isEmptyObject(data.error)) {
            listRefresh(data.id);
        } else {
            console.log(data.error);
        }
    },
    error: function (data) {

    }
})
function listRefresh(id) {
    $('#site_id_chosen').hide().parent().append('<i class="fa fa-circle-o-notch fa-spin"></i>');
    $.ajaxSetup({
        header: $('meta[name="_token"]').attr('content')
    })
    var src_url = location.href + '?sites=' + id;
    $.ajax({
        url: location.href,
        type: 'GET',
        cache: false
    }).done(function (data) {
        $('.panel-heading').load(src_url + " .panel-heading >*");
        // 
        // remove chosen:
        //
        $("#site_id").chosen("destroy");
        $('#site_id').load(src_url + " #site_id >*", function (data) {
            //
            // next row added
            //
            $("#site_id").chosen({...your options..}).val(id).trigger("chosen:updated");
            $('.fa-spin').remove();
            $('#site_id_chosen').show();
        }); // USELESS  .val(id).trigger("chosen:updated");
    }).fail(function () {
        $('#site_id').load(location.href + " #site_id >*", function () {
            $(this).val('').trigger("chosen:updated");
            $('.fa-spin').remove();
            $('#site_id_chosen').show();
        });
    });
}

【讨论】:

  • 谢谢,但它仍然无法正常工作...我已经用受您启发的完整代码更新了我的问题。
  • 是的,但我认为问题出在其他地方:我刚刚在加载回调中使用 console.log(id) 进行了测试,如下所示:$('#site_id').load(src_url+ " #site_id &gt;*", function(id) { console.log(id); 它在控制台中显示了我所有的 html 代码。 .
  • 其实很奇怪:如果我在ajax请求之前将console.log(id)放在listRefresh()函数中,它会输出id,但是如果我把console.log(id)放在完成回调它在控制台中输出我的整个源代码......(以前从未见过这种行为......)。我试图在 ajax 数据中传递变量,但它是相同的......似乎加载函数不是导致该问题的原因......
  • 没问题。通过像这样将数据传递给完成参数:[...] .done(function(data) {console.log(data); [...],我仍然遇到同样奇怪的问题:console.log 输出我的整个源代码代替数据对象...
  • 感谢这篇文章stackoverflow.com/questions/46301759/…我刚刚弄错了它现在完美运行!
猜你喜欢
  • 1970-01-01
  • 2018-02-23
  • 2012-03-28
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多