2016-01-20 15 views
2

讓我解釋的麻煩是什麼。我有兩個函數:compute();discount_compute();。當頁面第一次加載時,兩個函數都會執行一次(OK,因爲discount_compute()是compute的一部分,所以它在compute()執行時總是運行)。功能discount_compute運行,因爲$(「#自動競標」)上(「點擊」,()的函數 1倍,但隨後它:當我打開#自動競標面板(最初沒有將其設置在顯示屏上)。還運行2輪因爲「[數據滑塊]」的次)。對(「change.fndtn.slider」)。 Btw每次這個自動關閉面板關閉或打開滑塊重新初始化。我只想在打開#autobid-panel時運行一次discount_compute()。有任何想法嗎?麻煩與jQuery事件和函數觸發

function compute() { 
//first function 
}; 

function discount_compute() { 
//second function 
}; 

$(document).ready(function($) { 

    $('.price').change(compute).change(); 

    $('#autobid').on('click', function() { 
    if ($(this).is(':checked')) { 
      $('#autobid-panel').removeClass("hide"); 
      $(document).foundation('slider', 'reflow'); 
      discount_compute(); 
     } else { 
      $('#autobid-panel').addClass("hide"); 
      $(document).foundation('slider', 'reflow'); 
     } 
    }); 

    $('#discount').on('change', function(){ 
    var value = $(this).val(); 
    $('.range-slider').foundation('slider', 'set_value', value); 
    discount_compute(); 
    }); 

    $('[data-slider]').on('change.fndtn.slider', function(){ 
    discount_compute(); 
    }); 

}); 

感謝您的幫助!

+0

哎呀,你可以在上面'VAR hasRun'添加一個全局變量,它最初設定爲'FALSE'。初始運行後,將其設置爲「true」,然後檢查該變量是否爲「false」,允許運行,否則不會。 – JonH

回答

1

你真的不解釋數據滑塊的推理或爲什麼你甚至稱之爲discount_compute();那裏,如果你不想運行它。

一個骯髒的黑客,你可以做的是值得這樣的效果:

function compute() { 
//first function 
}; 

function discount_compute() { 
//second function 
}; 

var harRun=false; 
$(document).ready(function($) { 
    $('.price').change(compute).change(); 

    $('#autobid').on('click', function() { 
    if ($(this).is(':checked')) { 
      $('#autobid-panel').removeClass("hide"); 
      $(document).foundation('slider', 'reflow'); 
      if(hasRun != true) {discount_compute(); hasRun=true;} 
     } else { 
      $('#autobid-panel').addClass("hide"); 
      $(document).foundation('slider', 'reflow'); 
     } 
    }); 

    $('#discount').on('change', function(){ 
    var value = $(this).val(); 
    $('.range-slider').foundation('slider', 'set_value', value); 
    discount_compute(); 
    }); 

    $('[data-slider]').on('change.fndtn.slider', function(){ 
    if(hasRun != true) {discount_compute();} 
    }); 
}); 

這樣,一旦hasRun設置爲true你不再叫discount_compute()

+0

嘿,這是一個非常好的黑客,它並不完美,但我會用這個作進一步擺弄。謝謝 – Svedr

1

不幸的是$(document).foundation('slider', 'reflow');發生了一個change事件,所以沒有任何好的方法。

一種方法是off事件reflowon直前後: -

function compute() { 
//first function 
}; 

function discount_compute() { 
//second function 
}; 

$(document).ready(function($) { 

    $('.price').change(compute).change(); 

    $('#autobid').on('click', function() { 
    if ($(this).is(':checked')) { 
      $('#autobid-panel').removeClass("hide"); 
      $('[data-slider]').off('change.fndtn.slider', discount_compute); 
      $(document).foundation('slider', 'reflow'); 
      $('[data-slider]').on('change.fndtn.slider', discount_compute); 
      discount_compute(); 
     } else { 
      $('#autobid-panel').addClass("hide"); 
      $(document).foundation('slider', 'reflow'); 
     } 
    }); 

    $('#discount').on('change', function(){ 
    var value = $(this).val(); 
    $('.range-slider').foundation('slider', 'set_value', value); 
    discount_compute(); 
    }); 

});