2011-05-05 52 views
4

我創建了一些自定義的「彈出窗口」(最初用「display:none;」樣式),通過相鄰的「.popup_trigger」鏈接以下總結功能:jQuery的event.stopPropagation()導致Rails的問題:remote => true

# /public/javascripts/application.js 
jQuery(document).ready(function(){ 

    // Trigger a popup 
    jQuery('.popup_trigger').live('click', function(event) { 
    jQuery(this).next('.popup').toggle(0, function() { 
     // Prevent the jQuery('body').click() below if the click occurs inside the popup 
     jQuery(this).click(function(event){ 
     event.stopPropagation(); 
     }); 
    }); 
    return false; 
    }); 

    // "Outside" click hides popup 
    jQuery('body').click(function() { 
    jQuery('.popup:visible').toggle(); 
    }); 
}); 

這適用於顯示彈出窗口,然後在發生「外部」單擊時隱藏它們。然而,這樣一個彈出裏面我有以下幾點:

<%= link_to 'Delete medical record', medical_record, :confirm => 'Permanently delete this medical record?', :method => :delete, :remote => true %> 

這使得如下:

<a href="/medical_records/1" data-confirm="Permanently delete this medical record?" data-method="delete" data-remote="true" rel="nofollow">Delete medical record</a> 

我的問題是,當我觸發顯示彈出式窗口,將event.stopPropagation();調用似乎禁用遠程這個鏈接的功能。也就是說,當我點擊該鏈接時,它會發送一個普通的(非遠程)GET請求'/ medical_records/1',它會查找show動作而不是銷燬。

如果我在上面的JS中註釋掉event.stopPropagation();,遠程鏈接工作正常,但彈出窗口隱藏,當我點擊裏面。

我該怎麼做才能讓它彈出,只有當它被點擊後才能隱藏活動彈出框,並且還允許遠程鏈接工作?

謝謝。

+0

我有同樣的問題,試圖修改twitter-bootstraps的下拉對話框的行爲。查看https://github.com/rails/jquery-ujs/blob/master/src/rails.js,看起來他們將事件委託人附加到數據遠程對象的文檔中。我認爲,當頁面上的內容發生變化時,它提供了一個很好的用戶體驗,但也很煩人,因爲這意味着鏈接上的點擊必須冒泡到文檔中。不知道如何解決這個問題... – Woahdae 2012-03-18 03:52:10

回答

0

我有同樣的問題,我發現的唯一的解決辦法是通過jQuery「手動」發送一個Ajax請求像這樣:

jQuery(document).ready(function(){ 
    jQuery('#notification_<%=notification.id%> .remove-not a').on('click', function(e) { 
     $.ajax({ 
     url: '<%=notification_path(notification)%>', 
     type: 'delete', 
     dataType: 'script', 
     success:function(data){ 
     } 
     }); 
     e.preventDefault(); 
     e.stopPropagation(); 
    }); 
}); 

這工作正常,但如果任何人有更好的解決方案,我會很高興嘗試一下! :)

相關問題