2012-09-24 142 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