最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js 實(shí)現(xiàn)css風(fēng)格選擇器(壓縮后2KB)

 更新時(shí)間:2012年01月12日 11:49:27   作者:  
近日在做一些OA前端界面,為了更好管理頁(yè)面代碼想寫個(gè)js選擇器,寫著寫著發(fā)現(xiàn)很費(fèi)力,索性在網(wǎng)上找找看,功夫不負(fù)有心人, 找到一個(gè)mini css選擇器,且性能不凡:以下代碼是壓縮后的,僅2KB
近日在做一些OA前端界面,為了更好管理頁(yè)面代碼想寫個(gè)js選擇器,寫著寫著發(fā)現(xiàn)很費(fèi)力,索性在網(wǎng)上找找看,功夫不負(fù)有心人, 找到一個(gè)mini css選擇器,且性能不凡:以下代碼是壓縮后的,僅2KB。
復(fù)制代碼 代碼如下:

var $=(function(){var b=/(?:[\w\-\\.#]+)+(?:\[\w+?=([\'"])?(?:\\\1|.)+?\1\])?|\*|>/ig,g=/^(?:[\w\-_]+)?\.([\w\-_]+)/,f=/^(?:[\w\-_]+)?#([\w\-_]+)/,j=/^([\w\*\-_]+)/,h=[null,null];function d(o,m){m=m||document;var k=/^[\w\-_#]+$/.test(o);if(!k&&m.querySelectorAll){return c(m.querySelectorAll(o))}if(o.indexOf(",")>-1){var v=o.split(/,/g),t=[],s=0,r=v.length;for(;s<r;++s){t=t.concat(d(v[s],m))}return e(t)}var p=o.match(b),n=p.pop(),l=(n.match(f)||h)[1],u=!l&&(n.match(g)||h)[1],w=!l&&(n.match(j)||h)[1],q;if(u&&!w&&m.getElementsByClassName){q=c(m.getElementsByClassName(u))}else{q=!l&&c(m.getElementsByTagName(w||"*"));if(u){q=i(q,"className",RegExp("(^|\\s)"+u+"(\\s|$)"))}if(l){var x=m.getElementById(l);return x?[x]:[]}}return p[0]&&q[0]?a(p,q):q}function c(o){try{return Array.prototype.slice.call(o)}catch(n){var l=[],m=0,k=o.length;for(;m<k;++m){l[m]=o[m]}return l}}function a(w,p,n){var q=w.pop();if(q===">"){return a(w,p,true)}var s=[],k=-1,l=(q.match(f)||h)[1],t=!l&&(q.match(g)||h)[1],v=!l&&(q.match(j)||h)[1],u=-1,m,x,o;v=v&&v.toLowerCase();while((m=p[++u])){x=m.parentNode;do{o=!v||v==="*"||v===x.nodeName.toLowerCase();o=o&&(!l||x.id===l);o=o&&(!t||RegExp("(^|\\s)"+t+"(\\s|$)").test(x.className));if(n||o){break}}while((x=x.parentNode));if(o){s[++k]=m}}return w[0]&&s[0]?a(w,s):s}var e=(function(){var k=+new Date();var l=(function(){var m=1;return function(p){var o=p[k],n=m++;if(!o){p[k]=n;return true}return false}})();return function(m){var s=m.length,n=[],q=-1,o=0,p;for(;o<s;++o){p=m[o];if(l(p)){n[++q]=p}}k+=1;return n}})();function i(q,k,p){var m=-1,o,n=-1,l=[];while((o=q[++m])){if(p.test(o[k])){l[++n]=o}}return l}return d})();

把原版也分享下:
復(fù)制代碼 代碼如下:

/**
* "mini" Selector Engine
* Copyright (c) 2009 James Padolsey
* -------------------------------------------------------
* Dual licensed under the MIT and GPL licenses.
* - http://www.opensource.org/licenses/mit-license.php
* - http://www.gnu.org/copyleft/gpl.html
* -------------------------------------------------------
* Version: 0.01 (BETA)
*/
var mini = (function(){
var snack = /(?:[\w\-\\.#]+)+(?:\[\w+?=([\'"])?(?:\\\1|.)+?\1\])?|\*|>/ig,
exprClassName = /^(?:[\w\-_]+)?\.([\w\-_]+)/,
exprId = /^(?:[\w\-_]+)?#([\w\-_]+)/,
exprNodeName = /^([\w\*\-_]+)/,
na = [null,null];
function _find(selector, context) {
/**
* This is what you call via x() 這是你們所謂的經(jīng)x
* Starts everything off... 開始上所有的
*/
context = context || document;
var simple = /^[\w\-_#]+$/.test(selector);
if (!simple && context.querySelectorAll) {
return realArray(context.querySelectorAll(selector));
}
if (selector.indexOf(',') > -1) {
var split = selector.split(/,/g), ret = [], sIndex = 0, len = split.length;
for(; sIndex < len; ++sIndex) {
ret = ret.concat( _find(split[sIndex], context) );
}
return unique(ret);
}
var parts = selector.match(snack),
part = parts.pop(),
id = (part.match(exprId) || na)[1],
className = !id && (part.match(exprClassName) || na)[1],
nodeName = !id && (part.match(exprNodeName) || na)[1],
collection;
if (className && !nodeName && context.getElementsByClassName) {
collection = realArray(context.getElementsByClassName(className));
} else {
collection = !id && realArray(context.getElementsByTagName(nodeName || '*'));
if (className) {
collection = filterByAttr(collection, 'className', RegExp('(^|\\s)' + className + '(\\s|$)'));
}
if (id) {
var byId = context.getElementById(id);
return byId?[byId]:[];
}
}
return parts[0] && collection[0] ? filterParents(parts, collection) : collection;
}
function realArray(c) {
/**
* Transforms a node collection into 轉(zhuǎn)換一個(gè)節(jié)點(diǎn)收藏
* a real array 一個(gè)真正的陣列
*/
try {
return Array.prototype.slice.call(c);
} catch(e) {
var ret = [], i = 0, len = c.length;
for (; i < len; ++i) {
ret[i] = c[i];
}
return ret;
}
}
function filterParents(selectorParts, collection, direct) {
/**
* This is where the magic happens. 這就是魔法發(fā)生
* Parents are stepped through (upwards) to 父母?jìng)兗泳o通過向上
* see if they comply with the selector. 看看他們是否符合選擇器
*/
var parentSelector = selectorParts.pop();
if (parentSelector === '>') {
return filterParents(selectorParts, collection, true);
}
var ret = [],
r = -1,
id = (parentSelector.match(exprId) || na)[1],
className = !id && (parentSelector.match(exprClassName) || na)[1],
nodeName = !id && (parentSelector.match(exprNodeName) || na)[1],
cIndex = -1,
node, parent,
matches;
nodeName = nodeName && nodeName.toLowerCase();
while ( (node = collection[++cIndex]) ) {
parent = node.parentNode;
do {
matches = !nodeName || nodeName === '*' || nodeName === parent.nodeName.toLowerCase();
matches = matches && (!id || parent.id === id);
matches = matches && (!className || RegExp('(^|\\s)' + className + '(\\s|$)').test(parent.className));
if (direct || matches) { break; }
} while ( (parent = parent.parentNode) );
if (matches) {
ret[++r] = node;
}
}
return selectorParts[0] && ret[0] ? filterParents(selectorParts, ret) : ret;
}
var unique = (function(){
var uid = +new Date();
var data = (function(){
var n = 1;
return function(elem) {
var cacheIndex = elem[uid],
nextCacheIndex = n++;
if(!cacheIndex) {
elem[uid] = nextCacheIndex;
return true;
}
return false;
};
})();
return function(arr) {
/**
* Returns a unique array返回一個(gè)獨(dú)特的陣列
*/
var length = arr.length,
ret = [],
r = -1,
i = 0,
item;
for (; i < length; ++i) {
item = arr[i];
if (data(item)) {
ret[++r] = item;
}
}
uid += 1;
return ret;
};
})();
function filterByAttr(collection, attr, regex) {
/**
* Filters a collection by an attribute. 一個(gè)收集過濾器一個(gè)屬性
*/
var i = -1, node, r = -1, ret = [];
while ( (node = collection[++i]) ) {
if (regex.test(node[attr])) {
ret[++r] = node;
}
}
return ret;
}
return _find;
})();

以上代碼支持css風(fēng)格樣式寫法包括:
復(fù)制代碼 代碼如下:

div
.example
body div
div, p
div, p, .example
div p
div > p
div.example
ul .example
#title
h1#title
div #title
ul.foo > * span

相關(guān)文章

  • 一文詳解CORS與預(yù)檢請(qǐng)求

    一文詳解CORS與預(yù)檢請(qǐng)求

    這篇文章主要介紹了CORS與預(yù)檢請(qǐng)求,CORS是一套規(guī)范,指導(dǎo)瀏覽器和服務(wù)器之間如何進(jìn)行跨域資源共享,當(dāng)發(fā)送跨域請(qǐng)求時(shí),瀏覽器會(huì)先發(fā)送一個(gè)OPTIONS方法的預(yù)檢請(qǐng)求。文中介紹的非常詳細(xì),需要的同學(xué)可以參考一下
    2023-04-04
  • 一文帶你探索JavaScript中斜杠的神秘世界

    一文帶你探索JavaScript中斜杠的神秘世界

    斜杠可以在代碼中擁有多種含義,所以在 JavaScript 編程中,處理斜杠是一項(xiàng)非常重要的任務(wù),本文就來(lái)帶大家一起來(lái)看看JavaScript是如何處理斜杠的
    2023-06-06
  • JavaScript實(shí)現(xiàn)Tab欄切換功能詳解

    JavaScript實(shí)現(xiàn)Tab欄切換功能詳解

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)Tab欄切換的實(shí)現(xiàn)方式,是面向?qū)ο蟮膶懛ǎ疚慕o大家分享詳細(xì)案例代碼,需要的朋友可以參考下
    2022-10-10
  • JavaScript實(shí)用技巧(一)

    JavaScript實(shí)用技巧(一)

    本文從7個(gè)方面講述 JavaScript 中那些你不很熟知但非常實(shí)用的技巧。
    2010-08-08
  • JS如何為promise增加abort功能

    JS如何為promise增加abort功能

    這篇文章主要介紹了JS為promise增加abort功能,想了解JS異步的同學(xué),可以參考下
    2021-04-04
  • javascript密碼強(qiáng)度校驗(yàn)代碼(兩種方法)

    javascript密碼強(qiáng)度校驗(yàn)代碼(兩種方法)

    為了保證網(wǎng)站個(gè)人信息的安全,很多網(wǎng)站在注冊(cè)頁(yè)面都設(shè)置密碼強(qiáng)度這項(xiàng),用javascript如何實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn)代碼呢?下面小編給大家整理了兩種方法使用javascript密碼強(qiáng)度校驗(yàn)代碼,有需要的朋友可以參考下
    2015-08-08
  • 詳解嵌套命名空間在TypeScript中如何應(yīng)用

    詳解嵌套命名空間在TypeScript中如何應(yīng)用

    命名空間是TypeScript中非常有用的概念,可以幫助我們組織和管理代碼,避免命名沖突,下面小編就來(lái)和大家聊聊嵌套命名空間在TypeScript中是如何應(yīng)用的吧
    2023-06-06
  • 深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解

    深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解

    這篇文章主要介紹了深入理解JavaScript系列(31):設(shè)計(jì)模式之代理模式詳解,代理模式使得代理對(duì)象控制具體對(duì)象的引用,代理幾乎可以是任何對(duì)象:文件,資源,內(nèi)存中的對(duì)象,或者是一些難以復(fù)制的東西,需要的朋友可以參考下
    2015-03-03
  • 前端獲取excel表格數(shù)據(jù)并在瀏覽器展示方法實(shí)例

    前端獲取excel表格數(shù)據(jù)并在瀏覽器展示方法實(shí)例

    在開發(fā)過程中,難免會(huì)碰到用前端來(lái)處理excel文件的需求,這篇文章主要給大家介紹了關(guān)于前端獲取excel表格數(shù)據(jù)并在瀏覽器展示方的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • javascript substr和substring用法比較

    javascript substr和substring用法比較

    在js中substring和substr都是用來(lái)截取字符串的,那么substring和substr之間的具體區(qū)別在哪里,有沒有區(qū)別呢,下面我來(lái)給各位詳細(xì)引用一些實(shí)例來(lái)介紹這些問題
    2009-06-06

最新評(píng)論

时尚| 新龙县| 仙游县| 齐齐哈尔市| 通辽市| 恩平市| 璧山县| 黄浦区| 安福县| 稻城县| 长宁县| 腾冲县| 简阳市| 延庆县| 巴林右旗| 平江县| 万安县| 永吉县| 永和县| 西和县| 奉节县| 南昌市| 隆尧县| 玛曲县| 河南省| 鄂温| 武山县| 昌黎县| 邵阳市| 威宁| 监利县| 岗巴县| 合山市| 中宁县| 资源县| 大姚县| 光泽县| 宁南县| 思南县| 德阳市| 竹北市|