0

这是 jquery 大师的一个:

这有效:

$(function (){
    $("#<?= $gridArr['event_id'] ?> .gallery-add").each(function() {
        var $dialog = $("<div></div>");
        var $link = $(this).one("click", function() {
            $dialog
                .load($link.attr("href"))
                .dialog({
                    modal: true,
                    width: 520,
                    height: 180,
                    title: $link.attr("title")
                });
            $link.click(function() {
                $dialog.dialog("open");                                    
                return false;
            });        
            alert('clicked');           
            $(document).bind('uploadDone', function(e) {
               // alert("dialogCloser triggered in dialog function");
                $dialog.dialog("close"); 
                $("#<?= $gridArr['uniq'] ?>-event-path-form-submit").trigger('click');   
            });                         
            return false; 
        });

    });
});

这不会:

$(function (){
    $("#<?= $gridArr['event_id'] ?> .gallery-add").each(function() {
        var $dialog = $("<div></div>");
        var $link = $(this).one("click", function() {
            $dialog
                .load($link.attr("href"))
                .dialog({
                    modal: true,
                    width: 520,
                    height: 180,
                    title: $link.attr("title")
                });
            $link.click(function() {
                $dialog.dialog("open");                                    
                return false;
            });        
            // alert('clicked');           
            $(document).bind('uploadDone', function(e) {
               // alert("dialogCloser triggered in dialog function");
                $dialog.dialog("close"); 
                $("#<?= $gridArr['uniq'] ?>-event-path-form-submit").trigger('click');   
            });                         
            return false; 
        });

    });
});

唯一的区别是警报声明。基本上我在这里所做的是将一堆点击事件处理程序附加到图像,这会在对话框中显示 ajax 上传表单。上传表单将图像转储到 iframe。然后 iframe 触发一个绑定到 $(document) 的 uploadDone 处理程序,并触发另一个单击事件。

唯一的区别是警报语句的存在。我把那条线拿出来,对话框无法关闭。

请告诉我我只是错过了一个分号或一些愚蠢的东西......否则我正在考虑使用延迟()。

谢谢。


解决方案:

经过一个晚上的闲逛,我终于到达了这里。我无法肯定地确定警报语句发生了什么,或者如何管理异步执行,但这解决了它。

var $dialog = $("<div></div>");
$(function (){    
    $("#event_22 .gallery-add").each(function() {
        var $link = $(this).one("click", function() {
            $dialog
                .load($link.attr("href"))
                .dialog({
                    modal: true,
                    width: 520,
                    height: 180,
                    title: $link.attr("title")
                }).bind('uploadDone', function() {
                 // alert("uploadDone triggered in dialog function");
                 $("#myForm-submit").trigger('click');
            });
            $link.click(function() {
                $dialog.dialog("open");                                    
                return false;
            });
            return false; 
        });       
    });
});

在成功的 iframe 中,

parent.$dialog.dialog("close");
parent.$dialog.trigger( 'uploadDone' );

非常感谢大家的帮助。以下是我为使其正常工作所做的更改:

  • 在全局范围内的函数之外声明 $dialog
  • 在创建 $link.click() 之前将 uploadDone 事件侦听器绑定到 $dialog
  • 将 id="22" 更改为 id="event_22" 因为在 html < 5 中,ID 必须以 alpha 字符开头。

我不确定谁会接受,但我当然感谢您的所有帮助。

4

2 回答 2

5

alert 语句很可能会导致一个块,在执行下面的代码之前给上面的代码时间来完成。我的猜测是,如果没有警报,它会在完成上传之前一直返回 false。

于 2012-09-24T21:17:03.953 回答
1

我的猜测是在绑定 uploadDone 事件之前加载对话框。是否有理由将它绑定在 click 事件处理程序中,而不是在创建它时?

$(function (){
  $("#<?= $gridArr['event_id'] ?> .gallery-add").each(function() {
    var $dialog = $("<div></div>");
    var $link = $(this).one("click", function() {
        $dialog
            .load($link.attr("href"))
            .dialog({
                modal: true,
                width: 520,
                height: 180,
                title: $link.attr("title")
            });
        $link.click(function() {
            $dialog.dialog("open");                                    
            return false;
        });           
        return false; 
    });
    $(document).bind('uploadDone', function(e) {
        // alert("dialogCloser triggered in dialog function");
        $dialog.dialog("close"); 
        $("#<?= $gridArr['uniq'] ?>-event-path-form-submit").trigger('click');   
    }); 

  });
});

如果您总是希望在广播 uploadDone 时关闭所有对话框,这似乎应该可以工作。但是,就像大卫在你的问题评论中所说的那样......一些背景会有所帮助

于 2012-09-24T21:22:15.167 回答