jquery事件绑定的奇怪行为

时间:2012-09-24 21:11:09

标签: javascript jquery

这是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&lt; 5,ID必须以alpha字符开头。

我不确定接受谁的答案,但我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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时关闭所有对话框。但是,就像大卫在你的问题评论中说的那样......某些背景会有所帮助