2011-01-18 13 views
0

私は数時間それを把握しようとしていましたが、私は成功しませんでした。このCounterアップルから10億ダウンロード賞。フラッシュはまったく使用されません.JavaScriptと0-9の画像しかないので、本当にクールです。今すぐstackoverflowがGoogleのパックマンを抽出するために成功した後、私たちはそれを行うことはできますか?アップルの10億カウントダウンを抽出するには?

P.Sプロトタイプを使用しているのか、スクリプトを使用しているのかは分かりません。

+0

「抽出する」とはどういう意味ですか?それがどのように動作するかを推測する際に助けを求めていますか、それが表示されている現在の値をデコードしたいのですか? – Phrogz

+0

他の用途と簡単な変更のためにページから抜け出すことを意味します。 – Ryan

+0

ページの何が得られますか?値、またはスクリプトですか? – Phrogz

答えて

3

はここにある:それはCSSと相まってJS counterだようhttp://images.apple.com/global/scripts/downloadcounter.js

StepTimingFunction = { 
    timingFunctionForStepCount: function (a) { 
     return function (b) { 
      return ((b * (a - 1)) >> 0)/((a - 1)) 
     } 
    } 
}; 
DownloadCounter = Class.create(); 
Object.extend(DownloadCounter.prototype, { 
    initialize: function (a) { 
     this._url = a; 
     this.loadData(); 
     this._isCounting = true 
    }, 
    setIsCounting: function (a) { 
     this._isCounting = a 
    }, 
    stop: function() { 
     if (this._isCounting) { 
      if (this._drawTimeout) { 
       window.clearTimeout(this._drawTimeout) 
      } 
      this.setIsCounting(false); 
      if (this._delegate && typeof this._delegate.counterDidStop === "function") { 
       this._delegate.counterDidStop(this) 
      } 
     } 
    }, 
    start: function() { 
     if (!this._isCounting) { 
      this.loadData(); 
      this.setIsCounting(true); 
      if (this._delegate && typeof this._delegate.counterDidStart === "function") { 
       this._delegate.counterDidStart(this) 
      } 
     } 
    }, 
    isCounting: function() { 
     return this._isCounting 
    }, 
    _delegate: null, 
    setDelegate: function (a) { 
     this._delegate = a 
    }, 
    delegate: function() { 
     return this._delegate 
    }, 
    loadData: function() { 
     if (this._nextUpdateTimeout) { 
      window.clearTimeout(this._nextUpdateTimeout); 
      this._nextUpdateTimeout = null 
     } 
     var a = document.location.href.toString(); 
     a = a.replace(/.apple.com\/.*$/, ".apple.com"); 
     new Ajax.Request((a + this._url + "?r=" + Math.random()), { 
      method: "get", 
      onSuccess: this.dataRequestDidFinishLoading.bind(this) 
     }) 
    }, 
    dataRequestDidFinishLoading: function (o) { 
     var k = o.responseText.split("|"), 
      n, d, j, g, l, h, b, f, e, m, a, i, c; 
     localServerBasedReferenceTime = Date.parse(o.getResponseHeader("Date")); 
     if (k.length === 3) { 
      n = k[0].split(" "); 
      d = n[1]; 
      date = n[0].split("-"); 
      this.setRate(parseInt(k[2])/3600000); 
      l = date[0]; 
      g = date[1]; 
      j = date[2]; 
      a = Date.parse(g + " " + l + ", " + j + " " + d + " GMT-0700"); 
      e = new Date(a + 3600000); 
      m = e.getTime() - a + 1000; 
      this._nextUpdateTimeout = setTimeout(this.loadData.bind(this), m); 
      if (typeof localServerBasedReferenceTime === "number") { 
       this._lastReferenceTime = localServerBasedReferenceTime 
      } else { 
       b = new Date(); 
       this._lastReferenceTime = b.getTime() 
      } 
      f = this._lastReferenceTime - a; 
      i = Math.floor(parseInt(k[1]) + f * (this._rate)); 
      this.setCurrentCount(i); 
      this.setNeedsDisplayIfNeeded() 
     } 
    }, 
    setNeedsDisplayIfNeeded: function() { 
     if (!this._drawTimeout) { 
      this._drawTimeout = setTimeout(this.draw.bind(this), this._drawRefreshRate) 
     } 
    }, 
    setElement: function (c) { 
     this._element = c; 
     var b = this._element.getElementsByClassName("digitGroupSeparator"); 
     if (b.length > 0) { 
      var a = b[0]; 
      this._element.removeChild(a); 
      this.setDigitGroupSeparatorTemplateElement(a) 
     } 
     this._element.empty(); 
     this.createDigitElementsIfNeeded(); 
     this.setNeedsDisplayIfNeeded() 
    }, 
    setDigitGroupSeparatorTemplateElement: function (a) { 
     this._digitGroupSeparatorTemplateElement = a 
    }, 
    _currentCount: 0, 
    setCurrentCount: function (a) { 
     if (a !== this._currentCount) { 
      this._currentCount = a; 
      this.createDigitElementsIfNeeded() 
     } 
    }, 
    digitTemplateElement: function() { 
     if (!this._digitTemplateElement) { 
      this._digitTemplateElement = document.createElement("span"); 
      $(this._digitTemplateElement).addClassName("digit"); 
      var a = document.createElement("div"), 
       b = document.createElement("div"), 
       c = document.createElement("div"); 
      $(a).addClassName("digitText"); 
      $(b).addClassName("digitImage"); 
      this._digitTemplateElement.appendChild(a); 
      this._digitTemplateElement.appendChild(b); 
      $(c).addClassName("digitImageElement"); 
      b.appendChild(c.cloneNode(true)); 
      b.appendChild(c) 
     } 
     return this._digitTemplateElement 
    }, 
    createDigitElementsIfNeeded: function() { 
     if (this._element && (!this._digitElements || this._digitElements.length !== this._currentCount.toString().length)) { 
      this._element.empty(); 
      this._createDigitElements() 
     } 
    }, 
    _createDigitElements: function() { 
     if (!this._digitElements) { 
      this._digitElements = [] 
     } 
     var e = 0, 
      b = (this._maxCount && this._currentCount >= this._maxCount) ? this._maxCount.toString().length : this._currentCount.toString().length, 
      c = document.createDocumentFragment(), 
      a, h = this.digitTemplateElement(), 
      g = this._digitGroupSeparatorTemplateElement, 
      d = (this._maxCount && this._currentCount >= this._maxCount) ? String(this._maxCount) : String(this._currentCount), 
      f; 
     if (!g) { 
      g = document.createElement("span"); 
      $(g).addClassName("digitGroupSeparator") 
     } 
     for (e = 0 + this._digitElements.length; e < b; e++) { 
      a = h.cloneNode(true); 
      f = parseInt(d.charAt(b - (e + 1))); 
      a.lastChild.style.top = "-" + (f * (this._digitImageAnimationCount * this._digitImageHeight)) + "px"; 
      this._digitElements[e] = a; 
      if (e > 0 && ((e) % 3 == 0)) { 
       c.insertBefore(g.cloneNode(true), c.firstChild) 
      } 
      c.insertBefore(a, c.firstChild) 
     } 
     this._element.insertBefore(c, this._element.firstChild) 
    }, 
    currentCount: function() { 
     return this._currentCount 
    }, 
    setRate: function (a) { 
     this._rate = a 
    }, 
    rate: function() { 
     return this._rate 
    }, 
    _drawRefreshRate: 50, 
    _digitImageHeight: 38, 
    setDigitImageHeight: function (a) { 
     this._digitImageHeight = a 
    }, 
    _digitImageAnimationCount: 6, 
    setDigitImageAnimationCount: function (a) { 
     this._digitImageAnimationCount = a 
    }, 
    _maxCount: false, 
    setMaxCount: function (a) { 
     this._maxCount = a 
    }, 
    draw: function() { 
     window.clearTimeout(this._drawTimeout); 
     this._drawTimeout = null; 
     var h = this._drawRefreshRate, 
      e, j, k, c, a, l, o, b, n, d, m, p = this._digitImageHeight * this._digitImageAnimationCount, 
      g, f = this._digitElements, 
      q; 
     if (this._element) { 
      m = String(this._currentCount); 
      this._currentCount = this._currentCount + Math.floor(this._rate * h); 
      if (this._delegate && typeof this._delegate.counterDidReachValue === "function") { 
       this._delegate.counterDidReachValue(this, this._currentCount) 
      } 
      if (this._maxCount && this._currentCount >= this._maxCount) { 
       this._isCounting = false 
      } 
      if (!this._isCounting) { 
       return 
      } 
      e = (this._maxCount && this._currentCount >= this._maxCount) ? String(this._maxCount) : String(this._currentCount); 
      j = e.length; 
      k = j - 1; 
      for (c = k; c >= 0; c--) { 
       l = parseInt(e.charAt(c)); 
       o = parseInt(m.charAt(c)); 
       if (l !== o) { 
        if (!((k - c) < f.length)) { 
         this._createDigitElements() 
        } 
        a = f[k - c].lastChild; 
        if (a.___animating !== true) { 
         n = o * p; 
         if (l > o) { 
          b = l * p 
         } else { 
          b = (o + (10 - o) + l) * p 
         } 
         if (a.style.top !== (d = "-" + n + "px")) { 
          a.style.top = d 
         } 
         g = 1 + ((b - n)/this._digitImageHeight); 
         a.___animating = true; 
         q = new Effect.Move(a, { 
          x: 0, 
          y: (-1 * b), 
          duration: 0.4, 
          mode: "absolute", 
          transition: StepTimingFunction.timingFunctionForStepCount(g) 
         }); 
         q.__element = a; 
         q.finish = function (i) { 
          if (window.removeEventListener) { 
           window.removeEventListener("unload", arguments.callee, false) 
          } 
          if (this.__element !== undefined) { 
           this.__element.___animating = false 
          } 
         }; 
         if (window.addEventListener) { 
          window.addEventListener("unload", q.finish, false) 
         } 
        } 
       } 
      } 
     } 
     this._lastReferenceTime = (this._lastReferenceTime + h); 
     this.setNeedsDisplayIfNeeded() 
    } 
}); 
1

が見えます。

+0

そしていくつかの[スプライトimages](http://images.apple.com/home/images/counter_filmstrip20110114.png)。 – Phrogz

1

スクリプト全体の炉床は、この単一のイメージである:http://images.apple.com/itunes/10-billion-app-countdown/images/filmstrip.png

今、すべては明らかです。

  1. 一桁のHTMLプレースホルダ:プレースホルダのスタイル

    <div class="digit-placeholder"></div> 
    
  2. CSS:

    .digit-placeholder { 
        /* Dimensions of a single "frame" */ 
        width: 50px; 
        height: 75px; 
    
        background-image: url(...); 
        background-position: 0 0; 
    } 
    
  3. は、あなただけの背景(background-positonプロパティ)を移動する必要が7桁を表示するには次の座標に:0 -2800px(これはほんの一例です)。 8を表示するには0 -3400pxに移動してください。

  4. アニメーションを作成するには(7から8に変更)、背景を-2800から-3400に移動して、一定の時間内に60ステップずつ移動させるだけです(0.5秒とします)。

あなたがしなければならないことは、それを数回(10億回で10回)複製し、各桁の時間を計算することだけです。

0

私はベッドに行く前に:

var number = ''; 
$('.digitImage').each(function(i) { 
    number += Math.abs($(this).position().top)/618; 
}); 
console.log(+number); 

今どのくらいそれがかかりましたか? 3分でjQueryを注入するためのChromeにブックマークレットをインストールする方法を理解しようとしています... 5分以上かかります。

関連する問題