2016-01-20 51 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(); 
    }); 

});