运用$来封装函数,实现元素的查询

一、tools编写
/**

  • 根据选择器查找元素
  • @param selector <String> 选择器,可取 #id .class element
  • @param context <DOM> 查询上下文,即在该DOM元素后代查找满足选择器条件的元素,默认在 document 中查找
  • @return 返回查找到的元素(根据id查找时返回的是查找到的DOM对象,根据类名或元素名查找时,返回的是 HTMLCollection)
    */
    // 如果未传递 context 参数,则默认取 document 值
    context = context || document;

    if (selector.indexOf("#") === 0) // id
        return document.getElementById(selector.slice(1)); 
        //截取后半部分来比对成功的元素都将放入对应的对象里
    if (selector.indexOf(".") === 0) // className
        return byClassName(selector.slice(1), context);
    // element
    return context.getElementsByTagName(selector);
}

/**
 * 解决根据类名查找元素浏览器兼容
 * @param className <String> 待查找的类名
 * @param context <DOM> 查询上下文,即在该DOM元素后代查找满足选择器条件的元素,默认在 document 中查找
 * @return 返回查找到的元素
 */
function byClassName(className, context) {
    // 默认在 document 文档中查找当context为空被赋document
    context = context || document;

    /* 支持使用 getElementsByClassName 方法,则直接使用 */
    /**
    *context.getElementsByClassName <=> context.getElementsByClassName !== undefined;
    undefined的boolean值为false 。浏览器发现不兼容则getElementsByClassName返回false
    */
    // if (context.getElementsByClassName) //
    //  return context.getElementsByClassName(className);

    /* 不支持使用 getElementsByClassName 方法 */
    // 保存所有查找到元素的数组
    var _result = []; 
    // 将查询上下文后代中所有元素查找出来 获取到的不是数组而是一个类似于数组的对象(泛型集合)
    var _tags = context.getElementsByTagName("*");
    console.log(_tags);
    // 遍历迭代所有元素
    for (var i = 0, len = _tags.length; i < len; i++) {
        // 获取当前遍历到元素的所有类名 _tags[i]是一个泛型集合通过className来进行分割
        var _classNames = _tags[i].className.split(" ");
        // 遍历所有类名
        for (var j = 0, l = _classNames.length; j < l; j++) {
            if (_classNames[j] === className) { // 当前元素的某个类名与待查找的类名一致
                // 说明当前遍历到的元素是需要查找的元素之一
                _result.push(_tags[i]);
                break;
            }
        }
    }

    // 返回所有查找到的结果
    return _result;
}```
二、运用tools编写购物车
```<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        table{
            border-collapse: collapse;
            border:1px solid;
        }
        td {
        border:1px solid;
        }
        .subtract, .add{
            display: inline-block;
            width: 20px;
            height: 20px;
            border:1px solid #000;
            text-align: center;
            line-height: 20px;
            cursor: pointer;
        }
        .amount{
            width:30px;
            height:20px;
            text-align: center;
            line-height: 20px;
        }
        button,input{
            margin-top:20px; 
        }
    </style>
</head>
<body>
    <h1>购物车</h1>
    <table>
        <tr>
            <td>序号</td>
            <td>标题</td>
            <td>价格</td>
            <td>数量</td>
            <td>小计</td>
            <td>操作</td>
        </tr>
        <tr>
            <td>1</td>
            <td>牛奶</td>
            <td>59</td>
            <td><span class="subtract">-</span><input type="text"  class="amount" value="1"><span class="add">+</span></td>
            <td class="sum">59</td>
            <!-- javascript:void(0)当点击锚点(a标签)时不会跳转 -->
            <td><a href="javascript:void(0);" class="del">删除</a></td>
        </tr>
        <tr>
            <td>2</td>
            <td>蒙牛 纯牛奶 PURE MILK 250ml*16盒 礼盒装</td>
            <td>35.1</tb>
            <td><span class="subtract">-</span><input type="text" class="amount" value="1"><span class="add">+</span></td>
            <td class="sum">35.1</td>
            <td><a href="javascript:void(0);" class="del">删除</a></td>
        </tr>
        <tr>
            <td>3</td>
            <td>科尔沁 休闲肉脯零食 内蒙古特产 手撕风干牛肉干孜然味400g</td>
            <td>99</tb>
            <td><span class="subtract">-</span><input type="text"  class="amount" value="1"><span class="add">+</span></td>
            <td class="sum">99</td>
            <td><a href="javascript:void(0);" class="del">删除</a></td>
        </tr>
    </table>
    <input type="text" value="193.10" id="totalValue">
    <button id="total">结算</button>
    <script src="js/tools.js"></script>
    <script type="text/javascript">
        var _delLinks = $(".del");
        for(var i=0,len=_delLinks.length;i<len;i++){
            _delLinks[i].onclick = function(){
                console.log("删除:",this);//获取到当前的元素
                var _td = this.parentNode;//找到this的父亲节点
                var _tr = _td.parentNode;//找到_td的父亲节点
                _tr.parentNode.removeChild(_tr);//找到_tr的父亲节点并把_tr删除
            }
        }
        /**
        *previousSibling:当前节点的前一个兄弟节点
        */
        var _add = $(".add");
        for(var j=0 ,len=_add.length;j<len;j++){
            _add[j].onclick = function (){
                console.log("添加:", this);
                var amount = Number(this.previousSibling.value);//获取到前一个元素节点的值
                amount++; 
                this.previousSibling.value = amount;//找到前一个的节点并赋值
                var _addTd = this.parentNode.parentNode.children[2];//获取到元素
                var _price = _addTd.innerText;//获取_addTd的数值
                console.log(_price);
                 _sub = _price * amount;//小计
                this.parentNode.nextSibling.nextSibling.innerText = _sub.toFixed(2); //文本节点(换行符也是一个节点)
            } 
        }
        var _subtract = $(".subtract");
        for(var k=0,len=_subtract.length;k<len;k++){
            _subtract[k].onclick = function(){
                console.log("减少:", this);
                var amount = Number(this.nextSibling.value);
                if(amount>1)
                amount--;
                console.log(amount);
                this.nextSibling.value = amount;
                var _subtractTd = this.parentNode.parentNode.children[2];//获取总金额
                console.log(_subtractTd);
                var _price = _subtractTd.innerText;
                console.log(_price);
                var _sub = _price * amount;//小计
                this.parentNode.nextSibling.nextSibling.innerText = _sub.toFixed(2);
                // sum += _sub.toFixed(2);
                // console.log(sum);
         }
        }
        $("#total").onclick = function() {
            var _sum = $(".sum");
            console.log(Number(_sum[0].innerText));
            var totalSum = Number(_sum[0].innerText)+Number(_sum[1].innerText)+Number(_sum[2].innerText);
            $("#totalValue").value = totalSum.toFixed(2);
        }
    </script>
</body>
</html>```

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容