2012-09-24 143 views
0

奇怪的行为,这是一个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处理程序,并触发另一个点击事件。

唯一的区别是警报声明的存在。我把这条线取出来,并且对话框不能关闭。

请告诉我我只是错过了一个分号或什么愚蠢的....否则我想使用delay()。

谢谢。


解决方案:

我终于到达了此消磨一个晚上之后。我无法明确地确定警报声明中发生了什么,或者如何管理异步执行,但是这种方法很有效。

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'); 

非常感谢大家的帮助。下面是我做得到这个工作的变化:

    功能外
  • 宣布$对话框在全球范围内
  • 约束uploadDone事件监听器创建$ $ link.click()
  • 之前对话框在html中更改id =“22”为id =“event_22”原因< 5,ID必须以alpha字符开头。

我不确定谁的回答接受,但我当然非常感谢您的帮助。

+3

你能展示*呈现*如同在浏览器中看到的jQuery;因为我很确定''是一个服务器端脚本?JavaScript,因此jQuery,在客户端工作,所以服务器端是不相关的。另外,什么是相关的HTML? –

+0

我很想,但是这个块是由ajax加载的,所以firefox view source不会显示它,并且由于某种原因它在firebug中也不可见。是的,这些是带有一些你想要研究的独特变量的PHP短标签。这可能会有问题。 – glyph

+0

要部分回答你的问题,<?= $ gridArr ['event_id']?>是一个数字值。该div有id =“22”所以#<?= $ gridArr ['event_id']?>将被替换为#22 – glyph

回答

5

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

+0

是的我会说这就是发生了什么,但我认为这些事情应该是顺序发生?我没有意识到这些类型的语句有任何并行执行。 – glyph

+0

是的,加载是异步执行的,因此它和它下面的代码可以并行执行。你是否尝试过使用console.log()而不是alert来查看事件被调用的顺序?请记住,如果你这样做,当异步调用时,事情完成的顺序是不确定的。 – Mindwalker2076

+0

很难确切知道你的代码如何在不知道你想要做什么的确切逻辑的情况下运行,但看起来你可能能够移动一些代码,以便设置所有事件绑定在实际的函数调用开始之前。 例如,尝试在var $ link = $(this).one(“click”,function())之前移动$(document).bind('uploadDone',function(e){...} {...}代码 – Mindwalker2076

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广播。但是,就像大卫在你的问题的评论中所说的那样......一些上下文将会有所帮助

+0

我试过这个链接函数以外,它不会触发uploadDone。我认为这是因为$对话框。对话框发生在$ link的内部 – glyph

+0

假设我想在$ link之外绑定uploadDone,我怎么才能在该函数之外正确地引用对话框?将它绑定到外部是有道理的,但我不知道如何在内部引用它我试过$ link。$ dialog但没有骰子,谢谢 – glyph

+0

让我们确保我们在这里谈论同样的事情,uploadDone回调是否被触发与引用$ dialog变量无关,或者.dialog ()方法,如果你取消该警报的注释(“dialogCloser ...”);在我的例子中,是否会触发?你可以添加一个代码片段和来自uploadDone事件触发器的解释吗? – ThePants