解释器模式(Interpreter):定义一种语法格式,通过程序解释执行它并完成相应的任务。在前端编程场景中可以应用解释器模式来解释CSS选择符实现DOM元素的选择。
开放封闭原则:面向对象中的开放封闭原则是类或模块应该对扩展开放对修改封闭,在这个dom选择器中实现id选择器,元素选择器,类选择器,如果以后需要属性选择器的话定义一个属性选择器实现相应的方法,同时在简单工厂中增加相应的创建属性选择器对象分支即可。
匹配原理:浏览器在匹配CSS选择符时是按照从右到左匹配的,所以实现自己的DOM选择器时匹配行为也应该和浏览原生匹配行为一致。
代码:
(function (ns) {
/*
//tagName
console.log(dom.get("p"));
//#id
console.log(dom.get("#div"));
//.class
console.log(dom.get(".span", document.body));
//tag.class
console.log(dom.get("div.span"));
//#id .class
console.log(dom.get("#div .span"));
//.class .class
console.log(dom.get(".ul .li-test"));
*/
var doc = document;
var simple = /^(?:#|\.)?([\w-_]+)/;
function api(query, context) {
context = context || doc;
//调用原生选择器
if(!simple.test(query) && context.querySelectorAll){
return context.querySelectorAll(query);
}else {
//调用自定义选择器
return interpret(query, context);
}
}
//解释执行dom选择符
function interpret(query, context){
var parts = query.replace(/\s+/, " ").split(" ");
var part = parts.pop();
var selector = Factory.create(part);
var ret = selector.find(context);
return (parts[0] && ret[0]) ? filter(parts, ret) : ret;
}
//ID选择器
function IDSelector(id) {
this.id = id.substring(1);
}
IDSelector.prototype = {
find: function (context) {
return document.getElementById(this.id);
},
match: function(element){
return element.id == this.id;
}
};
IDSelector.test = function (selector) {
var regex = /^#([\w\-_]+)/;
return regex.test(selector);
};
//元素选择器
function TagSelector(tagName) {
this.tagName = tagName.toUpperCase();
}
TagSelector.prototype = {
find: function (context) {
return context.getElementsByTagName(this.tagName);
},
match: function(element){
return this.tagName == element.tagName.toUpperCase() || this.tagName === "*";
}
};
TagSelector.test = function (selector) {
var regex = /^([\w\*\-_]+)/;
return regex.test(selector);
};
//类选择器
function ClassSelector(className) {
var splits = className.split('.');
this.tagName = splits[0] || undefined ;
this.className = splits[1];
}
ClassSelector.prototype = {
find: function (context) {
var elements;
var ret = [];
var tagName = this.tagName;
var className = this.className;
var selector = new TagSelector((tagName || "*"));
//支持原生getElementsByClassName
if (context.getElementsByClassName) {
elements = context.getElementsByClassName(className);
if(!tagName){
return elements;
}
for(var i=0,n=elements.length; i<n; i++){
if( selector.match(elements[i]) ){
ret.push(elements[i]);
}
}
} else {
elements = selector.find(context);
for(var i=0, n=elements.length; i<n; i++){
if( this.match(elements[i]) ) {
ret.push(elements[i]);
}
}
}
return ret;
},
match: function(element){
var className = this.className;
var regex = new RegExp("^|\\s" + className + "$|\\s");
return regex.test(element.className);
}
};
ClassSelector.test = function (selector) {
var regex = /^([\w\-_]+)?\.([\w\-_]+)/;
return regex.test(selector);
};
//TODO:属性选择器
function AttributeSelector(attr){
this.find = function(context){
};
this.match = function(element){
};
}
AttributeSelector.test = function (selector){
var regex = /\[([\w\-_]+)(?:=([\w\-_]+))?\]/;
return regex.test(selector);
};
//根据父级元素过滤
function filter(parts, nodeList){
var part = parts.pop();
var selector = Factory.create(part);
var ret = [];
var parent;
for(var i=0, n=nodeList.length; i<n; i++){
parent = nodeList[i].parentNode;
while(parent && parent !== doc){
if(selector.match(parent)){
ret.push(nodeList[i]);
break;
}
parent = parent.parentNode;
}
}
return parts[0] && ret[0] ? filter(parts, ret) : ret;
}
//根据查询选择符创建相应选择器对象
var Factory = {
create: function (query) {
if (IDSelector.test(query)) {
return new IDSelector(query);
} else if (ClassSelector.test(query)) {
return new ClassSelector(query);
} else {
return new TagSelector(query);
}
}
};
ns.dom || (ns.dom = {});
ns.dom.get = api;
}(this));
相关推荐
主要为大家详细介绍了JavaScript实现DOM对象选择器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
javascript DOM 选择器 querySelector 介绍
解释器模式(Interpreter):定义一种语法格式,...匹配原理:浏览器在匹配CSS选择符时是按照从右到左匹配的,所以实现自己的DOM选择器时匹配行为也应该和浏览原生匹配行为一致。 代码: 代码如下: (function (ns) { /*
如jQuery的选择器就是一个很强大的功能,它包含了类选择器、id选择器、属性选择器、元素选择器、层级选择器、内容筛选选择器等等,很是方便快捷,并且这些选择器的兼容性都很好,可以说操作dom使用jq选择器一时爽,...
DOM Inspector是Mozilla Firefox的一个扩充套件,官方中文版上称之为DOM观察器,在安装Mozilla Firefox时,可以在自订安装中选择是否安装DOM Inspector,如果在安装Mozilla Firefox时没有选择自订安装以安装DOM ...
第12章 案例研究:用DOM设计选择列表 12.1 经典的感觉 12.2 构建更好的选择列表 12.3 策略?我们不需要臭哄哄的策略 12.3.1 相关的文件 12.3.2 FauxSelect对象 12.3.3 开始创建...
一个超小的 javascript vanilla dom 选择器 只需将带有[removed]标签的 HTML 文件放入并附加[removed] = function() { } ( function ( ) { 'use strict' ; var $ = document . querySelectorAll . bind ( ...
第十二章 案例研究:用DOM设计选择列表 12.1 经典的感觉 12.2 构建更好的选择列表 12.3 策略?我们不需要臭烘烘的策略 12.4 添加事件--为人造select赋予生命 12.5 让表单绽放光彩 12.6 行为修正 ...
第十二章 案例研究:用DOM设计选择列表 12.1 经典的感觉 12.2 构建更好的选择列表 12.3 策略?我们不需要臭烘烘的策略 12.4 添加事件--为人造select赋予生命 12.5 让表单绽放光彩 12.6 行为修正 ...
SentinelJS是一个小型JavaScript库,可让您使用CSS选择器(682字节)检测新的DOM节点
基于 JavaScript 的选择器引擎,在 DOM 中通过提供 CSS 选择器得到匹配的元素,也被用于验证指定元素是否符合某个 CSS 选择器。 目前 NWMatcher 既支持浏览器(通过创建全局变量 NW.Dom),也支持 Node.js 环境...
超轻量且兼容到IE5的dom选择器 ###介绍 dom选择器是一个超轻量级纯选择器, 兼容到IE5, 用法和document.querySelectorAll几乎一样. 此dom选择器超轻量, 未压缩100+行, 压缩之后3KB 如果浏览器支持document....
一个用于学习如何使用JavaScript DOM选择器访问HTML元素的游戏。 游戏概念:友好的小怪物家族一直在艰难时期。 他们必须应对怪兽村周围蔓延的不受欢迎的客人,自然灾害和冠状病毒。 只有JavaScript超级大国才能帮助...
第12章 案例研究:用DOM设计选择列表 12.1 经典的感觉 12.2 构建更好的选择列表 12.3 策略?我们不需要臭哄哄的策略 12.3.1 相关的文件 12.3.2 FauxSelect对象 12.3.3 开始创建...
第12章 案例研究:用DOM设计选择列表 12.1 经典的感觉 12.2 构建更好的选择列表 12.3 策略?我们不需要臭哄哄的策略 12.3.1 相关的文件 12.3.2 FauxSelect对象 12.3.3 开始创建...
JQ 选择器大全包含:基本选择器,层级选择器,层级函数,过滤选择器,内容选择器,可见选择器,jq中显示相关的函数,属性选择器,子元素选择器,表单选择器。里面的练习题可以拿来练手
文章目录DOM总结1、DOM1)DOM结构2)DOM节点a、节点分类b、节点之间的关系c、选择器——找到节点3)DOM修改a、innerTextb、innerHTMLc、 属性 : value,style ,width2、DOM操作1) 单个HTML DOM节点的操作a、找到...
查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id 等方式来查找,这显然是远远不够的,如果想要进行更为精确的选择不得不使用看起来...