一些常用且实用的原生JavaScript函数

日常开始中常用到的一些原生JavaScript函数,比较实用, 今天特地整理一下,分享给大家,希望对大家有用,会常更新,同时也欢迎大家补充.
css及html方面的技巧总结,点此前往: 前端开发中一些常用技巧总结.
1. document.getElementById的简写: http://mrthink.net/javascript-getbyid-simplewrite/;
2. getElementsByTagName的简写方式: http://mrthink.net/javascrip-simple-getelementsbytagname/;
3. 原生JavaScript中获取元素索引的函数: http://mrthink.net/javascript-index-functio/;
4. 替代window.onload,可多次调用的加载函数:

function iLoad(func) {
    
var oLoad=window.onload;
    
if(typeof window.onload!='function'){
        
window.onload=func;
    
}else{
        
window.onload=function(){
            
oLoad();
            
func();
        
}
    
}
}

5. 获取下一个元素节点:

function nextElem(node){
    
if(node.nodeType==1) return node;
    
if(node.nextSibling) return nextElem(node.nextSibling);
    
return null;
}

6. 获取上一个元素节点(此函数须调用第五条中的函数):

function prevElem(node){
    
if(node.nodeType==1){
        
return node;
    
}else if(node.previousSibling){
        
return nextElem(node.previousSibling);
    
}else{
    
return null;
    
}
}

7. 原生JavaScript中有insertBefore方法,可惜却没有insertAfter方法,怎么办?用如下函数实现:

function insertAfter(newChild,refChild){
    
var parElem=refChild.parentNode;
    
if(parElem.lastChild==refChild){
        
refChild.appendChild(newChild);
    
}else{
        
parElem.insertBefore(newChild,refChild.nextSibling);
    
}
}

8. 为元素添加样式[记住是添加不是替换,相当于jQuery中的addClass(value)]:

function addClass(elem,value){
    
if(!elem.className){
        
elem.className=value;
    
}else{
        
var oValue=elem.className;
        
oValue+=" ";
        
oValue+=value;
        
elem.className=oValue;
    
}
}

9. 获取元素的样式:

function getStyle(id,stylename){
    
var elem=$(id);
    
var realStyle=null;
    
if(elem.currentStyle){
        
realStyle=elem.currentStyle[stylename];
    
}else if(window.getComputedStyle){
        
realStyle=window.getComputedStyle(elem,null)[stylename];
    
}
    
return realStyle;
}

9. 兼容事件绑定:

function addEventSamp(obj,evt,fn){
    
if (obj.addEventListener) {
        
obj.addEventListener(evt, fn, false);
    
}else if(obj.attachEvent){
        
obj.attachEvent('on'+evt,fn);
    
}
}

10. 移除事件

function removeEventSamp(obj,evt,fn){
    
if(obj.removeEventListener){
        
obj.removeEventListener(evt,fn,false);
    
}else if(obj.detachEvent){
        
obj.detachEvent('on'+evt,fn);
    
}
}

原生JavaScript中获取元素索引的函数

相信使用过jQuery的朋友都知道index()方法, 她可以很方便的帮你找到当前元素在元素集合中索引位置. 那么, 原生JavaScript中如何获取呢? 这是我在写结构/表现/行为完全分离的选项卡(jQ版和原生JS版)一文时发现的问题. 今天一个朋友也问到我这个问题, 这个函数的确很实用. 和大家分享一下我的实现方法.
代码:

function index(current, obj){
    
for (var i = 0; i < obj.length; i++) {
        
if (obj[i] == current) {
            
return i;
        
}
    
}
}

原理:
通过一个for循环遍历找出当前集合中与当前元素相等的元素,那么该元素的下标值即是当前元素在元素集合中的索引值.

基于jQuery淡入淡出可自动切换的幻灯插件

基于jQuery淡入淡出可自动切换的幻灯插件,原型是前几天写的一个幻灯效果,因为一个小bug卡了两天,然后清空之前写的代码,重新整理思路写出来的. 思维是个很诡异的东西,一旦陷入某个死角,很难逃出. 惟有冷却一些时间,完全抛开旧的思维,才能找到新的出路.
其实就是一个幻灯效果,考虑到使用方便,就封装成一个插件了.
插件特点
1. 参数高度自定义;
2. 可重复调用且与不影响;
3. 插件文件小,压缩后仅1.04k,开发版3.29k.
演示及下载
点此查看DEMO点此下载插件
使用方法
1. 引入jQuery库文件及jQuery.iFadeSlide.pack.js插件文件(若页面有其他js文件,可与之合并以减小http请求),引入位置自定义;

  1. <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  2. <script src="js/jquery.iFadeSldie.pack.js"></script>

样式文件无须引入,若使用DEMO中的结构,可直接将样式合并于项目页面中.建议样式自定义.
2. 在页面中调用插件并传入切换元素的参数, 若为空或未传入的参数,均按插件中的默认参数执行.例如如下代码是DEMO演示中的三组幻灯切换调用:

  1. $(function(){
  2.     //SAMPLE-A调用---未传入任何参数,调用默认参数
  3.     $('div#slide').iFadeSlide();
  4.     //SAMPLE-B调用---传入新的参数,将覆盖原有参数,未传入的使用默认值
  5.     $('div#slide_b').iFadeSlide({
  6.         field: $('div#slide_b a'),
  7.         icocon:$('div.ico_b'),
  8.         hoverCls: 'high_b',
  9.         curIndex: 2//索引值0起始,故此处设置为第3项高亮
  10.         interval: 2000
  11.     });
  12.     //SAMPLE-C调用---传入新的参数,将覆盖原有参数,未传入的使用默认值
  13.     $('div#slide_c').iFadeSlide({
  14.         field: $('div#slide_c img'),
  15.         icocon: $('div.ico_c'),
  16.         outTime:100,
  17.         inTime: 200
  18.     });
  19. });

注意,调用插件部分须置入插件文件引用后面.
核心代码

;(function($){
    $.
fn.extend({
        
iFadeSlide: function(options){
            
//插件参数初始化
            
var iset={
                
field:$('div#slide img')//切换元素集合
                
icocon:$('div.ico')//索引容器
                
hoverCls:'high'//切换至当前索引高亮显示样式
                
curIndex:0//默认高亮显示的索引值,索引值为0起始
                
outTime:200//元素淡出时间(ms)
                
inTime:300//元素淡入时间(ms)
                
interval:3000  //元素切换间隔时间(ms)       
            
};
            
options=options || {};
            $.
extend(iset,options);   //合并参数对象.若options传入有新值则覆盖iset中对应值,否则使用默认值.
            
//根据切换元素量生成对应的索引值列表并插入到切换区域中
            
var ulcon = "<ul>";
            
iset.field.each(function(i){
                
ulcon = ulcon + '<li>' + (i + 1) + '</li>';
            
});
            
ulcon += '</ul>';
            
iset.icocon.append(ulcon);
          
            
var ico = iset.icocon.find('li')//索引列表集合
            
var size = iset.field.size()//切换元素量
            
var index = 0//初始索引值
            
var clearFun=null;
            
//淡出淡入函数
            
var fadeFun = function(obj){
                
index = ico.index(obj)//取当前索引值
                
//淡出当前可见元素,并通过索引值找到要淡入的元素
                
iset.field.filter(':visible').fadeOut(iset.outTime, function(){
                    
iset.field.eq(index).fadeIn(iset.inTime);
                
});
                
//为当前索引添加高亮样式并移除同级元素中的高亮样式
                $
(obj).addClass(iset.hoverCls).siblings().removeClass(iset.hoverCls);
            
};
            
//切换函数
            
var changeFun = function(){
                
index++;  //累积索引值
                
if (index == size){index = 0}//当索引值等于切换元素量时,初始化为0
                
ico.eq(index).trigger('mouseleave')//为当前的索引模拟鼠标划出元素区事件
            
};
            
//自动切换函数
            
var scrollFun = function(){
                
clearFun = setInterval(function(){
                    
changeFun()
                
}, iset.interval);
            
};
            
//停止自动切换函数
            
var stopFun = function(){
                
clearInterval(clearFun);
            
};
            
            
scrollFun()//初始自动切换
            
            
//索引区域鼠标划入停止自动切换并切换元素至当前索引,鼠标划出初始化索引至当前值(否则鼠标划出切换会乱)
            
ico.hover(function(){
                
stopFun();
                
fadeFun(this);
            
}, function(){
                
fadeFun(this);
            
}).eq(iset.curIndex).mouseleave()//初始高亮显示的索引值
            
            
//切换区域鼠标划入停止自动切换,划出继续自动
            
iset.field.hover(function(){
                
stopFun();
            
}, function(){
                
scrollFun();
            
});
        
}
    
});
})(jQuery);

其他
本插件可自由使用,包括任何形式的商业用途,但使用时请勿必注明版权归属.
欢迎提出疑问及建议, 并期待对本插件扩展.

Zend Studio中安装Aptana及几个配置说明

为了学习Linux系统,花了两个晚上的时间把电脑彻底清空重新规划了一次, 让Ubuntu与Win7和平共存.装系统是小儿科,但烦的是大大小小一大堆的软件.ghost很重要.
而对我,用的最多的是Zend Studio加Aptana的完美结合.我想,无论对于前端人员还是PHP开发人员,Zend Studio加Aptana绝对堪称经典.可惜中文资料太少,让很多人在安装和使用时绕了不少弯路,在此分享一下,安装过程中几个实用的技巧.
Zend Studio的下载安装就不详叙了,自己Google下.本文以7.1版本为例说明.
1. Aptana插件的安装
Aptana插件的安装有两种方式,一种是通过Aptana官方的插件链接安装,另一种是通过下载插件后加载安装.笔者建议用第一种方法,第二种方法我没安装成功过,总是出错(人品问题?).
具体实施:打开Zend Studio, 选择help菜单下的install new software选项,然后, 点一下Work with 后面文本框后面的那个ADD,会弹出一个窗口,Name,任意输入名称,location中输入: http://download.aptana.org/tools/studio/plugin/install/studio,点OK,然后在work with的下拉列表中就有你刚添加的了,勾选,next,ok,next,accept,finish,yes,重启安装完成.
2. 默认编辑器的配置
Aptana安装完成了,还需要修改首选项preferences把相关格式文件的默认编辑器设置成Aptana.即,菜单Window»Preferences»General»Etitors»Fill Associations, 然后,在右边选择你想要默认用Aptana编辑的文件格式,然后再选择下面的Aptana插件,并Default为默认.
设置默认关联
3. 为Aptana添加jQuery等支持插件
现在,为Aptana安装插件,以达到更加完美的功能.这一步,依你个人情况而定,主要是对于JS的框架支持,笔者长于jQuery,故安装的是jQuery插件.
在My Studio界面中找到View Plugin Manager(前面有个绿色的图标,如果没有重启一下Zend Studio),点击,会在下面出来一个窗口,然后再点击,该窗口右上角的绿色加号.
安装Aptana插件
接下来,你就能看到插件窗口了,然后选择要安装的插件,比如我选择的是JavaScript Libraries下的jQuery Support.安装方法雷同于第一步,略过.

完成上面的3步,已经将Zend Studio与Aptana完美组合了,但为了达到更完美,下面几步绝对实用.

4. 取消Aptana的起始页
此时,你会发现每次打开Zend Studio都会有一个Aptanan的起始页,如何取消? 菜单Window»Preferences»Aptana»Strartup Page»选中Never display after startup
取消起始页
5. 右上角Aptana图标的显示
为了更好的切换Aptana与PHP模式,是不是希望在视察右上角PHP按键旁边有一个Aptana的小按钮,好办.
菜单Window» Open perspective»other»Aptana Web双击或者选中然后OK.上帝说要有光于是就有了光.
6. 自动换行设置
自动换行,很实用的一个小技巧,但同时,也会有一个BUG,即自动换行后行号显示也是不正确的.有两种方法,第一种,直接在打开的文件中,右键,Toggle word wrap选中即可;另一种,是强制所有的文件打开时都自动换行:菜单Window» Editors»Advanced»Enable word wrap ,选中就可以了.
自动换行
7. 预览项目时不生成tmp文件设置
预览html项目时,会自动生成一个tmp文件,并且,每次都会生成,对于我,这是绝不对容忍的,每次预览完都得去清理文档垃圾.还好,有个方法可以避免: 菜单Window» Editors&raquoHTML»Preview»Generate temporary files for browser preiews取消勾选.
tmp

上面仅是我自己总结的一些小技巧,实际安装使用过程中可能还有更多问题,请大家千万别忘了支持Google一下,她能告诉你很多很多.
Tips, Aptana也有单独的版本,如果你平时工作学习仅限于前端,可下载单独的Aptana,体积要小很多. 在此,也强烈建议,前端工作者作都尝试一下Aptana,你会喜欢上的.

结构/表现/行为完全分离的选项卡(jQ版和原生JS版)

日常项目中常用到的,用jQuery和原生JS分别写了一个. 两种写法均实现了结构/表现/行为的完全分离.当然,稍作修改,可以在同一个页面中应用于多个选项卡.
关于思路,和常规选项卡思路一样.点击选项菜单,突出显示,并显示对应的选项.本文实例中主要是通过判断点击菜单在菜单列表中的索引位置来显示或隐藏选项区.原生js还有很多种实现方法(蓝色理想中搜索),为了与jQ版思路保持一致,本文实例用的是循环判断. 详见注释.
另有几点说明:
1. 通过本文DEMO演示,可以很明显的看到原生JS的window.onload=function(){…}与jQuery的$(document).ready(function(){…});的区别,这也是我为什么不用样式定义初始状态下隐藏第二三个显示区的原因;
2. 本文只是选项卡一个原型实现,若要用于同一页面多个选项卡,变量已集中到函数头部,可自行封装成函数;
3. 请不要问如何实现更酷很炫的效果,请自已思考添加效果;
4. 不希望大家用这个效果时只是机械的复制粘贴,思考加实践,然后消化成自己的.
查看演示: 点此查看DEMO
核心代码:

//jQ版本
$
(function(){
    
var _tab=$('ul.tabnav>li');//获取选项卡导航
    
var _box=$('.tabbox>div');//获取内容切换区
    
var _hover='hover';//当前点击显示的样式
    
var _index;//索引值
    
_tab.eq(0).addClass(_hover);//第一个导航高亮显示
    
_tab.click(function(){
        
_index=_tab.index(this);//获取当前点击的索引值
        $
(this).addClass(_hover).siblings().removeClass(_hover);//当前点击高亮显示
        
_box.eq(_index).show().siblings().hide();//通过索引值让对应的选项内容区显示
    
}).eq(0).click();
});
//原生JS版本
window.onload=function(){
    
var tabnav=document.getElementById('tabnav');
    
var list=tabnav.getElementsByTagName('li');
    
var tabbox=document.getElementById('tabbox');
    
var divs=tabbox.getElementsByTagName('div');
    
var hover='hover';//当前点击显示的样式
    
var indexValue=function(self,obj){//获取索引值的函数,通过它获取当前点击在导航中的索引位置
        
for(var i=0;i<obj.length;i++){
            
if(obj[i]==self) return i;
        
}
    
};
    
var index;
    
list[0].className=hover;//第一个默认高亮,建议在页面中直接定义
    
for(var k=1;k<divs.length;k++){//我为了省事,用一个for循环定义默认显示第一个切换区块,其他隐藏.这个最好用CSS定义,能避免页面加载时它全部显示出来.
        
divs[k].style.display='none';
    
}
    
for(var l=0;l<list.length;l++){//点击事件
        
list[l].onclick=function(){
            
index=indexValue(this,list);//利用前面定义的indexValue函数取当前点击在选项导航中的索引值,
            
for(var m=0;m<list.length;m++){
                
list[m].className= (m==index) ? hover : '';//高亮显示点击项并移除其他项高亮
            
}
            
for(var n=0;n<divs.length;n++){
                
divs[n].style.display= (n==index) ? 'block' : 'none';//显示点击对应的选项区,隐藏其他
            
}
        
}
    
}
}