2014-02-13 42 views
-1

我在javaScript中有以下功能。当我检测到需要重新加载样式表时调用此函数。例如,用户语言改变,所以文本不再适合按钮。问题是,它陷入了setInterval部分。循环到它无尽的。我可以在chrome调试器中看到它确实进入了clearInterval部分 - 但它不会清除。此函数 - resetStyle - 仅调用一次。 任何人都可以请帮忙吗? 谢谢!clearInterval在调用recursivly时不起作用

p.resetStyle = function() { 
    var that = this; 
    var oldStylesheet_href = $('#mainStylesheet').attr("href"); 
    var i = oldStylesheet_href.indexOf('lang'); 
    var lastLanguege = oldStylesheet_href.substring(i + 5, i + 7); 
    var prefix, sufix; 

    if (lastLanguege === createjs.mainManager.LangString) { 
     return; 
    } 

    prefix = oldStylesheet_href.substring(0, i - 1); 
    sufix = '&' + oldStylesheet_href.substring(i + 7, oldStylesheet_href.length); 


    var head = document.getElementsByTagName('head')[0]; // reference to document.head for appending/ removing link nodes 
    var link = document.createElement('link'); // create the link node 
    link.setAttribute('id', 'newStylesheet'); 
    link.setAttribute('href', prefix + '&lang=' + createjs.mainManager.LangString + sufix); 
    link.setAttribute('rel', 'stylesheet'); 
    link.setAttribute('type', 'text/css'); 

    var sheet, cssRules; 
    // get the correct properties to check for depending on the browser 
    if ('sheet' in link) { 
     sheet = 'sheet'; 
     cssRules = 'cssRules'; 
    } else { 
     sheet = 'styleSheet'; 
     cssRules = 'rules'; 
    } 

    var timeout_id = setInterval(function() { // start checking whether the style sheet has successfully loaded 
     try { 
      if (link[sheet] && link[sheet][cssRules].length) { // SUCCESS! our style sheet has loaded 
       clearInterval(timeout_id); // clear the counters 
       clearTimeout(timeout_id); 
       that.onStyleReset(); 
      } 
     } catch (e) {} finally {} 
    }, 10), // how often to check if the stylesheet is loaded 
     timeout_id = setTimeout(function() { // start counting down till fail 
      clearInterval(timeout_id); // clear the counters 
      clearTimeout(timeout_id); 
      head.removeChild(link); // since the style sheet didn't load, remove the link node from the DOM 
      that.onStyleReset(); 
     }, 15000); 

    $('head').append(link); 
    $('#mainStylesheet').remove(); 
    link.setAttribute('id', 'mainStylesheet'); 
}; 
+2

你覆盖'timeout_id'分配了'分配给超时timeout_id'到间隔。 – Teemu

+0

也许你应该考虑'timeout_id'的值是多少:) – Luaan

+1

在'var x = 1,x = 2;'中考虑'x'' - 这基本上就是你在做什么。 –

回答

2

你重用了两个不同的东西变timeout_id(您的间隔ID和超时ID),所以你覆盖你的间隔ID,当你调用setTimeout。变化:

var timeout_id = setInterval(... 

到:

var interval_id = setInterval(... 

和更新,你调用clearInterval以及变量:

+0

谢谢!上帝,不敢相信我错过了! : – yogev