js 实现css风格选择器(压缩后2KB)_javascript技巧
近日在做一些OA前端界面,为了更好管理页面代码想写个js选择器,写着写着发现很费力,索性在网上找找看,功夫不负有心人, 找到一个mini css选择器,且性能不凡:以下代码是压缩后的,仅2KB。
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
把原版也分享下:
/**
* "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() 这是你们所谓的经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 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 转换一个节点收藏
* a real array 一个真正的阵列
*/
try {
return Array.prototype.slice.call(c);
} catch(e) {
var ret = [], i = 0, len = c.length;
for (; i ret[i] = c[i];
}
return ret;
}
}
function filterParents(selectorParts, collection, direct) {
/**
* This is where the magic happens. 这就是魔法发生
* Parents are stepped through (upwards) to 父母们加紧通过向上
* 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返回一个独特的阵列
*/
var length = arr.length,
ret = [],
r = -1,
i = 0,
item;
for (; 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. 一个收集过滤器一个属性
*/
var i = -1, node, r = -1, ret = [];
while ( (node = collection[++i]) ) {
if (regex.test(node[attr])) {
ret[++r] = node;
}
}
return ret;
}
return _find;
})();
以上代码支持css风格样式写法包括:
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

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Dalam CSS, pengecam pemilih id ialah "#". Anda boleh menentukan gaya khusus untuk elemen HTML yang ditandakan dengan nilai atribut id tertentu Struktur sintaks ialah "nilai #ID {attribute: attribute value;}". Atribut ID adalah unik dan tidak boleh diulang dalam keseluruhan halaman; nilai atribut ID tidak seharusnya bermula dengan nombor yang bermula dengan nombor tidak akan berfungsi dalam pelayar Mozilla/Firefox.

Gunakan pemilih kelas pseudo :nth-child(n+3) untuk memilih gaya elemen anak yang kedudukannya lebih besar daripada atau sama dengan 3. Contoh kod khusus adalah seperti berikut: Kod HTML: <divid="container" ><divclass="item"> ;Elemen anak pertama</div><divclass="item"&

Pemilih JavaScript gagal kerana kod tidak diseragamkan Penyelesaiannya ialah: 1. Alih keluar kod JS yang diimport dan kaedah pemilih ID akan berkesan 2. Hanya perkenalkan kod JS yang ditentukan sebelum memperkenalkan "jquery.js".

Dalam artikel sebelumnya "Pembelajaran Pemilih Css - Analisis Pemilih Unsur Pseudo", kami mempelajari tentang pemilih elemen pseudo, dan hari ini kita melihat dengan lebih dekat pemilih kelas pseudo saya harap ia akan membantu semua orang!

Tidak termasuk. Pemilih CSS termasuk: 1. Pemilih teg, yang mencari elemen HTML tertentu melalui nama elemen halaman HTML 2. Pemilih kelas, yang mencari elemen HTML tertentu melalui nilai atribut kelas elemen HTML; yang Cari elemen HTML tertentu melalui nilai atribut id elemen HTML 4. Pemilih kad bebas "*" boleh merujuk kepada semua jenis elemen teg, termasuk elemen tersuai 5. Pemilih atribut menggunakan nama atribut sedia ada; Elemen HTML atau nilai atribut untuk mencari elemen HTML tertentu.

Analisis mendalam tentang adalah dan di mana pemilih: meningkatkan tahap pengaturcaraan CSS Pengenalan: Dalam proses pengaturcaraan CSS, pemilih adalah elemen penting. Mereka membenarkan kami memilih dan menggayakan elemen dalam dokumen HTML berdasarkan kriteria tertentu. Dalam artikel ini, kami akan menyelami dua pemilih yang biasa digunakan iaitu: pemilih dan pemilih tempat. Dengan memahami prinsip kerja dan senario penggunaan mereka, kami boleh meningkatkan tahap pengaturcaraan CSS dengan banyak. 1. ialah pemilih ialah pemilih ialah pilihan yang sangat berkuasa

lxml ialah perpustakaan Python yang berkuasa untuk memproses dokumen XML dan HTML. Sebagai alat penghuraian, ia menyediakan pelbagai pemilih untuk membantu pengguna mengekstrak data yang diperlukan daripada dokumen dengan mudah. Artikel ini akan memperkenalkan pemilih yang disokong oleh lxml secara terperinci. lxml menyokong pemilih berikut: Pemilih teg (ElementTagSelector): Pilih elemen mengikut nama teg. Contohnya, pilih elemen dengan nama teg tertentu dengan menggunakan <tagname>

Dari pemula hingga mahir: Kuasai kemahiran menggunakan adalah dan di mana pemilih Pengenalan: Dalam proses pemprosesan dan analisis data, pemilih adalah alat yang sangat penting. Melalui pemilih, kami boleh mengekstrak data yang diperlukan daripada set data mengikut keadaan tertentu. Artikel ini akan memperkenalkan kemahiran penggunaan ialah dan tempat pemilih untuk membantu pembaca dengan cepat menguasai fungsi berkuasa kedua-dua pemilih ini. 1. Penggunaan pemilih is Pemilih is ialah pemilih asas yang membolehkan kita memilih set data berdasarkan syarat yang diberikan.
