整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          HTML5前端教程分享:JavaScript定時器

          JS的定時器目前有三個:setTimeout、setInterval和setImmediate。

          內(nèi)容是《Web前端開發(fā)之Javascript視頻》的課件,請配合大師哥《Javascript》視頻課程學(xué)習(xí)。

          計時器:

          Javascript是單線程語言,但它允許通過設(shè)置超時和間歇時間值來調(diào)度代碼在特定的時刻執(zhí)行;其是通過setTimeout()和setInterval()兩個window對象的全局函數(shù)實現(xiàn)的,用來注冊在指定的時間之后單次或重復(fù)調(diào)用的函數(shù);

          setTimeout():

          延遲代碼執(zhí)行(也叫超時調(diào)用):用來實現(xiàn)一段代碼在指定的毫秒之后運行;

          語法:window.setTimeout(code,delay),code要執(zhí)行的代碼,可以是一個包含Javascript的代碼字符串,也可以是一個函數(shù),delay等待的毫秒數(shù);

          // 不建議傳遞字符串
          setTimeout("alert('zeronetwork')",3000);
          // 推薦的使用方式
          setTimeout(function(){
              alert('zeronetwork');
          },3000);
          // 推薦的使用方式
          setTimeout(show,3000);
          function show(){
              alert('zeronetwork');
          }

          因為歷史原因,第一個參數(shù)可以傳遞字符串,但有可能導(dǎo)致性能損失,因為這個字符串會在指定的超時時間之后進(jìn)行求值,相當(dāng)于執(zhí)行eval(),因此不推薦使用字符串的形式;

          // 能達(dá)到無限循環(huán)的目的
          var n = 0;
          function fun(){
              n++;
              console.log(n);
              setTimeout(fun, 1000);
          }
          fun();  // 直接執(zhí)行
          setTimeout(fun,3000);

          第二個參數(shù)是一個表示等待多長時間的毫秒數(shù),但經(jīng)過該時間后指定的代碼并不一定會執(zhí)行;Javascript是一個單線程的解釋器,因此一定時間內(nèi)只能執(zhí)行一段代碼;為了控制要執(zhí)行的代碼,就有一個Javascript任務(wù)隊列,這些任務(wù)會執(zhí)照將它們添加到隊列的順序執(zhí)行;這個參數(shù)實際上是告訴Javascript再過多長時間把當(dāng)前任務(wù)添加到隊列中,如果隊列是空的,那么添加的代碼會立即執(zhí)行,如果隊列不是空的,那么它就要等前面的代碼執(zhí)行完畢后再執(zhí)行;

          另外,如果該參數(shù)為0,也并不一定會立即執(zhí)行,因為也需要將它放到隊列中,等待前面的任務(wù)全部執(zhí)行完后,才會“立即”執(zhí)行;

          setTimeout()方法會返回一個數(shù)字ID,ID本質(zhì)上是要延遲進(jìn)程的ID,是計劃執(zhí)行代碼的唯一標(biāo)識符;可以使用clearTimeout()方法,調(diào)用此ID,達(dá)到取消超時調(diào)用的目的;

          var timeoutid = setTimeout(function(){
              alert("zeronetwork");
          },3000);
          console.log(timeoutid);
          clearTimeout(timeoutid);

          只要是在指定的時間尚未過去之前調(diào)用clearTimeout(),就可以完全取消超時調(diào)用;

          <input type="button" value="開始" onclick="showClock()" />
          <input type="button" value="取消" onclick="window.clearTimeout(ident)" />
          <div id="showtime">time</div>
          <script>
          function showClock(){
              var d = new Date();
              var showtime = document.getElementById("showtime");
              showtime.innerHTML = d.toLocaleString();
              // ident = setTimeout(showClock(), 1000);
              ident = setTimeout("showClock()", 1000);
          }
          </script>

          示例:可以利用 clearTimeout() 方法在特定條件下清除延遲處理代碼。例如,當(dāng)鼠標(biāo)指針移過某個元素,停留半秒鐘之后才會彈出提示信息,一旦鼠標(biāo)指針移出當(dāng)前元素,就立即清除前面定義的延遲處理函數(shù),避免干擾;

          <h1>零點網(wǎng)絡(luò)</h1>
          <div>零點教育是從事IT教育</div>
          <p>主講:零點網(wǎng)絡(luò)</p>
          <script>
          var o = document.getElementsByTagName('body')[0].childNodes;
          for(var i=0; i<o.length; i++){
              o[i].onmouseover = function(i){
                  return function(){
                      f(o[i]);
                  }
              }(i);
              o[i].onmouseout = function(i){
                  return function(){
                      clearTimeout(o[i].out);
                  }
              }(i);
          }
          function f(o){
              o.out = setTimeout(function(){
                  console.log(o.tagName + ":" + o.innerText);
              },500);
          }
          </script>

          除前兩個參數(shù)之外,HTML5規(guī)范還允許setTimeout()傳入額外的參數(shù),并在調(diào)用函數(shù)時把這些參數(shù)傳遞過去;

          setTimeout(function(str,age){
              alert(str + "age:" + age);
          },3000,"wangwei",18);

          時間間隔setInterval():

          代碼延遲執(zhí)行機(jī)制在執(zhí)行一次后就失效,而在應(yīng)用中,有時希望某個程序能反復(fù)執(zhí)行,比如說倒計時等,需要每秒執(zhí)行一次;為此可以使用window方法的setInterval方法,其會按照指定的時間間隔重復(fù)執(zhí)行代碼,直到取消或頁面被卸載;其與setTimeout()類似,參數(shù)也一致;

          // 不建議使用字符串
          setInterval("console.log('zero')", 3000);
          // 推薦的方式
          setInterval(function(){
              console.log('zero');
          },3000);
           
          function timer(){
              var d = new Date();
              document.getElementById("result").innerText = d.toLocaleTimeString();
          }
          setInterval(timer,1000);
           
          // 輸出的時間并不精確,并不是整1000毫秒
          var firstTime = new Date().getTime();
          setInterval(function(){
              var lastTime = new Date().getTime();
              console.log(lastTime - firstTime);
              // alert("ok");  // 會暫停
              firstTime = lastTime;
          },1000);
          同setTimeout()一樣,setInterval()也支持第三個參數(shù);

          取消間隔性執(zhí)行代碼:

          使用setInterval()方法同樣會返回一個間隔調(diào)用ID,該ID可用于在將來某個時間取消間隔調(diào)用;可以使用clearInterval方法移除間隔調(diào)用,其接收一個計時器ID作為參數(shù);

          // 如果不使用它的返回值,可以直接使用數(shù)字1、2...
          var i = 0;
          setInterval(function(){
              console.log(i++);
              if(i>10)
                  clearInterval(1);
          },1000);

          取消間隔調(diào)用的重要性要遠(yuǎn)遠(yuǎn)高于取消超時調(diào)用,因為在不取消的情況下,間隔調(diào)用將會一直執(zhí)行到頁面卸載;

          var num = 0, max = 10;
          var intervalId = null;
          function incNum(){
              num++;
              console.log(num);
              // 如果執(zhí)行次數(shù)達(dá)到了max設(shè)定的值,則取消后續(xù)的調(diào)用
              if(num == max){
                  clearInterval(intervalId);
                  alert("結(jié)束");
              }
          }
          intervalId = setInterval(incNum, 1000);
           
          // 另外
          var mInput = document.getElementsByTagName('input')[0];
          var sInput = document.getElementsByTagName('input')[1];
          var m = 4,s = 52;
          var timer = setInterval(function(){
              s++;
              if(s == 60){
                  s = 0;
                  m++;
              }
              sInput.value = s;
              mInput.value = m;
              if(m == 5)
                  clearInterval(timer); 
          },1000);

          setTimeout()與setInterval()同時使用時,其返回的id也會按順序返回;

          在某些時候 setTimeout()與 setInterval() 可以實現(xiàn)同樣的效果;

          var num = 0, max = 10;
          function incNum(){
              num++;
              console.log(num);
              // 如果執(zhí)行次數(shù)達(dá)到了max設(shè)定的值,則取消后續(xù)的調(diào)用
              if(num < max){
                  setTimeout(incNum, 1000)
              }else{
                  alert("結(jié)束");
              }
          }
          setTimeout(incNum, 1000);

          在使用超時調(diào)用時,沒有必要使用超時調(diào)用ID,因為每次執(zhí)行代碼之后,如果不再設(shè)置另一次超時調(diào)用,調(diào)用就會自動停止;

          一般認(rèn)為,使用延遲代碼來模擬時間間隔是一種最佳方式;在開發(fā)環(huán)境中,很少使用時間間隔,因為時間間隔可能會在前一個間隔調(diào)用結(jié)束之前啟動,而延遲代碼完全可以避免這一點;

          <div id="loadBar" style="border: red 1px solid;"></div>
          <script>
          var num = 0;
          var colors = ['#494949','#646464','#747474','#888888','#969696','#A8A8A8','#B6B6B6','#C6C6C6','#D7D7D7','#E1E1E1','#F0F0F0','#F9F9F9'];
          function loading(){
              num++;
              var loadBar = document.getElementById("loadBar");
              loadBar.style.color = colors[num-1];
              loadBar.innerHTML = loadBar.innerHTML + "■";
              if(num < 12){
                  setTimeout(loading, 1000);
              }else{
                  loadBar.style.display = "none";
                  window.open("https://www.zeronetwork.cn/","new");
              }
          }
          window.onload = loading;
          </script>
           
          /*
          定時器應(yīng)用函數(shù) invoke 
          如果只傳遞f,start,則使用setTimeout
          如果沒有傳遞end,則永久循環(huán)執(zhí)行f,否則在end后停止
          */
          function invoke(f, start, interval, end){
              if(!start) start = 0;  // 默認(rèn)設(shè)置為0毫秒
              if(arguments.length <= 2)  // 單次調(diào)用模式
                  setTimeout(f, start); 
              else{                   // 多次調(diào)用模式
                  setTimeout(repeat, start);  // 若干秒后調(diào)用repeat()
                  function repeat(){
                      var h = setInterval(f, interval);  // 循環(huán)調(diào)用f()
                      // 在end毫秒后停止調(diào)用,前提是end已經(jīng)定義了
                      if(end){
                          setTimeout(function(){
                              clearInterval(h);
                          }, end);
                      }
                  }
              }
          }
          invoke(function(){
              console.log("wangwei");
          },1000,2000,5000);


          Web前端開發(fā)之JavaScript-零點程序員-王唯

          5工具中,比較常聽到的是易企秀這種以APP為主的移動展示工具。這種類型的H5工具,定位為手機(jī)PPT的在線展示,操作簡單,個人用戶較多。

          但從功能豐富度和實用性角度,國內(nèi)屬于行業(yè)頂尖的是iH5和意派兩家,它們具有兩個共同的基本特征:

          (1)提供HTML5頁面的可視化編輯器;

          (2)通過電腦端網(wǎng)頁在線制作,能一鍵生成鏈接。

          然而,兩者在本質(zhì)上有所差別,iH5偏向于底層交互,意派偏向于輕度營銷。這兩個區(qū)別表面看上去很簡單,背后有什么深意?

          ·

          1張圖:用戶的差別

          類比圖像制作軟件,可以簡單地概括為:

          • iH5:H5界的Photoshop,以企業(yè)用戶為主;

          • 意派:H5界的美圖秀秀,以個人用戶為主。

          從上圖可以看出,使用iH5的設(shè)計師,主要接受不同規(guī)模公司的定制需求,但也有部分個人用戶。由于面向底層交互,iH5提供的功能都是基礎(chǔ)應(yīng)用類型的,基本替代了傳統(tǒng)上由專業(yè)程序員編寫HTML5代碼的工作,更受企業(yè)青睞。因此,使用該工具的設(shè)計師一般處于品牌推廣團(tuán)隊中,負(fù)責(zé)成品頁面的實現(xiàn)。

          使用意派的設(shè)計師,大部分接受來自個人或小公司的制作需求,但也有部分企業(yè)用戶。這種面向輕營銷的H5工具,相當(dāng)于把PPT實現(xiàn)的功能通過在線網(wǎng)頁展示出來,交互思路以翻頁為主,更適用于個人用戶。但由于個人市場目前被易企秀這類更容易上手的APP所占領(lǐng),意派所占份額實際比較有限。

          ·

          2-3張圖:功能的差別

          H5頁面制作服務(wù)所需組件主要有四種類型:

          (1)多媒體:iH5比意派多6個功能;

          (2)容器:iH5比意派多6個功能;

          (3)數(shù)據(jù)應(yīng)用:iH5比意派多7個功能;

          (4)特效:iH5比意派多8個功能.

          在上圖中,標(biāo)示Epub 360的四個彩色區(qū)域表示意派和iH5重疊的組件服務(wù),灰色區(qū)域表示iH5獨有的組件。

          意派在多媒體方面提供的服務(wù)與iH5比較接近,但在容器、數(shù)據(jù)應(yīng)用和特效三個方面都不及iH5的二分之一。如果只計算意派不具有的組件服務(wù),iH5比意派多27個組件,但由于兩種工具部分組件存在交叉現(xiàn)象,從總量上看相差20個。

          為什么會產(chǎn)生這樣的差距?

          ·

          4張圖:性能的差別

          在iH5獨有的組件中,具有決定性作用的是“萬金油”式的事件(組),能通過邏輯判斷為其他組件拓展出無限種可能:

          • 手指按住屏幕的時間長短;

          • 手勢擦除面積的大小;

          • 微信錄音的開始或結(jié)束;

          • 數(shù)據(jù)提交次數(shù)是否超限。

          上圖是iH5在視頻組件下添加一個事件時,配套的18種觸發(fā)條件,表示能為視頻做18種邏輯判斷。

          是否使用事件機(jī)制,對工具性能有很大影響——

          (1)通過事件,iH5的設(shè)計師能對交互行為進(jìn)行邏輯判斷,并設(shè)計各種各樣的反饋動作,比如設(shè)置視頻播放到某一時刻時彈出廣告。因此,用戶能利用事件的組合,規(guī)定成千上萬種“如果……就……”的反應(yīng)情形。

          (2)沒有事件,所有的組件都是割裂的,比如視頻的播放只能局限在視頻組件內(nèi)部進(jìn)行控制。這也導(dǎo)致意派有很多組件存在重復(fù)功能,因為每個組件的反饋機(jī)制基本是獨立的。

          在事件的幫助下,設(shè)計師可以實現(xiàn)很多傳統(tǒng)上必須程序員介入才能完成的交互邏輯。既然事件那么重要,為什么國內(nèi)H5工具中只有iH5使用事件機(jī)制?

          ·

          5張圖:結(jié)構(gòu)的差別

          實際上,iH5和意派的差別取決于工具結(jié)構(gòu)上的差異:

          • iH5:使用“對象樹”管理資源,頁面作為眾多資源的一種;

          • 意派:使用頁面布局,主要提供基于頁面的翻頁交互。

          下圖為兩個工具的編輯界面。



          iH5以交互作為出發(fā)點,采用DOM(文檔對象模型)結(jié)構(gòu),提供的組件基本是對象類型的,諸如屏幕、時間軸、數(shù)據(jù)庫等。因此,用戶能通過“對象樹”對不同類型的組件進(jìn)行管理,這也是事件機(jī)制可行的基礎(chǔ)。

          意派則以模板作為出發(fā)點,采用頁面結(jié)構(gòu),提供的組件基本是模塊類型的,諸如相冊、計時器等。實際上,這種工具相當(dāng)于收集不同類型HTML5網(wǎng)頁模板的源碼,把它們拆解成不同模塊,再分別開發(fā)成套件。因此,用戶只能在預(yù)設(shè)格式的套件內(nèi)調(diào)整內(nèi)容,拓展性較低。

          ·

          6張圖:成本的差別

          從費用上來看,兩種工具的使用成本也有所差異:

          • iH5:所有組件的使用均免費,對4種服務(wù)按需收費;

          • 意派:7個組件的使用需要付費,對12種服務(wù)收取年費。



          意派將賬號分為體驗版、基礎(chǔ)版、專業(yè)版、企業(yè)版和企業(yè)增強(qiáng)版五種類型,在作品創(chuàng)建數(shù)量、存儲空間、表單、數(shù)據(jù)應(yīng)用等基礎(chǔ)功能上均有限制,并對加載LOGO等服務(wù)進(jìn)行收費,年費最高達(dá)59999元。

          iH5對自定義微信授權(quán)、自定義LOGO加載、調(diào)用第三方JS函數(shù)和作品嵌入第三方網(wǎng)站四種主要用于企業(yè)的服務(wù)進(jìn)行收費,其中微信授權(quán)費用為1元/月,所有增值服務(wù)按年計最高為12012元,為意派的五分之一。

          ·

          雖然iH5和意派均提供基于云端的可視化編輯服務(wù),但通過用戶、功能、性能、結(jié)構(gòu)、和成本五個方面的對比,可以看出兩者還是存在很大區(qū)別。

          簡單地說,意派屬于輕度營銷類H5工具,是通過利用HTML5的跨平臺特性,把傳統(tǒng)的離線PPT轉(zhuǎn)換為在線展示;而iH5是以交互為思路的基礎(chǔ)工具,能最大程度地取代程序員在網(wǎng)頁設(shè)計中的角色。


          主站蜘蛛池模板: 国产凸凹视频一区二区| 亚洲国产精品一区二区第一页免| 日韩精品福利视频一区二区三区| 激情亚洲一区国产精品| 秋霞电影网一区二区三区| 国模精品一区二区三区| 亚洲天堂一区二区三区| 亚洲码欧美码一区二区三区| 任你躁国语自产一区在| 亚欧成人中文字幕一区| 亚洲国产系列一区二区三区| 无码精品久久一区二区三区 | 色偷偷久久一区二区三区| 无码少妇一区二区浪潮av| 亚洲第一区精品日韩在线播放| 国产成人精品一区二三区| 久久99国产精一区二区三区| 性色AV一区二区三区天美传媒| 国产精品一区二区三区免费| 久久国产精品无码一区二区三区 | 精品无码成人片一区二区| 成人精品视频一区二区三区不卡 | 国产日韩精品一区二区三区 | 国产精品分类视频分类一区| 日本人真淫视频一区二区三区| 亚洲AV无码第一区二区三区| 韩国精品一区视频在线播放| 精品性影院一区二区三区内射 | 麻豆一区二区免费播放网站| 国产精品高清一区二区三区| 国产一区二区三区影院| 在线视频一区二区三区三区不卡| 亚洲精品色播一区二区| 日韩人妻一区二区三区免费| 亚洲bt加勒比一区二区| 国产亚洲日韩一区二区三区| 国产一区二区三区在线免费观看| 3D动漫精品啪啪一区二区下载| 无码乱人伦一区二区亚洲| 国产精品一区二区av| 久久精品国产第一区二区三区|