标签为 "Javascript" 的存档

Javascript 异步加载详解【转载】

本文总结一下浏览器在 javascript 的加载方式。
关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属性, defer 属性
一、同步加载与异步加载的形式
1. 同步加载
我们平时最常使用的就是这种同步加载形式:
<script src="http://yourdomain.com/script.js"></script>
同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。
 js 之所以要同步执行,是因为 js 中可能有输出 document 内容、修改dom、重定向等行为,所以默认同步执行才是安全的。
以前的一般建议是把<script>放在页面末尾</body>之前,这样尽可能减少这种阻塞行为,而先让页面展示出来。
简单说:加载的网络 timeline 是瀑布模型,而异步加载的 timeline 是并发模型。

2. 常见异步加载(Script DOM Element)

(function() {
     var s = document.createElement('script');
     s.type = 'text/javascript';
     s.async = true;
     s.src = 'http://yourdomain.com/script.js';
     var x = document.getElementsByTagName('script')[0];
     x.parentNode.insertBefore(s, x);
 })();

异步加载又叫非阻塞,浏览器在下载执行 js 同时,还会继续进行后续页面的处理。

Read more…

JavaScript面向对象15分钟教程 – OO JS in 15mins or Less

本指南可以很快让你学会写优美的面向对象JavaScript代码,我保证!学会写简洁的JavaScript代码对一个开发者的发展很重要,随着像Node.js这类技术的出现,你现在可以在服务器端写JavaScript代码了,你甚至可以用JavaScript来查询像MongoDB这样的持久性数据存储。

现在开始写面向对象的JS(OO JS),如果你有什么问题或我遗漏了什么,在下面评论出告诉我。

Literal Notation
Literal Notation只是在JavaScript中创建对象的一种方法,是的,方法不止这一种。当你打算创建一个对象实例的时候Literal Notation是首选的方法。
var bill = {}; 

上面的代码没太大用处,仅仅只是创建了一个空对象。让我们动态的添加一些属性和方法到这个对象。

bill.name = "Bill E Goat";
bill.sound = function() {
	console.log( 'bahhh!' );
};

这里我们添加了“name”属性并赋值为“Bill E Goat”。我们不一定要在前面创建空对象,还可以只用一步完成上面 所有的事。

var bill = {
  name: "Bill E Goat",
  sound: function() {
    console.log( 'bahhh!' );
  }
};

很简洁漂亮是不是?访问属性和方法也一样很简单。

bill.name; // "Bill E Goat"
bill.sound(); // "bahhh"

Read more…

javascript js 十进制转十六进制 进制变换

今天再做一个中国地图的可视化展现,需要对每个省份的轮廓进行染不同颜色,以此来区分各个省份。
用的是百度地图,所以需要用JS来生成Polygon多边形,然后用颜色填充,现在需要随机生成颜色,所以需要随机生成3个0-16的16进制数,拼接起来,作为一个颜色的RGB值。
不多说,直接上简单明了的JS代码,如何随机生成0-16的数,然后把十进制的值转换为十六进制。

var r = parseInt(Math.random()*16);
var g = parseInt(Math.random()*16);
var b = parseInt(Math.random()*16);
//转换为十六进制,使用 int.toString(16)即可.
//相应的,还可以使用toString(10) , toString(8), toString(2)来转化为十进制,八进制,二进制等。
r = r.toString(16);
g = g.toString(16);
b = b.toString(16);
//拼接成颜色的RGB值
var color = '#'+r+g+b;

Read more…

IE7/IE8下javascript的时间函数Date()不兼容讲解–来自amcharts应用中的问题

最近在使用ammap和amcharts做一些数据可视化展现的工作,amcharts图表功能真的很强大,可自定义的属性很多。这是其官网文档链接。可以简单看看文档,会发现有很多属性,可以对图表中的每块表示数据的区域绑定事件,可以是一个url,也可以是一个js,怎么样,只有这两项,就绝对能满足很多扩展的需要了吧。

这是一个我做的例子,使用了ammap和amcharts,左边中国地图,不同省份的数据不一样,颜色代表不同等级的数据;右边是amcharts做的柱状图和折线图。

ammap和amcharts的案例--好用可扩展的javascript图表插件

ammap和amcharts的案例--好用可扩展的javascript图表插件

问题就在使用图表的过程中了,主要是右下角的那个折线图,在chrome、firefox、opera和IE9下均看过了,没有问题,可是到别人机器上,用的IE8,发现右下角的折线图出问题了。于是开始了JS的调试之旅,使用IE9的开发人员工具,可以很方便的调到IE7和IE8模式,之前一直都是firefox的firebug,现在一直都在用chrome,今天用了用IE9的调试工具,发现也挺好用的,主要是它有一个选项,可以设置为-始终从服务器中刷新,这样,每次IE运行获得的JS和CSS文件等,都不会是缓存中来的,调试起来很方便,不用总去清缓存。见下图:

Read more…

jquery 滑动 回到顶部代码

jQuery实现滑动回到顶部效果:

$('html, body').animate({scrollTop: 0},500);

Read more…

jQuery数组处理完全详解($.each,$.grep,$.map,$.merge,$.inArray,$.unique,$.makeArray)

jQuery的数组处理、便捷、功能齐全。最近的项目中用到的比较多,深感实用,一步到位的封装了很多原生JavaScript数组不能企及的功能。最近时间紧迫,今天抽了些时间回过头来看jQuery中文文档中对数组的介绍,顺便对jQuery数组做个总结,温故而知新。
强烈建议你打开DEMO演示后再看下面的详解:http://mrthink.net/demo/ijq20101125.htm

1. $.each(array, [callback]) 遍历[常用]

解释: 不同于例遍jQuery对象的$().each()方法,此方法可用于例遍任何对象。回调函数拥有两个参数:第一个为对象的成员或数组的索引, 第二个为对应变量或内容. 如果需要退出each循环可使回调函数返回false, 其它返回值将被忽略。

each遍历,相信都不陌生,在平常的事件处理中,是for循环的变体,但比for循环强大。在数组中,它可以轻松的攻取数组索引及对应的值。例:

var _mozi=['墨家','墨子','墨翟','兼爱非攻','尚同尚贤']; //本文所用到的数组, 下同
$.each(_mozi,function(key,val){
    //回调函数有两个参数,第一个是元素索引,第二个为当前值
    alert('_mozi数组中 ,索引 : '+key+' 对应的值为: '+val);
});

相对于原生的for..in,each更强壮一点。for..in也可以遍历数组,并返回对应索引,但值是需要通过arrName[key]来获取。

2. $.grep(array, callback, [invert])过滤数组[常用]

解释: 使用过滤函数过滤数组元素.此函数至少传递两个参数(第三个参数为true或false,对过滤函数返回值取反,个人觉得用处不大): 待过滤数组和过滤函数. 过滤函数必须返回true以保留元素或 false 以删除元素. 另外,过滤函数还可以是可设置为一个字条串。

$.grep(_mozi,function(val,key){
    //过滤函数有两个参数,第一个为当前元素,第二个为元素索引
    if(val=='墨子'){
        alert('数组值为 墨子 的下标是: '+key);
    }
});

var _moziGt1=$.grep(_mozi,function(val,key){
    return key>1;
});
alert('_mozi数组中索引值大于1的元素为: '+_moziGt1);

var _moziLt1=$.grep(_mozi,function(val,key){
    return key>1;
},true);
//此处传入了第三个可靠参数,对过滤函数中的返回值取反
alert('_mozi数组中索引值小于等于1的元素为: '+_moziLt1);

Read more…

将 DIV 放置于 Flash之上 – ammap实战

做一个基于中国地图的数据展示。查找了一些资料,打算使用ammap,研究一番之后,终于明白一些。
通过设定数据文件ammap_data.xml中的area标签的url属性,可以设置为一个javascript:functionname();来调用一个JS函数。这下容易多了,可以通过JS去获得数据,添加到一个层,然后显示出来即可。
但是实践的时候又遇到一个问题,不管怎么设置层的CSS值,包括position,z-index,left,top 啊等等,层总是被flash给遮挡住,。查了点资料,原来flash是有一个属性设置的,可以设置是否置顶,不会被其它元素遮挡住。那么只要改一下就可以了。
ammap是用了封装好的一个swfobject类来生成flash的相关参数的,并且这个类是被压缩了的,。但是只要格式化一下就OK了。
然后找到<object></object>标签,在其中加入<param name=”wmode” value=”opaque” />,由于两边有双引号,自己注意加反斜线的转义。

好,现在试一下,诶?怎么不行?用IE看一下,结果IE下是可以的,但是chrome和firefox中都办不到。不用急,再在swfobject类中找到<embed>标签,对它加一个属性wmode=”opaque”,注意加转义字符。然后再打开看下效果。OK啦。

div放到flash之上-ammap-css-javascript-flash

div放到flash之上-ammap-css-javascript-flash

Read more…

jQuery- 对Select Option的操作集合大全

话不多说,直接上代码和注释,需要什么一看就明了。

//jQuery获取Select选择的Text和Value:

$("#select_id").change(function(){//code...});   //为Select添加事件,当选择其中一项时触发
var checkText=$("#select_id").find("option:selected").text();  //获取Select选择的Text
var checkValue=$("#select_id").val();  //获取Select选择的Value
var checkIndex=$("#select_id ").get(0).selectedIndex;  //获取Select选择的索引值
var maxIndex=$("#select_id option:last").attr("index");  //获取Select最大的索引值 

//jQuery设置Select选择的Text和Value:

$("#select_id ").get(0).selectedIndex=1;  //设置Select索引值为1的项选中
$("#select_id ").val(4);   //设置Select的Value值为4的项选中
$("#select_id option").attr("selected", true);   //设置Select的Text值为jQuery的项选中

//jQuery添加/删除Select的Option项:

$("#select_id").append("<option value='Value'>Text</option>");  //为Select追加一个Option(下拉项)
$("#select_id").prepend("<option value='0'>请选择</option>");  //为Select插入一个Option(第一个位置)
$("#select_id option:last").remove();  //删除Select中索引值最大Option(最后一个)
$("#select_id option[index='0']").remove();  //删除Select中索引值为0的Option(第一个)
$("#select_id option[value='3']").remove();  //删除Select中Value='3'的Option
$("#select_id option").remove();  //删除Select中Text='4'的Option

Read more…

jQuery 延迟 函数 让层延时几秒后消失

jquery 让一个div延时消失,纯jQuery,不用settimeout,就用jQuery写。

<script language='javascript' type='text/javascript'>
$(document).ready(
    function()
    {
        /**
        *1.delay函数是jquery 1.4.2新增的函数
        *2.hide函数里必须放一个0,不然延时不起作用
        */
        $('#divid').delay(10000).hide(0);
    }
);
</script>

Read more…

Javascript cookie使用详解

设置cookie
每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie:
document.cookie=”userId=828″;
如果要一次存储多个名/值对,可以使用分号加空格(; )隔开,例如:
document.cookie=”userId=828; userName=hulk”;
在cookie的名或值中不能使用分号(;)、逗号(,)、等号(=)以及空格。在cookie的名中做到这点很容易,但要保存的值是不确定的。如何来存 储这些值呢?方法是用escape()函数进行编码,它能将一些特殊符号使用十六进制表示,例如空格将会编码为“%20”,从而可以存储于cookie值 中,而且使用此种方案还可以避免中文乱码的出现。例如:
document.cookie=”str=”+escape(“I love ajax”);
相当于:
document.cookie=”str=I%20love%20ajax”;
当使用escape()编码后,在取出值以后需要使用unescape()进行解码才能得到原来的cookie值,这在前面已经介绍过。
尽管document.cookie看上去就像一个属性,可以赋不同的值。但它和一般的属性不一样,改变它的赋值并不意味着丢失原来的值,例如连续执行下面两条语句:
document.cookie=”userId=828″;
document.cookie=”userName=hulk”;
这时浏览器将维护两个cookie,分别是userId和userName,因此给document.cookie赋值更像执行类似这样的语句:
document.addcookie(“userId=828”);
document.addcookie(“userName=hulk”);
事实上,浏览器就是按照这样的方式来设置cookie的,如果要改变一个cookie的值,只需重新赋值,例如:
document.cookie=”userId=929″;
这样就将名为userId的cookie值设置为了929。
Read more…