《精通javascript》几个简单的函数(一)

简介:

书没有好坏之分,正如人没有绝对的好坏之分一样。书只看对自己这个水平层次的人来说该吸收的东西多少了。当然,尽信书不如不读书。人,在特定的历史条件下做出的某些选择是有助于推动历史前进的步伐的,所以要用多变的眼光来看待回忆中的人与事将会使你的人生多彩而斑斓。

《精通js》这本书,承载了众多jqer期待的梦,结果可想而知。不多说了,列举几个简单的函数,供参考。不为过去,只为将来那些未曾实现的梦...

 

复制代码
function  $(){  return  document.getElementById(arguments[ 0 ])};

/* *
 * 得到上一个元素
 * @param {Object} elem
 
*/
function  prev(elem){
    
do {
        elem 
=  elem.previousSibling;
    } 
while (elem  &&  elem.nodeType  !=   1 );
    
return  elem;
}

/* *
 * 得到下一个元素
 * @param {Object} elem
 
*/
function  next(elem){
    
do {
        elem 
=  elem.nextSibling;
    } 
while (elem  &&  elem.nodeType  !=   1 );
    
return  elem;
}

/* *
 * 得到第一个元素
 * @param {Object} elem
 
*/
function  first(elem){
    elem 
=  elem.firstChild;
    
return  elem  &&  elem.nodeType  !=   1   ?  next(elem) : elem;
}

/* *
 * 得到最后一个元素
 * @param {Object} elem
 
*/
function  last(elem){
    elem 
=  elem.lastChild;
    
return  elem  &&  elem.nodeType  !=   1   ?  prev(elem) : elem;
}

/* *
 * 得到父元素
 * @param {Object} elem
 * @param {Number} num 需要寻找的父级级别
 
*/
function  parent(elem, num){
    num 
=  num  ||   1 ;
    
for ( var  i = 0 ; i < num; i ++ ){
        
if (elem  !=   null ) elem  =  elem.parentNode;  // 原书中这块有错
    }
    
return  elem;
}

/* *
 * 得到相关name元素
 * @param {String} name
 * @param {Object} elem
 
*/
function  tag(name, elem){
    
return  (elem  ||  document).getElementsByTagName(name)
}

/* *
 * 根据tag寻找
 * @param {String} name
 * @param {String} type
 
*/
function  hasClass(name, type){
    
var  r  =  [];
    
var  re  =   new  RegExp( ' (^|\\s) ' + name + ' (\\s|$) ' );
    
var  e  =  document.getElementsByTagName(type  ||   ' * ' );
    
for ( var  i = 0 ; i < e.length; i ++ ){
        
if (re.test(e[i].className)){
            r.push(e[i]);
        }
    }
    
return  r;
    
// http://www.cnblogs.com/rubylouvre/archive/2009/09/01/1557765.html //司徒兄有不同的看法
}

/* *
 * 获取元素文本
 * @param {Object} e
 
*/
function  text(e){
    
var  t  =   '' ;
    e 
=  e.childNodes  ||  e;
    
for ( var  i = 0 ; i < e.length; i ++ ){
        
// 如果不是元素,则追加其文本值
        t  +=  e[i].nodeType  !=   1   ?  e[i].nodeValue : text(e[i].childNodes);
    }
    
return  t;
}

/* *
 * 
 * @param {String} elem
 * @param {String} name
 * @param {String} value
 
*/
function  attr(elem, name, value){
    
if ( ! name  ||  name.constructor  !=  String){
        
return   '' ;
    }
    
    
// 检查name的属性是否在怪异命名情形中
    name  =  { ' for ' ' htmlFor ' ' class ' ' className ' }[name]  ||  name;
    
    
if ( typeof  value  !=   ' undefined ' ){
        elem[name] 
=  value;
        
        
if (elem.setAttribute){
            elem.setAttribute(name, value);
        }
    }
    
    
return  elem[name]  ||  elem.getAttribute(name)  ||   '' ;
}


/* *
 * 在另一个元素之前插件元素
 * @param {Object} parent
 * @param {Object} before
 * @param {String} elem
 
*/
function  before(parent, before, elem){
    
if (elem  ==   null ){
        elem 
=  before;
        before 
=  parent;
        parent 
=  before.parentNode;
    }
    
    
// 获取元素的新数组
     var  elems  =  checkElem(elem);
    
    
// 向后遍历
     for ( var  i = elems.length; i >= 0 ; i -- ){
        parent.insertBefore(elems[i], before);
    }
}

/* *
 * 创建元素
 * @param {Object} elem
 
*/
function  create(elem){
    
// 测试是否用命名空间来创建新的元素
     return  document.createElementNS  ?  document.createElementNS( ' http://www.w3.org/1999/xhtml ' , elem) : document.createElement(elem);
}

/* *
 * before 辅助函数
 * @param {Object} elem
 
*/
function  checkElem(a){
    
var  r  =  [];
    
if (a.constructor  !=  Array){ a  =  [a]};
    
for ( var  i = 0 ; i < a.length; i ++ ){
        
// 如果是字符串
         if (a[i].constructor  ==  String){
            
// 用一个临时元素来存放HTML
             var  div  =  document.createElement( ' div ' );
            div.innerHTML 
=  a[i];
            
// 提取DOM结构到临时的div中
             for ( var  j = 0 ; j < div.childNodes.length; j ++ ){
                r[r.length] 
=  div.childNodes[j];
            }
        } 
else   if (a[i].length){  // 如果它是数组
             // 假定DOM节点数组
             for ( var  j = 0 ; j < a[i].length; j ++ ){
                r[r.length] 
=  a[i][j];
            }
        } 
else  {  // 否则假定是DOM节点
            r[r.length]  =  a[i];
        }
    }
    
    
return  r;
}

// 此方法我已修改与原文中有异
/*
*
 * 添加元素 (如果只有一个参数(无elem),则直接添加到document.body上)
 * @param {Object} elem 
 * @param {Object} parent
 
*/
function  append(parent, elem){
    
if (elem  ==   null ){
        elem 
=  parent;
        parent 
=   null ;
    }
    
    
// 获取元素数组
     var  elems  =  checkElem(elem);
    
for ( var  i = 0 ; i <  elems.length; i ++ ){
        (parent 
||  document.body).appendChild(elems[i]);
    }
}

/* *
 * 删除独立的DOM
 * @param {Object} elem
 
*/
function  remove(elem){
    
if (elem){ elem.parentNode.removeChild(elem) };
}

/* *
 * 删除一个节点的所有子节点
 * @param {Object} elem
 
*/
function  empty(elem){
    
while (elem.firstChild){
        remove(elem.firstChild);
    }
}

/* *
 * 阻止事件冒泡
 * @param {Object} e
 
*/
function  stopBubble(e){
    
if (e  &&  e.stopPropagation){
        e.stopPropagation();
    } 
else  {
        window.event.cancelBubble 
=   true ;
    }
}

function  stopDefault(e){
    
if (e  &&  e.preventDefault){
        e.preventDefault();
    } 
else  {
        window.event.returnValue 
=   false ;
    }
    
return   false ;
}


/* *
 * 得到外链样式
 * @param {Object} elem
 * @param {String} name
 
*/
function  getStyle(elem, name){
    
if (elem.style[name]){
        
return  elem.style[name];
    } 
else   if (elem.currentStyle){  // 如果ie
         return  elem.currentStyle[name];
    } 
else   if (document.defaultView  &&  document.defaultView.getComputedStyle){  // 如果是不是w3c方法
        name  =  name.replace( / ([A-Z]) / g,  ' -$1 ' );
        name 
=  name.toLowerCase();
        
        
// 获取样式
         var  s  =  document.defaultView.getComputedStyle(elem,  '' );
        
return  s  &&  s.getPropertyValue(name);
    } 
else  {
        
return   null ;
    }
}

/* *
 * 获取元素的x位置
 * @param {String} elem
 
*/
function  pageX(elem){
    
return  elem.offsetParent  ?  elem.offsetLeft  +  pageX(elem.offsetParent) : elem.offsetLeft;
}

/* *
 * 获取元素的Y位置
 * @param {String} elem
 
*/
function  pageY(elem){
    
return  elem.offsetParent  ?  elem.offsetTop  +  pageY(elem.offsetParent) : elem.offsetTop;
}

/* *
 * 获取元素相对于父级的x位置
 * @param {String} elem
 
*/
function  parentX(elem){
    
return  elem.parentNode  ==  elem.offsetParent  ?  elem.offsetLeft : pageX(elem)  -  pageX(elem.parentNode);
}

/* *
 * 获取元素相对于父级的Y位置
 * @param {String} elem
 
*/
function  parentY(elem){
    
return  elem.parentNode  ==  elem.offsetParent  ?  elem.offsetTop : pageY(elem)  -  pageY(elem.parentNode);
}

/* *
 * 查找元素的左端位置
 * @param {Object} elem
 
*/
function  posX(elem){
    
return  parseInt(getStyle(elem,  ' left ' ));
}

/* *
 * 查找元素的顶端位置
 * @param {Object} elem
 
*/
function  posY(elem){
    
return  parseInt(getStyle(elem,  ' top ' ));
}

/* *
 * 设置元素水平位置
 * @param {Object} elem
 * @param {Object} pos
 
*/
function  setX(elem, pos){
    elem.style.left 
=  pos  +   ' px ' ;
}

/* *
 * 设置垂直水平位置
 * @param {Object} elem
 * @param {Object} pos
 
*/
function  setY(elem, pos){
    elem.style.top 
=  pos  +   ' px ' ;
}

/* *
 * 获取高度
 * @param {Object} elem
 
*/
function  getHeight(elem){
    
return  parseInt(getStyle(elem,  ' height ' ));
}

/* *
 * 获取宽度
 * @param {Object} elem
 
*/
function  getWidth(elem){
    
return  parseInt(getStyle(elem,  ' width ' ));
}

/* *
 * 得到完整的高度,就算对象已隐藏
 * @param {Object} elem
 
*/
function  fullHeight(elem){
    
// 如果元素显示
     if (getStyle(elem,  ' display ' !=   ' none ' ){
        
return  elem.offsetHeight  ||  getHeight(elem);
    }
    
    
// 如果不显示,则复原css
     var  old  =  resetCss(ele, {
        display: 
'' ,
        visibility: 
' hidden ' ,
        position: 
' absolute '
    });
    
    
var  h  =  elem.clientHeight  ||  getHeight(elem);
    restoreCss(elem, old);
    
    
return  h;
}

/* *
 * 恢复原有设置
 * @param {String} elem
 * @param {Object} prop
 
*/
function  resetCss(elem, prop){
    
var  old  =  {};
    
    
for ( var  i  in  prop){
        old[i] 
=  prop[i];
        elem.style[i] 
=  prop[i];
    }
    
return  old;
}

/* *
 * 
 * @param {String} elem
 * @param {Object} old
 
*/
function  restoreCss(elem, old){
    
for ( var  i  in  old){
        elem.style[i] 
=  old[i];
    }
}
复制代码





本文转自豪情博客园博客,原文链接:http://www.cnblogs.com/jikey/archive/2011/07/21/2112470.html,如需转载请自行联系原作者

目录
相关文章
|
11月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
424 19
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
308 32
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
JavaScript 前端开发 安全
JavaScript函数详解
JavaScript函数的详细解析,包括函数的定义和调用方式(如一般格式、匿名函数、构造函数、自调用函数、箭头函数和严格模式)、函数参数(arguments对象、可变参数、默认参数值)、闭包的概念和应用实例。
JavaScript函数详解
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
177 5
|
JavaScript 前端开发
js教程——函数
js教程——函数
394 4