zoukankan      html  css  js  c++  java
  • IFE_part2_JavaScript_DOM的具体用法

    // DOM
    
    // 为element增加一个样式名为newClassName的新样式
    // 另一种方法,element.classList.add('newClassName'),但是存在兼容性问题(不兼容IE10以下)
    function addClass(element, newClassName) {
        if (!hasClass(element, newClassName)) {
            element.className += " " + newClassName;
            // element.className += " "
            // element.className += newClassName
        }
    }
    
    // 移除element中的样式oldClassName
    // 也可以这样子写
    // function removeClass(element, oldClassName) {
    //     if (hasClass(element,oldClassName)) {
    //         // 先获取element的所有classname
    //         var elementClassName = element.className;
    //         // 然后把oldclassname替换掉
    //         var newElementClassName = elementClassName.replace(oldClassName,"");
    //         element.className = newElementClassName;
    //         // 简写 element.className = element.className.replace(oldClassName,"")
    //     }
    // }
    function removeClass(element, oldClassName) {
        if (hasClass(element,oldClassName)) {
            var oldClassNameReg = new RegExp("(\s|^)" + oldClassName + "(\s|$)");
            element.className = element.className.replace(oldClassNameReg,"");
        }
    }
    
    // 判断siblingNode和element是否为同一个父元素下的同一级的元素,返回bool值
    // var a = document.getElementByIdx_x_x("dom");
    // var b = a.childNodes;   获取a的全部子节点
    // var c = a.parentNode;   获取a的父节点
    // var d = a.nextSbiling;   获取a的下一个兄弟节点
    // var e = a.previousSbiling;获取a的上一个兄弟节点
    // var f = a.firstChild;    获取a的第一个子节点
    // var g = a.lastChild;     获取a的最后一个子节点
    function isSiblingNode(element, siblingNode) {
        return element.parentNode === siblingNode.parentNode
    }
    
    // 获取element相对于浏览器窗口的位置,返回一个对象{x, y}
    // max() 方法可返回两个指定的数中带有较大的值的那个数。
    function getPosition(element) {
        var position = {};
        position.x = element.getBoundingClientRect().left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);//获取相对位置+滚动距离=绝对位置.
        position.y = element.getBoundingClientRect().top + Math.max(document.documentElement.scrollTop, document.body.scrollTop);
        return position;
    }
    
    // 实现一个简单的Query
    function VQuery(selector, root) {
        //用来保存选择的元素
        var elements = [];              //保存结果节点数组
        var allChildren = null;         //用来保存获取到的临时节点数组
        root = root || document;        //若没有给root,赋值document
        switch (selector.charAt(0)) {   //charAt() 方法可返回指定位置的字符。
        case "#":                       //id选择器
            elements.push(root.getElementById(selector.substring(1))); //push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
            break;
        case ".":                       //class选择器
            if (root.getElementsByClassName) { //标准
                elements = root.getElementsByClassName(selector.substring(1));//substring() 方法用于提取字符串中介于两个指定下标之间的字符。
            } else {                    //兼容低版本浏览器
                var reg = new RegExp("\b" + selector.substring(1) + "\b");
                allChildren = root.getElementsByTagName("*");
                for (var i = 0, len = allChildren.length; i < len; i++) {
                    if (reg.test(allChildren[i].className)) {
                        elements.push(allChildren[i]);
                    }
                }
            }
            break;
        case "[":                       //属性选择器
                                        // indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
            if (selector.indexOf("=") === -1) {
            //只有属性没有值的情况
                allChildren = root.getElementsByTagName("*");
                for (var i = 0, len = allChildren.length; i < len; i++) {
                    if (allChildren[i].getAttribute(selector.slice(1, -1)) !== null) {
                        elements.push(allChildren[i]);
                    }
                }
            } else {
            //既有属性又有值的情况
                var index = selector.indexOf("="); //缓存=出现的索引位置。
                allChildren = root.getElementsByTagName("*");
                for (var i = 0, len = allChildren.length; i < len; i++) {
                    if (allChildren[i].getAttribute(selector.slice(1, index)) === selector.slice(index + 1, -1)) {
                        elements.push(allChildren[i]);
                    }
                }
            }
            break;
        default:                        //tagName
            elements = root.getElementsByTagName(selector);
        }
        return elements
    }
    /**
     * 模仿jQuery的迷你$选择符。
     * @param   {string} selector CSS方式的选择器,支持简单的后代选择器(只支持一级)
     * @returns {object} 返回获取到的第一个节点对象,后代选择器时,返回第一个对象中的第一个符合条件的对象
     */
    function $(selector) {
    //这里trim处理输入时两端出现空格的情况,支持ie9+。但是这个函数实现起来也特别简单,可以参考我task0002(-)前面有trim函数的实现。稍微修改一下,这样就没兼容性问题了。
        if (selector == document) {
            return document;
        }
        selector = selector.trim();
        //存在空格时,使用后代选择器
        // selector去除前后空格后,若是字符串里面还有空格
        if (selector.indexOf(" ") !== -1) {
            var selectorArr = selector.split(/s+/); //分割成数组,第一项为parent,第二项为chlid。
            //这里没去考虑特别多的情况了,只是简单的把参数传入。
            return VQuery(selectorArr[1], VQuery(selectorArr[0])[0])[0];
        } else { //普通情况,只返回获取到的第一个对象
            return VQuery(selector,document)[0];
        }
    }
    

      其中实现简易query参考了这篇博文,感谢这位博主。

  • 相关阅读:
    #include 和 #pragma comment 的相对路径起点
    linux学习之——phpMyadmin配置
    linux学习之——LAMP配置
    python学习之——文件过滤,不显示文件中以‘#’开头的行
    python学习之——元组中两数相加之和等于某数
    python学习之——识别标识符&关键字
    python学习之——single number
    python学习之——Add Digits
    python学习之——猜大小
    python学习之——冒泡排序
  • 原文地址:https://www.cnblogs.com/No-harm/p/9060364.html
Copyright © 2011-2022 走看看