亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript最基本的函數匯總

2019-11-20 12:08:56
字體:
來源:轉載
供稿:網友

我記得早期的 JavaScript ,要完成任何事情幾乎都繞不開一些簡單的函數,因為瀏覽器提供商實現功能有所差異,而且不只是邊緣功能,基礎功能也一樣,如 addEventListener 和 attachEvent。雖然時代變了,但仍有一些函數是每個開發者都應該掌握的,以便于完成某些功能和提高性能。

debounce

對于高耗能事件,debounce 函數是一種不錯解決方案。如果你不對 scroll、resize、和 key* 事件使用 debounce  函數,那么你幾乎等同于犯了錯誤。下面的 debounce 函數能讓你的代碼保持高效:

// 返回一個函數,如果它被不間斷地調用,它將不會得到執行。該函數在停止調用 N 毫秒后,再次調用它才會得到執行。如果有傳遞 ‘immediate' 參數,會馬上將函數安排到執行隊列中,而不會延遲。function debounce(func, wait, immediate) {  var timeout;  return function() {    var context = this, args = arguments;    var later = function() {      timeout = null;      if (!immediate) func.apply(context, args);    };    var callNow = immediate && !timeout;    clearTimeout(timeout);    timeout = setTimeout(later, wait);    if (callNow) func.apply(context, args);  };}; // 用法var myEfficientFn = debounce(function() {    // 所有繁重的操作}, 250);window.addEventListener('resize', myEfficientFn);

debounce 函數不允許回調函數在指定時間內執行多于一次。當為一個會頻繁觸發的事件分配一個回調函數時,該函數顯得尤為重要。

poll

盡管上面我提及了 debounce 函數,但如果事件不存在時,你就不能插入一個事件以判斷所需的狀態,那么就需要每隔一段時間去檢查狀態是否達到你的要求。

function poll(fn, callback, errback, timeout, interval) {  var endTime = Number(new Date()) + (timeout || 2000);  interval = interval || 100;   (function p() {      // 如果條件滿足,則執行!      if(fn()) {        callback();      }      // 如果條件不滿足,但并未超時,再來一次      else if (Number(new Date()) < endTime) {        setTimeout(p, interval);      }      // 不匹配且時間消耗過長,則拒絕!      else {        errback(new Error('timed out for ' + fn + ': ' + arguments));      }  })();} // 用法:確保元素可見poll(  function() {    return document.getElementById('lightbox').offsetWidth > 0;  },  function() {    // 執行,成功的回調函數  },  function() {    // 錯誤,失敗的回調函數  });

Polling 在 web 中已被應用很長時間了,并在將來仍會被使用。

once

有時候,你想讓一個給定的功能只發生一次,類似于 onload 事件。下面的代碼提供了你所說的功能:

function once(fn, context) {   var result;   return function() {     if(fn) {      result = fn.apply(context || this, arguments);      fn = null;    }     return result;  };} // 用法var canOnlyFireOnce = once(function() {  console.log('Fired!');}); canOnlyFireOnce(); // "Fired!"canOnlyFireOnce(); // nada           // 沒有執行指定函數

once 函數確保給定函數只能被調用一次,從而防止重復初始化!

getAbsoluteUrl

從一個字符串變量得到一個絕對 URL,并不是你想象中這么簡單。對于某些 URL 構造器,如果你不提供必要的參數就會出問題(而有時候你真的不知道提供什么參數)。下面有一個優雅的技巧,只需要你傳遞一個字符串就能得到相應的絕對 URL。

var getAbsoluteUrl = (function() {  var a;   return function(url) {    if(!a) a = document.createElement('a');    a.href = url;     return a.href;  };})(); // 用法getAbsoluteUrl('/something'); // http://davidwalsh.name/something

a 元素的 href 處理和 url 處理看似無意義,而 return 語句返回了一個可靠的絕對 URL。

isNative

如果你想知道一個指定函數是否是原生的,或者能不能通過聲明來覆蓋它。下面這段便于使用的代碼能給你答案:

;(function() {  // 用于處理傳入參數 value 的內部 `[[Class]]`  var toString = Object.prototype.toString;  // 用于解析函數的反編譯代碼 var fnToString = Function.prototype.toString;  // 用于檢測宿主構造器 (Safari > 4 ;真的輸出特定的數組) var reHostCtor = /^[object .+?Constructor]$/;  // 用一個標準的原生方法作為模板,編譯一個正則表達式。 // 我們選擇 'Object#toString' 因為它一般不會被污染。 var reNative = RegExp('^' +  // 將 'Object#toString' 強制轉為字符串   String(toString)  // 轉義所有指定的正則表達式字符  .replace(/[.*+?^${}()|[]/]/g, '$&')  // 用 '.*?' 替換提及的 'toString' ,以保持模板的通用性。  // 將 'for ...' 之類的字符替換掉,以兼容 Rhino 等環境,因為這些環境添加了額外的信息,如方法參數數量。  .replace(/toString|(function).*?(?=()| for .+?(?=])/g, '$1.*?') + '$' );  function isNative(value) {  var type = typeof value;  return type == 'function'   // 用 'Function#toString' (fnToString)繞過了值(value)本身的 'toString' 方法,以免被偽造所欺騙。   ? reNative.test(fnToString.call(value))   // 回退到宿主對象的檢查,因為某些環境(瀏覽器)將類型數組(typed arrays)之類的東西當作 DOM 方法,此時可能不遵循標準的原生正則表達式。   : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false; }  // 導出函數 module.exports = isNative;}()); // 用法isNative(alert); // trueisNative(myCustomFunction); // false

這個函數雖不完美,但它能完成任務!

insertRule

我們都知道能通過選擇器(通過 document.querySelectorAll )獲取一個 NodeList ,并可為每個元素設置樣式,但有什么更高效的方法為選擇器設置樣式呢(例如你可以在樣式表里完成):

var sheet = (function() {    // 創建 <style> 標簽  var style = document.createElement('style');     // 如果你需要指定媒介類型,則可以在此添加一個 media (和/或 media query)   // style.setAttribute('media', 'screen')  // style.setAttribute('media', 'only screen and (max-width : 1024px)')   // WebKit hack :(  style.appendChild(document.createTextNode(''));     // 將 <style> 元素添加到頁面  document.head.appendChild(style);   return style.sheet;})(); // 用法sheet.insertRule("header { float: left; opacity: 0.8; }", 1);

這對于一個動態且重度依賴 AJAX 的網站來說是特別有用的。如果你為一個選擇器設置樣式,那么你就不需要為每個匹配到的元素都設置樣式(現在或將來)。

matchesSelector
我們經常會在進行下一步操作前進行輸入校驗,以確保是一個可靠值,或確保表單數據是有效的,等等。但我們平時是怎么確保一個元素是否有資格進行進一步操作呢?如果一個元素有給定匹配的選擇器,那么你可以使用 matchesSelector 函數來校驗:

function matchesSelector(el, selector) {  var p = Element.prototype;  var f = p.matches || p.webkitMatchesSelector || p.mozMatchesSelector || p.msMatchesSelector || function(s) {    return [].indexOf.call(document.querySelectorAll(s), this) !== -1;  };  return f.call(el, selector);} // 用法matchesSelector(document.getElementById('myDiv'), 'div.someSelector[some-attribute=true]')

就這樣啦,上述 7 個 JavaScript 函數是每個開發者都應該時刻記著的。有哪個函數我錯過了呢?請把它分享出來!

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲成人xxx| 91精品国产成人| 日韩中文在线不卡| 国产亚洲精品久久久久动| 欧美成人精品在线观看| 欧美日韩在线视频一区二区| 少妇激情综合网| 欧美成人黑人xx视频免费观看| 国产精品电影在线观看| 57pao成人国产永久免费| 欧美性xxxx| 国产视频丨精品|在线观看| 精品美女永久免费视频| 96精品久久久久中文字幕| 日韩av理论片| 国产精品678| 8090理伦午夜在线电影| 国内精品视频一区| 国产精品入口尤物| 亚洲成人网在线观看| 国产免费一区二区三区香蕉精| 中文字幕av一区二区| 日本午夜人人精品| 国产免费久久av| 久久久精品一区二区三区| 久久久久国产精品一区| 国产精品永久免费在线| 欧美色欧美亚洲高清在线视频| 亚洲香蕉av在线一区二区三区| 中文字幕自拍vr一区二区三区| 国产精品一区二区三区成人| 亚洲成av人影院在线观看| 一本一本久久a久久精品牛牛影视| 久久九九有精品国产23| 伊人久久综合97精品| 久久精品99国产精品酒店日本| 国产精品入口免费视频一| 久久久成人的性感天堂| 国产成人一区三区| 精品一区二区三区电影| 亚洲最新视频在线| 国产精品一区二区三区免费视频| 欧美午夜激情视频| 亚洲国产精品系列| 亚洲人成77777在线观看网| 丁香五六月婷婷久久激情| 亚洲欧美日韩爽爽影院| 97超级碰碰人国产在线观看| 精品福利在线视频| 亚洲欧洲偷拍精品| 亚洲男人的天堂网站| 91丨九色丨国产在线| 亚洲最大av网| 国产精品久久久久久av福利| www.亚洲一区| 欧美三级免费观看| 一本色道久久综合亚洲精品小说| 国产精品综合不卡av| 亚洲成人av在线| 欧美网站在线观看| 久久天天躁狠狠躁夜夜躁| 成人在线精品视频| 欧美视频第一页| 午夜精品久久久久久久男人的天堂| 欧美成人免费全部| 久久视频免费观看| 亚洲国产精品久久久| 国产精品va在线播放我和闺蜜| 欧美洲成人男女午夜视频| 亚洲free嫩bbb| 91夜夜揉人人捏人人添红杏| 中文字幕精品—区二区| 国产亚洲精品91在线| 国产精品免费久久久久久| 亚洲天堂开心观看| 久久久久久久久久久av| 久久久久国色av免费观看性色| 国产精品久久色| 青青草成人在线| 亚洲精品国产成人| 91大神在线播放精品| 欧美国产第二页| 国产成人精品一区二区在线| 亚洲国产免费av| 国产精品1234| 国产免费观看久久黄| 国产视频在线观看一区二区| 高清一区二区三区日本久| 亚洲美女视频网站| 欧美精品做受xxx性少妇| 日韩欧美高清在线视频| 亚洲第一天堂无码专区| 91色琪琪电影亚洲精品久久| 日韩亚洲欧美中文在线| 蜜月aⅴ免费一区二区三区| 精品久久中文字幕久久av| 精品国产一区二区三区久久狼黑人| 欧美理论电影在线播放| 国产999精品久久久| 精品无人区乱码1区2区3区在线| 国内精品免费午夜毛片| 国产91成人video| 一区二区三区视频在线| 国产精品劲爆视频| 亚洲风情亚aⅴ在线发布| 久久精品久久久久久| 欧美激情一级欧美精品| 国产精品日日摸夜夜添夜夜av| 亚洲精品视频久久| 亚洲欧美精品suv| 久久成人精品视频| 亚洲一区制服诱惑| 在线观看精品自拍私拍| 国产一区二区三区高清在线观看| 欧美高清电影在线看| xxxxxxxxx欧美| 91在线观看免费观看| 91欧美精品成人综合在线观看| 国产精品一区二区女厕厕| 91九色国产在线| 欧美性在线观看| 国产成人高潮免费观看精品| 欧美日韩在线第一页| 色综合久久88色综合天天看泰| 亚洲字幕在线观看| 久久久国产一区二区| 国产精品久久婷婷六月丁香| 久久久噜噜噜久噜久久| 欧美大奶子在线| 亚洲视频一区二区| 国产主播欧美精品| 久久九九亚洲综合| 青青青国产精品一区二区| 日韩亚洲综合在线| 国产视频丨精品|在线观看| 91天堂在线视频| 精品久久久999| 国产精品视频网站| 欧美电影免费看| 国产成人久久久| 性色av一区二区三区红粉影视| 成人网址在线观看| 久久国产精品视频| 亚洲精品www久久久| 国产专区精品视频| 国产精品流白浆视频| 亚洲国产成人av在线| 欧美日韩激情视频| 欧美综合一区第一页| 国产精品十八以下禁看| 国产精品私拍pans大尺度在线| 欧美影院在线播放| 日韩av中文在线| 欧美影院成年免费版| 久久久久久国产精品美女| 日韩有码片在线观看| 国产精品免费久久久久久| 精品欧美一区二区三区| 亚洲精品不卡在线| 91精品国产电影| 亚洲女成人图区| 日韩美女主播视频| 国产丝袜精品视频| 91精品国产99|