一个前端博客(1)——元素的选取和连缀

在写一个项目的时候,我们会用到很多库,比如jQuery,prototype,这里我们自己来写一个库来实现一个前端博客。

在这里我们首先实现两个功能:

  • 元素的选取
  • 连缀

元素的选取

我们用原生的JavaScript对于dom元素的搜索有这几种:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
</head>
<body>
    <div id="box">id</div>
    <input type="radio" name="sex" value="男" selected="selected">
    <p>段落</p>
    <script src="js/tar.js"></script>
    <script src="js/app.js"></script>
</body>
</html>
window.onload = function(){
      var box = document.getElementById("box").innerHTML;
      var sex = document.getElementsByName("sex")[0].value;
      var p = document.getElementsByTagName("p")[0].innerHTML;
      console.log(box);
      console.log(sex);
      console.log(p);
}

由于我们会重复的使用这几种方法,所以我们将他们封装起来。创建我们的库tar.js,通过对象式的方法,来封装。

var Tar = {
    getId : function(id){
        return document.getElementById(id);
    },
    getName : function(name){
        return document.getElementsByName(name);
    },
    getTagName : function(tagName){
        return document.getElementsByTagName(tagName);
    },
    getClass : function(className){
        return document.getElementsByClassName(className);
    },
}

然后我们可以在我们的demo.html文件下调用。

demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
</head>
<body>
    <div id="box">id</div>
    <input type="radio" name="sex" value="男" selected="selected">
    <p>段落</p>
    <script src="js/tar.js"></script>
    <script src="js/app.js"></script>
</body>
</html>

app.js

window.onload = function() {
    var box = Tar.getId("box").innerHTML;
    var sex = Tar.getName("sex")[0].value;
    var p  = Tar.getTagName("p")[0].innerHTML;
    console.log(box);
    console.log(sex);
    console.log(p);
}

 连缀

连缀是我们写代码可以很简洁,同时提高开发速度。如果用我们上面代码去实现下面的代码产生的效果,显然是错的。

window.onload = function() {
    Tar.getId('box').css('color','red').css('background', 'pink');
}

  第一点,显然我们没有css方法,其次即使有了css方法,在getId方法返回一个dom节点后,我们依然不能使用css方法。为什么?因为dom节点没有css方法,css方法是Tar对象的,所以我们需要在每次取得一个节点后返回Tar对象,同时要存储dom节点,这里我们可以利用一个数组来维护。一下是代码,这里我们放弃了之前的对象方式,采用了函数式:

function Tar() {

    this.elements = [];
    this.getId = function(id) {
        this.elements.push(document.getElementById(id));
        return this;
    };
    this.getName = function(name) {
        var names = document.getElemntsByName(name);
        for(var i = 0; i < names.length; i++) {
            this.elements.push(names[i]);
        }
        return this;
    };
    this.getTagName = function(tagName) {
        var tags = document.getElementsByTagName(tagName);
        for(var i = 0; i < tags.length; i++) {
            this.elements.push(tags[i]);
        }
        return this;
    };
    this.getClass = function(className) {
        var classes = document.getElementsByClassName(className);
        for(var i = 0; i < classes.length; i++) {
            this.elements.push(classes[i]);
        }
    };
};

其中,this.elements就是我们用来存储节点的数组。为了区分搜索节点操作和其他操作,我们将其他的方法通过添加给原型对象方法的方式来实现。如下:

Tar.prototype.css = function(attr, value) {
    for(var i = 0; i < this.elements.length; i++) {
        this.elements[i].style[attr] = value;
    }
    return this;
}

Tar.prototype.html = function(str) {
    for(var i = 0; i < this.elements.length; i++) {
        this.elements[i].innerHTML = str;
    }
    return this;
}

这里我们就完成了连缀功能,现在我们来尝试一下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>demo</title>
</head>
<body>
    <div id="box">
        box
    </div>
    <p>段落</p>
    <p>段落</p>
    <p>段落</p>
    <script src="js/tar.js"></script>
    <script src="js/app.js"></script>
</body>
</html>
window.onload = function() {
    var T = new Tar();
    TgetId('box').css('color', 'red');
    T.getTagName('p').css('background','pink');
}

 结果你会发现有些问题,为什么box那个div背景也变颜色了呢?因为当前就只有一个Tar实例,所以操作的是所有的dom节点。所以我们要对不同节点集合创造不同的实例。

于是我们修改tar.js,添加:

var $ = function() {
    return new Tar();
}

  这样我们只要在app.js里

window.onload = function() {
    $().getId('box').css('color', 'red');
    $().getTagName('p').css('background','pink');
}

这样就实现了这样的效果:

 

 现在完整的tar.js代码如下:

var $ = function() {
    return new Tar();
}
function Tar() {

    this.elements = [];
    this.getId = function(id) {
        this.elements.push(document.getElementById(id));
        return this;
    };
    this.getName = function(name) {
        var names = document.getElemntsByName(name);
        for(var i = 0; i < names.length; i++) {
            this.elements.push(names[i]);
        }
        return this;
    };
    this.getTagName = function(tagName) {
        var tags = document.getElementsByTagName(tagName);
        for(var i = 0; i < tags.length; i++) {
            this.elements.push(tags[i]);
        }
        return this;
    };
    this.getClass = function(className) {
        var classes = document.getElementsByClassName(className);
        for(var i = 0; i < classes.length; i++) {
            this.elements.push(classes[i]);
        }
    };
};

Tar.prototype.css = function(attr, value) {
    for(var i = 0; i < this.elements.length; i++) {
        this.elements[i].style[attr] = value;
    }
    return this;
}

Tar.prototype.html = function(str) {
    for(var i = 0; i < this.elements.length; i++) {
        this.elements[i].innerHTML = str;
    }
    return this;
}

先到这里,待续。。。。

posted @ 2015-10-25 14:29  targeral  阅读(141)  评论(0编辑  收藏  举报