2013-08-22 64 views
0

我期待着稍微減少一些代碼。像往常一樣使用jQuery和Bootstrap,它相當冗長。我想學習如何讓它變得更加乾爽,並且通過使用我認爲是可重用代碼藝術的參數和變量的一些組合。尋找智能的方法來使這個Bootstrap/jQuery代碼「DRY」

NOTE:這些實際上是相同的唯一真正的區別是「內容」。我將需要使內容和「展示位置」在每個實例中都是唯一的。


實例A

$('#popover-2').popover({ 
     html: true, 
     trigger: 'manual', 
     placement:'right', 
     container:'body', 
     content:'<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus #2</p>' 
    }).click(function(e) { 
     $(this).popover('show'); 
     $('.popover-content').prepend('<a class="close">&times;</a>'); 
     $('.close').click(function(e){ 
      $('[data-toggle=popover]').popover('hide'); 
     }); 
    e.preventDefault(); 
}); 

實例B

$('#popover-3').popover({ 
     html: true, 
     trigger: 'manual', 
     placement:'right', 
     container:'body', 
     content:'<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus #2</p>' 
    }).click(function(e) { 
     $(this).popover('show'); 
     $('.popover-content').prepend('<a class="close">&times;</a>'); 
     $('.close').click(function(e){ 
      $('[data-toggle=popover]').popover('hide'); 
     }); 
    e.preventDefault(); 
}); 

由於

+5

這個問題似乎是脫離主題,因爲它屬於codereview.stackexchange.com/ – cfs

+0

@cfs我認爲這是一個很有價值的問題,有一個很好的答案。我不知道codereview.stackexchange.com/存在。這是新的嗎?這個問題可以移動/遷移到那裏以使社區受益嗎?謝謝 –

回答

2

您存儲所有常用的選項,像這樣你就可以使用對象:

var commonOptions = { 
    html: true, 
    trigger: 'manual', 
    placement:'right', 
    container:'body' 
} 

,並在一個名爲功能點擊回調:

var myClickCallback = function(e) { 
    $(this).popover('show'); 
    $('.popover-content').prepend('<a class="close">&times;</a>'); 
    $('.close').click(function(e){ 
     $('[data-toggle=popover]').popover('hide'); 
    }); 

    e.preventDefault(); 
}; 

因此您的代碼將是:

var commonOptions = { 
    html: true, 
    trigger: 'manual', 
    placement:'right', 
    container:'body' 
} 

var myClickCallback = function(e) { 
    $(this).popover('show'); 
    $('.popover-content').prepend('<a class="close">&times;</a>'); 
    $('.close').click(function(e){ 
     $('[data-toggle=popover]').popover('hide'); 
    }); 

    e.preventDefault(); 
} 

$('#popover-2').popover($.extend({}, commonOptions, { 
    content:'<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus #2</p>' 
})).click(myClickCallback); 


$('#popover-3').popover($.extend({}, commonOptions, { 
    content:'<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus #2</p>' 
})).click(myClickCallback); 
+0

我必須承認起初這個答案似乎是對我來說更優雅的選擇,但它似乎過於複雜,除非內容不同,在示例代碼片段中它是相同的,並可以作爲第二個參數傳遞給我的幫助函數無論如何回答 –

+0

內容是一樣的,因爲我懶得改變它:) – patrick

+0

@patrick完美。完全是我以後的乾淨的代碼和解釋。我不得不在上面的編輯代碼中做一些小小的調整來使代碼功能(添加var myClickCallback =)成爲可能。 –

0
function popoverHelper(id){ 
    var element = $('#' + id); 

    element.popover({ 
      html: true, 
      trigger: 'manual', 
      placement:'right', 
      container:'body', 
      content:'<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus #2</p>' 
     }).click(function(e) { 
      $(this).popover('show'); 
      $('.popover-content').prepend('<a class="close">&times;</a>'); 
      $('.close').click(function(e){ 
       $('[data-toggle=popover]').popover('hide'); 
      }); 
     e.preventDefault(); 
    }); 
} 
1

首先要做的事情是將事件處理包裝在一個函數中,傳入你想要的元素和選項。由於我們只需要內容和展示位置,因此我們可以單獨通過這些內容。如果我們想讓調用者定義所有我們想要在對象文字中傳遞的屬性,而不是使用具有5個參數的函數。

var attachHandlers = function(element, content_, placement_) {      
    element.popover({                 
     html: true,                 
     trigger: 'manual',               
     placement: placement_,              
     container: element,               
     content: content_                
    }).click(function(e) {               
     $(this).popover('show');              
     $(this).find('.popover-content').prepend('<a class="close">&times;</a>');  
     $('.close').click((function(elem) {           
      return function() { $(elem).popover('hide'); };       
     })(this));                 
     e.preventDefault();               
    });                    
};                     

var content2 = '<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus ' +   
    'vel augue laoreet rutrum faucibus #2</p>';          
var content3 = '<h2>EPS Trailing 12 Months</h2><p>Vivamus sagittis lacus ' +   
    'vel augue laoreet rutrum faucibus #3</p>';          

$(document).ready(function() {              
    attachHandlers($('#popover-2'), content2, 'right');        
    attachHandlers($('#popover-3'), content3, 'bottom');        
});    

有當X前置到與酥料餅,內容類的所有元素,因爲你最終會在前面加上一個X所有酥料餅的錯誤不是簡單的新的。

相關問題