2012-11-02 95 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