2012-11-02 93 views
0

下面的函数将改变<meta ... content="...densityDPI=250dpi" /> 所以密度DPI会在每次循环时减少20dpi。加速递归函数

有没有一种方法可以加快速度,所以它通过比较以前值的比例在大约4个循环中完成......?我认为在x++之前应该有一些东西可以将5改成稍大一些,这样$(window).width()==480就会更快。

$(document).ready(function(){ 
     $('meta[name="viewport"]').remove(); 
     $('<meta name="viewport" id="the_vp_special" content="width=320,target-densityDPI=250dpi"/>').appendTo('head'); 
     setTimeout(function(){ 
      var x = 0; 
      var changeDPI = function (curr){ 
       x++; 
       var sub = 5; 
       if(x>500) return false; 
       var curr = curr?parseInt(curr):320; 
       curr = curr-sub; 
       var txt = $('<meta/>',{name:"viewport",id:"the_vp_special",content:"width=320,initial-scale=1,target-densityDPI="+(parseInt(curr))+"dpi"}); 
       $('#the_vp_special').replaceWith(txt) 
       if($(window).width()==480) {} 
       else setTimeout(function(){ changeDPI(curr); },5); 
      } 
      changeDPI(250); 
     }, 2500); 
    }); 

请问一下,如果不明确,我会尽力解释一下。

+0

你能改变'2500ms'超时延迟吗?或者,这是否需要我不知道的方式? – aefxx

+0

这不是问题,它只是在那里表明整个功能何时开始......更容易接受,我认为如果我改变几次,就可以简化整个事情,并且计算出这个比例它会精确地增加或减少,因为只有一个因素在变化,但它是星期五,我今天似乎无法做数学......,我知道窗宽将是多少,我知道dpi是什么,所以我需要正在找到它们的变化率...每个分辨率的宽度有多少像素:) – Val

+0

像素和dpi之间的常量比率是多少?因为如果有的话,一个简单的交叉乘法就可以做到。见http://en.wikipedia.org/wiki/Cross-multiplication – aefxx

回答

1

好吧,让我直截了当地说:你想要的是将客户端的dpi设置为值x,这样客户端的视口跨越了一个宽度为480px的宽度。

现在,您有两种选择,具体取决于您设置的dpi和显示的像素之间的关系。

  1. 在一个线性关系的情况下(这是很有道理的我):

    $(function)({ 
        var dpi = 250, 
         width; 
    
        $('meta[name="viewport"]').remove(); 
        $('<meta name="viewport" id="the_vp_special" content="width=320,target-densityDPI=250dpi"/>').appendTo('head'); 
    
        setTimeout(function() { 
         width = $(window).width(); 
         dpi = Math.round((480 * dpi)/width); 
    
         $('#the_vp_special').replaceWith(
          $('<meta/>', { 
           name: "viewport", 
           id: "the_vp_special", 
           content: "width=320 ... target-densityDPI="+dpi+"dpi" 
          }) 
         ); 
        }, 2500);    
    }); 
    
  2. 在其他任何关系的情况下,你可能想使用binary search具有最差/平均情况O(log n)的性能。考虑到你的250 dpi和缩小到 - 比方说 - 72 dpi,这将产生平均7次尝试找到正确的分辨率。
    (明天我会用一个例子更新我的帖子......)。

+0

第3号是在第1号('dpi = Math.round((480 * dpi)/宽度);')完成的,但没有超时(更好的方法恕我直言)。无论如何,很高兴你已经解决了它。 – aefxx

+0

好吧,我现在感觉很愚蠢,现在哈哈:)但是,你是对的 – Val

+0

嘿嘿,没关系。这有时发生在我们所有人身上。 – aefxx