【问题标题】:JQUERY - Bubbling after ajax callJQUERY - ajax调用后冒泡
【发布时间】:2015-04-16 12:07:59
【问题描述】:

我正在尝试使用 .ajax() 将内容附加到特定 div 并在 Jquery 对话框中使用新内容。我相信我正确使用了 .on(),但似乎 DOM 没有被刷新。

要进行 .ajax() 调用,我使用以下代码(它是成功的):

$(function () {

    var AjaxCall = function () {

        var $link = $(this);

        var options = {
            url: $link.attr("href"),
            type: $link.attr("data-project-method"),
            target: $link.attr("data-project-target"), //a.k.a "#DialogX"
            data: null
        }
        //console.log(options);        
        $.ajax({
            type: options.type,
            url: options.url,
            data: options.data,
            success:function(data){
                var id = "DialogID"
                $('<div id="DialogY"></div>')
                                                    .html(data)
                                                    .appendTo(options.target);
                //$(options.target).replaceWith(data);
            }
        });

        console.log($("#DialogY").html());

        return false;

    };

    $("body").on("click", "a[data-project-ajax='true']", AjaxCall);
});

调用成功,内容正确追加到指定的div。我在&lt;div id="DialogX"&gt;&lt;/div&gt; 中创建了一个&lt;div id="DialogY"&gt;&lt;/div&gt;

在下一步中,我尝试使用插入的内容 + 先前存在于“DialogX”中的内容制作一个 JQuery 对话框,但是,对话框中显示的内容是进行附加之前的内容(仅是已经存在的内容)在“DialogX”中)。看起来 DOM 没有刷新,尽管我使用了 .on() 。

我试图 console.log 新的 DialogX div 内容,但它在“dialogY”中未定义。

我相信在 Jquery 文档中声明返回 false 会停止冒泡/传播,但不返回 false 将使 ajax 调用重新加载所有页面。

ajax调用后,内容显示在页面上,但不显示在Dialog上。

创建对话框(Modal on Bootstrap)的代码如下:

<script>
    //// BOOTSTRAP MODAL ////
    $(function () {
        var content = $("#DialogX").html();

        console.log(content);

        $("body").on("click", ".addDialog", function () {                
            AddDialog("I'm a Dialog", content, function () { });
        });

        function AddDialog(title, content, callback) {
            var $content = content;
            var dlg = new BootstrapDialog({
                title: title, //variable
                message: $content, //variable
                description: "Modal to Edit Platform Variables",
                draggable: true,
                closable: true,
                closeByBackdrop: false, //Click outside Modal don't close it >> working
                closeByKeyboard: false, // esc key Dont't close it >> working
                type: BootstrapDialog.TYPE_DEFAULT, // <-- Default value is BootstrapDialog.TYPE_PRIMARY
                                                    //var types = [
                                                    // BootstrapDialog.TYPE_DEFAULT,  >> BEST
                                                    // BootstrapDialog.TYPE_INFO, 
                                                    // BootstrapDialog.TYPE_PRIMARY, 
                                                    // BootstrapDialog.TYPE_SUCCESS, 
                                                    // BootstrapDialog.TYPE_WARNING, 
                                                    // BootstrapDialog.TYPE_DANGER];
                onshown: function (dialog) {
                    var tier = $('.bootstrap-dialog').length - 1;
                    dialog.$modal.prev(".modal-backdrop")
                        .css("z-index", 1030 + tier * 30);
                    dialog.$modal
                        .css("z-index", 1040 + tier * 30);
                },
                buttons: [{
                    label: 'OK',
                    icon: 'glyphicon glyphicon-send', // Imagem no botão
                    autospin: true,
                    cssClass: 'btn-primary',
                    action: function (dialogRef) {
                        if (callback !== "") { callback(); }
                      //  dialogRef.close(); //autoClose
                        setTimeout(function () {
                            dialogRef.close(); // waites for X seconds to close
                        }, 1000);
                    }
                }, {
                    label: 'Close',
                    cssClass: 'btn',
                    action: function (dialogRef) {
                        dialogRef.close();
                    }
                }]
            }).open();
        }
    });
</script>

我花了更多的时间,然后我为这个错误感到自豪。似乎每件事都是正确的,但显然不是。

有人可以指出我做错了什么吗?或者缺少什么?可能是很明显的东西......但我不知道它是什么......

非常感谢...

【问题讨论】:

    标签: javascript jquery html jquery-ui dom


    【解决方案1】:

    您使用on 只是意味着点击处理程序将适用于新添加的元素。这与您关于对话框具有“陈旧”内容的问题没有任何关系。

    您正在设置此变量:var content = $("#DialogX").html(); 仅一次,在您的 ready 处理程序中。所以,contentDialogX div 的 HTML 内容从页面加载开始,你永远不会更新 content

    最简单的更改是将调用.html() 推送到您的对话框点击处理程序中,这样对话框内容将在您即将打开对话框时重新“计算”:

    $("body").on("click", ".addDialog", function () {                
        AddDialog("I'm a Dialog", $("#DialogX").html(), function () { });
    });
    

    【讨论】:

    • 谢谢您,@John Flatness,您的解决方案效果很好……抱歉给您带来了麻烦。
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2011-10-20
    • 1970-01-01
    • 2019-04-30
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多