文档章节

【转】这些年,我收集的JavaScript代码(二)

zimingforever
 zimingforever
发布于 2012/07/30 11:23
字数 1565
阅读 145
收藏 8

以下内容来自,真心不错的系列博文,希望原楼主继续分享:

http://7788a.iteye.com/blog/1610177

 

一、JavaScript跨平台事件

  对于跨平台事件我们一般这么写(只例举添加事件):

function addEventHandler(oTarget, sEventType, fnHandler){
    if(oTarget.addEventListener){
        oTarget.addEventListener(sEventType,fnHandler,false);
    } else if(oTarget.attachEvent){
        oTarget.attachEvent("on"+sEventType,fnHandler);
    } else{
        oTarget["on"+sEventType]=fnHandler;
    }
}

  那么下面这段代码的效果是什么样的呢?

<div id="test">Test</div> ...
var oDiv=document.getElementById("test");
addEventHandler(oDiv,"mouseover",function(){
    alert("over "+this.id);
});

  由于IE的this问题,在IE中果断地弹出了 over undefined,所以跨平台的事件更好的写法是这样的:

function addEventHandler(oTarget, sEventType, fnHandler){
    if(oTarget.addEventListener){
        oTarget.addEventListener(sEventType,fnHandler,false);
    } else if(oTarget.attachEvent){
        oTarget.attachEvent("on"+sEventType,function(){
            return fnHandler.call(oTarget,window.event);
        });
    } else{
        oTarget["on"+sEventType]=fnHandler;
    }
}

二、合并两个Array并去掉重复项

Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j, 1);
        }
    }

    return a;
};//Demo var array1 = ["a","b"];var array2 = ["b", "c"];var array3 = array1.concat(array2).unique();// ["a","b","c"]

三、typeof === "undefined" vs. != null

if(typeof neverDeclared == "undefined") //no errors if(neverDeclared == null) //throws ReferenceError: neverDeclared is not defined

  so,typeof === "undefined" is better!

四、setTimeout(fn, 0)的意义

  浏览器同时要做很多事,这些事情以队列的方式存在,执行JavaScript只是其中之一,setTimeout(fn, 0)表面上看是立即执行的意思,但实际上只是在浏览器事件队列中添加了一个新的事件,由于队列是先进先出,所以fn会等等到当前队列中的事件执行完后再执行。由于JavaScript的定时器回调函数是异步执行的,所以产生的效果就是等页面上同步事件(包括页面渲染与同步JS代码)执行完之后再执行。

  一个简单的示例:

<script type="text/javascript">     //one     document.getElementById("imgTest").style.borderBottom="5px solid #000";

    //two     setTimeout(function(){
        document.getElementById("imgTest").style.borderBottom="5px solid #000";
    }, 0);</script> <img src="http://jscode.chinacxy.com/img_lib/m_400_600_01.jpg" id="imgTest" alt=""/>

  one会报错,因为页面执行到这里时还没有img,但two却可以。

五、增强版取URL中的参数

function getQueryString() {
  var result = {}, queryString = location.search.substring(1),
      re = /([^&=]+)=([^&]*)/g, m;

  while (m = re.exec(queryString)) {
    result[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }

  return result;
}// demo var myParam = getQueryString()["myParam"];

六、检查一个object是否是jQuery object

if(obj instanceof jQuery)

七、检查一个数是否为整数或浮点数

function isInt(n) {
   return typeof n === 'number' && n % 1 == 0;
}// or ,this support ie3 function isInt(n) {
   return typeof n === 'number' && parseFloat(n) == parseInt(n, 10) && !isNaN(n);
}function isFloat (n) {
  return n===+n && n!==(n|0);
}

八、用JavaScript添加style节点

var css = 'h1 { background: red; }',
    head = document.getElementsByTagName('head')[0],
    style = document.createElement('style');

style.type = 'text/css';if(style.styleSheet){
    style.styleSheet.cssText = css;
}else{
    style.appendChild(document.createTextNode(css));
}
head.appendChild(style);

九、如何跳出双重循环

function foo ()
{
    dance:
    for(var k = 0; k < 4; k++){
        for(var m = 0; m < 4; m++){
            if(m == 2){
                break dance;
            }
        }
    }
}

十、把一个Array追加到另一个Array上

var a=[1,2],b=[3,4,5];

a.push.apply(a,b);/*a: [1, 2, 3, 4, 5]*/

十一、用jQuery把页面上的一个tag换成另一个tag

  如把页面上所有的code换为pre:

<code> A </code> <code> B </code> <code> C </code> //change to<pre> A </pre> <pre> A </pre> <pre> A </pre>

  jQuery代码:

$('code').contents().unwrap().wrap('<pre/>');//or $('code').replaceWith(function(){
    return $("<pre />").append($(this).contents());
});

十二、取数组中的最小值和最大值

var arr = new Array();
arr[0] = 100;
arr[1] = 0;
arr[2] = 50;var min = Math.min.apply(null, arr),
    max = Math.max.apply(null, arr);

十三、取两个数组交集

/* finds the intersection of 
 * two arrays in a simple fashion.  
 *
 * PARAMS
 *  a - first array, must already be sorted
 *  b - second array, must already be sorted
 *
 * NOTES
 *
 *  Should have O(n) operations, where n is 
 *    n = MIN(a.length(), b.length())
 */ function arrayIntersection(a, b)
{
  var ai=0, bi=0;
  var result = new Array();

  while( ai < a.length && bi < b.length )
  {
     if      (a[ai] < b[bi] ){ ai++; }
     else if (a[ai] > b[bi] ){ bi++; }
     else /* they're equal */      {
       result.push(a[ai]);
       ai++;
       bi++;
     }
  }

  return result;
}

console.log(arrayIntersection([1,2,3],[2,3,4,5,6]));//[2,3]

  注释中已经说明了,传入的数组要已经排过序的。

十四、统计一个字符串中某段子串出现的次数

var temp = "This is a string.";var count = temp.match(/is/g).length;

十五、方法返回多个值

//One var mValues= function(){  
    var a ="a"; 
    var b = "b";   
    return [a, b];  
};var values= mValues();var valOne= values[0];var valTwo = values[1];//Two var mValues= function(){  
    var a= "a";
    var b = "b";    
    return {
        'a': a,
        'b': b
    };  
};var values= mValues();var valOne= values.a;var valTwo = values.b;

十六、Array迭代器

function createIterator(x) {
    var i = 0;

     return function(){
       return x[i++];
    };
}var iterator=createIterator(['a','b','c','d','e','f','g']);var current;while(current=iterator())
{
    console.log(current);
}

  注意,如果数组中有0、false、""、null、NaN迭代器将会停止。

十七、根据日计算年龄

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}
console.log(getAge("2005,8,1"));//6

十八、判断当前页面是否被放入了iframe中

if(self==top){
      //not in iframe }else{
      //in iframe }

  这段代码可以用来防止网页被放入iframe中,不过如果别人定义了self和top变量覆盖了浏览器默认值可能会失效。

十九、把arguments转换为Array

var args = Array.prototype.slice.call(arguments, 0);

二十、日期格式化
  来源:javascript日期格式化函数,跟C#中的使用方法类似

Date.prototype.toString=function(format,loc){
    var time={};
    time.Year=this.getFullYear();
    time.TYear=(""+time.Year).substr(2);
    time.Month=this.getMonth()+1;
    time.TMonth=time.Month<10?"0"+time.Month:time.Month;
    time.Day=this.getDate();
    time.TDay=time.Day<10?"0"+time.Day:time.Day;
    time.Hour=this.getHours();
    time.THour=time.Hour<10?"0"+time.Hour:time.Hour;
    time.hour=time.Hour<13?time.Hour:time.Hour-12;
    time.Thour=time.hour<10?"0"+time.hour:time.hour;
    time.Minute=this.getMinutes();
    time.TMinute=time.Minute<10?"0"+time.Minute:time.Minute;
    time.Second=this.getSeconds();
    time.TSecond=time.Second<10?"0"+time.Second:time.Second;
    time.Millisecond=this.getMilliseconds();
    time.Week=this.getDay();

    var MMMArrEn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
    var MMMArr=["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"];
    var WeekArrEn=["Sun","Mon","Tue","Web","Thu","Fri","Sat"];
    var WeekArr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];

    var oNumber=time.Millisecond/1000;

    if(format!=undefined && format.replace(/\s/g,"").length>0){
        if(loc!=undefined && loc =="en"){
            MMMArr=MMMArrEn.slice(0);
            WeekArr=WeekArrEn.slice(0);
        }
        format=format
            .replace(/yyyy/ig,time.Year)
            .replace(/yyy/ig,time.Year)
            .replace(/yy/ig,time.TYear)
            .replace(/y/ig,time.TYear)
            .replace(/MMM/g,MMMArr[time.Month-1])
            .replace(/MM/g,time.TMonth)
            .replace(/M/g,time.Month)
            .replace(/dd/ig,time.TDay)
            .replace(/d/ig,time.Day)
            .replace(/HH/g,time.THour)
            .replace(/H/g,time.Hour)
            .replace(/hh/g,time.Thour)
            .replace(/h/g,time.hour)
            .replace(/mm/g,time.TMinute)
            .replace(/m/g,time.Minute)
            .replace(/ss/ig,time.TSecond)
            .replace(/s/ig,time.Second)
            .replace(/fff/ig,time.Millisecond)
            .replace(/ff/ig,oNumber.toFixed(2)*100)
            .replace(/f/ig,oNumber.toFixed(1)*10)
            .replace(/EEE/g,WeekArr[time.Week]);
    }
    else{
        format=time.Year+"-"+time.Month+"-"+time.Day+" "+time.Hour+":"+time.Minute+":"+time.Second;
    }
    return format;
}var d=new Date();
console.log(d.toString());    //2012-7-27 9:26:52 console.log(d.toString(""));    //2012-7-27 9:26:52 console.log(d.toString("yyyy-MM-dd HH:mm:ss"));    //2012-07-27 09:26:52 console.log(d.toString("yyyy年MM月dd日 HH:mm:ss"));    //2012年07月27日 09:26:52 console.log(d.toString("yyyy-MM-dd HH:mm:ss fff"));    //2012-07-27 09:26:52 237 console.log(d.toString("yyyy年 MMM dd EEE"));    //2012年 七月 27 星期五 console.log(d.toString("yyyy MMM dd EEE","en"));    //2012 Jul 27 Fri

© 著作权归作者所有

共有 人打赏支持
zimingforever
粉丝 144
博文 264
码字总数 300408
作品 0
杭州
程序员
私信 提问
JavaScript 编程精解 中文第三版 零、前言

零、前言 原文:Introduction 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了《JavaScript 编程精解(第 2 版)》 We think we are creating the system for our own purp...

ApacheCN_飞龙
06/01
0
0
JavaScript的基本使用

一、JavaScript的简单介绍   JavaScript是一种属于网络的脚本语言(简称JS),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaS...

码农47
03/15
0
0
从零开始学 Web 之 jQuery(一)jQuery的概念,页面加载事件

大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN...

fengdaoting
07/04
0
0
iOS与JS交互之WKWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/01
0
0
百度插件uaredirect.js电脑版跳转到手机版网站

一、介绍 这段时间,有好多朋友问我,跳转到手机版的那个JS是怎么写的。其实这个JS也不是我写的,是百度siteapp下的一款跳转的产品,使用起来很方便。你可以用这款JS跳转到手机版,也可以跳转...

lovethe51cto
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark性能优化之道

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partition...

GordonNemo
31分钟前
2
0
大数据驱动业务决策,CDN实时日志重磅上线

摘要: 阿里云CDN上线了实时日志功能,打通日志服务(SLS)的能力,将CDN采集的实时日志,在小于60秒的时间内投递至日志服务,进行实时、交互式分析和报表呈现。通过CDN日志的实时分析,可以快...

阿里云官方博客
37分钟前
3
0
springCloud学习笔记系列(3)-服务容错保护:Spring Cloud Feign

Feign包含了Ribbon和Hystrix,这个在实战中才慢慢体会到它的意义,所谓的包含并不是Feign的jar包包含有Ribbon和Hystrix的jar包这种物理上的包含,而是Feign的功能包含了其他两者的功能这种逻...

快乐的小火柴
38分钟前
1
0
各种数据库数据类型差异

文本 整数 浮点数 decimal Hive数据库 create table default.foo ( a DECIMAL, -- Defaults to decimal(10,0) b DECIMAL(20), -- Defaults to decimal(20,0) c DECIMAL(9, 7), d DE......

了凡川
43分钟前
4
0
springboot中filter的用法

一、在spring的应用中我们存在两种过滤的用法,一种是拦截器、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。 二、f...

xiaomin0322
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部