1. 程式人生 > >js筆記:Js封裝庫——css選擇器

js筆記:Js封裝庫——css選擇器

Js封裝庫——css選擇器

css中我們可以很簡單地使用css選擇器來對節點物件進行選擇,並對其進行style設定。現在,我們想通過jshtmlcss樣式進行動態設定,想以css的形式進行設定,例如我們想通過$(‘#box p’)來選中id’box’的節點物件的子節點中的p節點,我們應該怎麼來實現呢?

1.首先,建立幾個檔案:index.htmlindex.jsbase.js

其中,index.html如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>部落格前端:下拉選單</title>
<script src="index.js"></script>
<script src="base.js"></script>
</head>
<body>
<div id="box">
<p>yaodebian</p>
<p id="yao">yaodebian</p>
<p class="yao">yaodebian</p>
</div>
</body>
</html>

2.接下來,我們往封裝庫檔案base.js中編寫我們所需要的css選擇器:

首先,我們需要建立一個物件用來封裝相應功能的程式碼:

function Base(selector) {};//其中的selector為咱們定義的選擇文字,如‘#box p’

另外,我們定義一個函式來簡化執行css選擇器功能:

//封裝物件初始化
var $ = function (selector) {
return new Base(selector);
}

以後我們進行節點動態選擇時即用$(‘#box p’)即可;

然後我們往Base方法中新增內容:

function Base(selector) {
//建立一個數組,來儲存獲取的節點和節點陣列
this.elements = [];
 
//如果selector為一個節點物件,偏將selector直接存放與Base物件中的elements陣列中
if(typeof selector=='object'){
this.elements.push(selector);
alert(1);
}
else if(typeof selector=='string'){//若selector是一個字串,即我們的css選擇文字
var elements=selector.split(' ');//將層次分開,如’#box p’分成兩個層次#box和p
var parentNode=[];//用來儲存上一層次的節點陣列
var target=[];//目標節點陣列(即我們要選定的節點物件列表)
parentNode.push(document);//初始狀態下parentNode為document物件
for(var i=0;i<elements.length;i++){//層次遍歷
switch(elements[i].charAt(0)){//判斷選擇字首(‘#’、’.’或’’(沒有字首,即標籤名))
case '#'://id選擇器
target=[];
if(this.getId(elements[i].substring(1))){//直接獲取該節點物件並存於target中,其中的elements[i].substring(1)即將字首去掉
target.push(this.getId(elements[i].substring(1)));
}
parentNode=target;//為下一層儲存上層節點列表(如果有下一層的話)
break;
case '.'://class選擇器
target=[];
                //對於上一層的每一個節點物件,我們都得從中查詢遍歷此層節點
for(var j=0;j<parentNode.length;j++){
var temp=this.getClass(elements[i].substring(1),parentNode[j]);
for(var a=0;a<temp.length;a++){
target.push(temp[a]);
}
}
parentNode=target;
break;
default://元素選擇器
target=[];
for(var j=0;j<parentNode.length;j++){
var temp=this.getTagName(elements[i],parentNode[j]);
for(var a=0;a<temp.length;a++){
target.push(temp[a]);
}
}
parentNode=target;
}
}
this.elements=target;
}
}
 
//獲取ID節點
Base.prototype.getId = function (id) {
return document.getElementById(id);
};
//注:getElementById是document獨有的方法,即我們不可以用任意一元素節點物件呼叫該方法
//獲取元素節點
Base.prototype.getTagName = function (tag,parentNode) {
var tags =parentNode.getElementsByTagName(tag);//注:tags是一個數組
var target=tags;
// for (var i = 0; i < tags.length; i ++) {
// target.push(tags[i]);
// }
return target;
};
 
//獲取特定class值的元素節點
Base.prototype.getClass=function(className,parentNode){
var all=parentNode.getElementsByTagName('*');//獲取parentNode下的所有元素子節點
var target=[];
for(var i=0;i<all.length;i++){
if(all[i].className==className){
target.push(all[i]);
}
}
return target;
}
 
//設定元素樣式,同時獲取某元素的某屬性的值
Base.prototype.css = function (attr, value) {
for (var i = 0; i < this.elements.length; i ++) {
if(arguments.length==1){
return getStyle(this.elements[i],attr);
}
this.elements[i].style[attr] = value;
}
return this;//為了實現連綴而返回this
}

3.index.js中我們使用css選擇器:

window.onload=function(){
$('#box #yao').css('color','red');
}

執行以上程式,html檔案中<p id="yao">yaodebian</p>節點被選中,裡面的內容變為紅色