The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

#

1、百度地图API

车联网API网址:http://developer.baidu.com/map/carhome.htm
登录http://lbsyun.baidu.com/apiconsole/key?application=key获得密钥
通过坐标取用户位置(反Geocoding)http://api.map.baidu.com/telematics/v2/reverseGeocoding?location=116.305145,39.982368&ak=yourkey
测距http://api.map.baidu.com/telematics/v2/distance?waypoints=118.77147503233,32.054128923368;116.3521416286,39.965780080447&ak=yourkey
获取经纬度http://www.gpsspg.com/maps.htm
天气查询http://api.map.baidu.com/telematics/v2/weather?location=北京&ak=yourkey

http://api.map.baidu.com/telematics/v2/weather?location=经度,纬度&ak=yourkey

查询周边商家http://api.map.baidu.com/telematics/v2/local?location=经度,纬度&keyword=类型&ak=yourkey&radius=半径&number=10
导航地图http://developer.baidu.com/map/uri.htm
http://api.map.baidu.com/direction?origin=latlan:34.264642646862,108.95108518068|name:我家&destination=大雁塔&mode=driving&region=西安&output=html&src=yourCompanyName|yourAppName  (mode可以为driving架车、transit公交、walking步行)

2、Google地图API

https://developers.google.com/maps/?hl=zh-cn

申请密码https://code.google.com/apis/console
经纬度解析http://maps.googleapis.com/maps/api/geocode/xml?latlng=23.416155105336312,116.6294002532959&sensor=false&language=zh-CN
测距/测时https://developers.google.com/maps/documentation/distancematrix/

http://maps.googleapis.com/maps/api/distancematrix/xml?origins=经度,纬度&destinations=经度,纬度&mode=walking&language=zh-CN&sensor=false

(origine起点、destinations终点、sensor感应器是否启动gps、mode包含driving/walking/bicyilng、language语言、avoid避开highways高速tolls收费)
查询周边商家https://developers.google.com/places/

https://developers.google.com/places/documentation/search?hl=zh-CN

https://maps.googleapis.com/maps/api/place/search/xml?location=经度,纬度&radius=3000&sensor=false&key=yourkey&keyword=餐馆&language=zh-CN

3、高德地图API

http://code.autonavi.com/index

浏览器调用http://code.autonavi.com/URI/browser_guide
接口格式http://mo.amap.com/?from=经度,纬度&to=经度,纬度&type=0&opt=1&dev=1

4、小黄鸡(试用每天只能调100次,30美元/10万次调用)

http://developer.simsimi.com/api?lang=zh_CN

试用地址http://sandbox.api.simsimi.com/request.p (参数key密钥、text用户的问题、lc语言中文ch)

5、百度翻译

http://developer.baidu.com/ms/translate

接口http://openapi.baidu.com/public/2.0/bmt/translate  (参数from源码语言ch中文、en英文、jp日语、auto自动)

http://openapi.baidu.com/public/2.0/bmt/translate?client_id=yourApiKey&q=关键词&from=auto&to=auto

6、快递查询
申请KEY  http://www.aikuaidi.cn/api/?type=1

http://www.aikuaidi.cn/rest/?key=参数&order=快递单号&id=快递拼音&ord=排序方式&show=

(圆通yuantong/申通shentong/EMSems/韵达yunda/顺丰shunfeng,ord排序asc/desc,show可以为JSON/XML/HTML)

7、每日笑话(不限次数,不用申请KEY)

http://api.94qing.com/?type=joke&msg=

8、RSS订阅

http://www.baidu.com/search/rss.html

9、刮刮乐(只是源码地址,需要封装管理程序)

http://kuro.tw/scratch.html

10、第三方接口
乐享微信http://www.wxapi.cn/  (收费,不开源)
365微服务http://www.weduty.com  (收费,不开源)
宾果科技https://github.com/takura/WeChat4DiscuzX-Binguo  (discuz论坛插件、名费、开源)
小I机器人http://www.xiaoi.com  (智能聊天,收费,不开源)
V5智能客服http://www.v5kf.com  (基础免费、增值收费、不开源)
小九机器人http://www.xiaojo.com  (免费、开源)
微擎http://www.we7.cc/  (免费、开源)

11、百度BAE以及新浪SAE
百度BAE  http://developer.baidu.com/  (免费创建10个应用,每天200M免费流量,数据库每月1G免费流量,缓存为memcache不免费1.6元/GB/天)
计费  http://developer.baidu.com/dev#/price/charge
新浪SAE  http://sae.sina.com.cn/ (免费创建10个应用)
计费  http://sae.sina.com.cn/?m=devcenter&catId=155

12、WAP在线生成

http://siteapp.baidu.com/

13、百度应用中心

http://r2.mo.baidu.com/webapp_html.php?version=4_0&fn=webpage_flash

posted @ 2014-10-08 17:55 Eric_jiang 阅读(641) | 评论 (0)编辑 收藏

微信开放平台
  主要面向App开发者 通常前提是拥有成熟的应用程序 之后通过开放平台 将内容分享至朋友圈 发送给某个微信好友.

  微信公众平台

  强调信息流 既可以向微博一样主要推送内容 也可以像10086一样 根据用户发来的消息进行智能回复 后台可以实现某些功能.

  详解:

  微信开放平台也即open平台,公众平台即是mp平台,目前open 平台是腾讯移动生活电商团队——微生活在使用,以下是区别。

  详解微生活商家后台与公众平台的区别

  微信是腾讯近两年崛起的一个新颖的语音沟通工具,随着微信5.0内测版本的发布,扫描二维码、条形码、甚至街景的功能;摇一摇增加了视频功能;公众账号分为企业账号和订阅账号等最新变化的出现,使得微信“横扫一切”“O2O神器”等标签更加流行。而从去年开始流行的“微信扫描二维码 免费获得会员卡”的微生活团队正是腾讯移动生活电商旗下的全新专注生活电子商务与O2O的解决方案提供商,大街小巷铺满商家二维码掀起了全国范围内的微信扫描风潮。据了解微生活有专门的商家后台帮助商家解决CRM会员关系管理、精准营销等问题,与微信的公众平台后台有所区别,一下即是笔者总结的二者的一些区别和联系。

  1、 整体概览

  5.0之前的微信公众平台媒体属性貌似更强一些,打开微信公众平台第一眼看见的就是实时消息。这里可以看到账号当前增加了多少粉丝、有多少用户留言。其次的重点就是开放接口,微信作为一个大的平台需要给各位开发者以更多的方便,绿色的公众平台API文档方便开发者直接点击进入,高级功能中的开发模式更为开发者提供了广阔的空间。

  然而微生活商家后台则没有实时消息这个功能,因为用户的留言都已经被商家的多客服系统处理完毕,这与微生活的泛会员管理与营销平台的定位有很大的关系,时时解决会员的问题,帮助用户完成订单、订位、订房等工作,甚至是陪用户闲聊和调戏,实现用户在移动端的良好体验。总之,微生活商家后台更适合商家去做CRM 管理和会员营销。

  从二者的首页中笔者读出一个趋势——大数据管理,对于商家和媒体来说,数据管理必不可少,而从两个平台首页明显的数据折线图来看,二者都focus 在大数据上。

  微信开拓了一种语音沟通的新时尚,而腾讯微生活开拓了创新的富媒体会员营销平台,解决企业数据库管理、会员关系管理、会员精准营销等问题,为传统商企打开了进军移动互联网的大门。

  2、 首页

  微信公众平台功能模块包括:首页、实时消息、用户管理、群发消息、素材管理、设置、高级功能。

  打开微信公众平台即可看到实时消息、每日新增订阅人数和每日接收消息数的曲线图表,可以使得用户时时把控每日情况,但是无法看到多日的消息对比。首页右侧是系统公告 ,公众平台接口更新等通知。微信未来要做的是个平台,开放平台,首页的公告是为微信的开发者进行更多的指引。

  微生活商家后台功能模块包括:首页、会员、交易、消息、活动、设置 。

  打开微生活商家后台首先看到的是会员趋势图,包括新增总量、线下扫码增量、线上传播新增量等分类,这比微信公众平台的的会员增长图坐标要复杂一些。因为微生活会员卡是用户通过打开微信扫描二维码后,获得的一张存在于微信中的虚拟会员卡,而二维码可以存在在海报、桌贴、宣传册等线下物料上,也可以放置在微博、微信、论坛、网站等线上渠道。微生活首页右侧呈现的是今日和昨日的新增会员和交易次数、会员带动交易额。这与微生活致力于成为传统商企精准的泛会员管理与营销平台有着很大的关系,商家人员登录商家后台可以清楚明了的看到自家店面的整体销售情况和会员增长情况,时时把控商机和运营情况。

posted @ 2014-10-06 09:49 Eric_jiang 阅读(1450) | 评论 (4)编辑 收藏

关于注册公众账号这块不详细介绍

注册完成,审核认证完,就可以开始玩了

1.如何成为开发者?

\

需要填写接口配置信息,需要自己的服务器资源,一般自己没有服务器,所以可以采用云服务器,例如BAE,SAE,阿里云服务器。这里用BAE

2.打开百度开放云平台官网,注册,登陆,点击开发者服务管理

\

\加载中...

2.1.点击“创建工程”

\

填写工程相关信息,应用名称自定义,类型选择java-tomcat,域名唯一,代码管理工具选择svn 到这里,bae应用创建完了.

3.现在来实现TOKEN验证的代码部分

3.1.创建一个Java web工程,我用的是MyEclipse8.5,工程名称为voastudy,点击Finish完成。

\

3.2.新建一个servlet,这里是CoreServlet,点击Next.

\

 

3.3.勾选创建web.xml,以及配置servlet,这里的路径很关键,这是去请求servlet里的方法

\

 

3.4.实现验证TOKEN方法,微信公众平台提供的是PHP的实例代码.但其验证本质是一样的,都是要经过排序,sha1加密进行比较。请参考下面的代码。这是CoreServlet.java类.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package wx.sunl.servlet;
  
import java.io.IOException;
import java.io.PrintWriter;
  
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
import wx.sunl.util.SignUtil;
  
@SuppressWarnings("serial")
public class CoreServlet extends HttpServlet 
{
    public CoreServlet() {
        super();
    }
    public void destroy() {
        super.destroy(); 
    }
  
    /**
     * 验证url和token
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
        // 微信加密签名
        String signature = request.getParameter("signature");
        // 时间戮
        String timestamp = request.getParameter("timestamp");
        // 随机数
        String nonce = request.getParameter("nonce");
        // 随机字符串
        String echostr = request.getParameter("echostr"); 
          
        PrintWriter out = response.getWriter();
        // 通过检验 signature 对请求进行校验,若校验成功则原样返回 echostr,表示接入成功,否则接入失败
       if(SignUtil.checkSignature(signature, timestamp, nonce)){
           out.print(echostr);
       }
  
       out.close();
       out = null
    }
  
    /**
     *用户向公众平台发信息并自动返回信息
     */
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  
          
    }
  
    public void init() throws ServletException {
    }
  
}
其中调用到了SignUtil类的checkSignature方法,下面是SignUtil.java类.注意:其中一个静态属性token的值,在最后一步需要用到来验证的.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package wx.sunl.util;
  
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
  
public class SignUtil {
    /**
     * 与接口配置信息中的 token 要一致,这里赋予什么值,在接口配置信息中的Token就要填写什么值,
     * 两边保持一致即可,建议用项目名称、公司名称缩写等,我在这里用的是项目名称weixinface
     */
    private static String token = "weixintest";
      
    /**
     * 验证签名
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce){
        String[] arr = new String[]{token, timestamp, nonce};
        // 将 token, timestamp, nonce 三个参数进行字典排序
        Arrays.sort(arr);
        StringBuilder content = new StringBuilder();
        for(int i = 0; i < arr.length; i++){
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;
          
        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行 shal 加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        content = null;
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
    }
      
    /**
     * 将字节数组转换为十六进制字符串
     * @param digest
     * @return
     */
    private static String byteToStr(byte[] digest) {
        // TODO Auto-generated method stub
        String strDigest = "";
        for(int i = 0; i < digest.length; i++){
            strDigest += byteToHexStr(digest[i]);
        }
        return strDigest;
    }
      
    /**
     * 将字节转换为十六进制字符串
     * @param b
     * @return
     */
    private static String byteToHexStr(byte b) {
        // TODO Auto-generated method stub
        char[] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(b >>> 4) & 0X0F];
        tempArr[1] = Digit[b & 0X0F];
          
        String s = new String(tempArr);
        return s;
    }
}

4.代码已经写完了,现在来提交代码到svn.如果没有svn客户端工具,那首先下载(svn版本工具)安装。打开svn

\

4.1.这里的url去百度开放云平台去这里复制

\

4.2.粘贴url,打开svn,会看到服务器的2个文件

\

 

4.3.代码提交到svn 首先删掉root.war

\

4.4.java web工程打包成war包,取名ROOT.war,然后提交到svn

\

 

4.5.然后将这个war包提交到svn

\


4.6.如果提交成功了,百度开放云平台会检测到有新版本产生,选中应用,点击“发布设置”

\


4.7.发布新版本

\


5.发布成功后,测试是否部署成功?


5.1.如果看到这个,离成功只差一步啦。<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140510/2014051009050433.jpg" alt="\">


5.5.在域名后边加上请求我们刚刚servlet的请求路径,上边的例子是/CoreServlet,如果报505错误(why?因为那几个参数都是空的),说明部署成功了

\


6.最后一步,填写Url 和 Token来验证 成为开发者。Url:百度应用的域名+请求servlet的路径例如:http://weixintest11.duapp.com/CoreServlet.Token是在程序中自定义的值(在SignUtil.java中定义)



欢迎吐槽!!!

posted @ 2014-09-30 11:52 Eric_jiang 阅读(4365) | 评论 (2)编辑 收藏

     摘要: Dojo 的这些接口大大简化了我们的 Web 前端开发的复杂度,使得我们能够在更短的时间内实现功能更为丰富的应用。这篇文章将重点介绍 Dojo 的核心接口所带给 Web 开发工程师们的各种便利以及它的一些使用技巧。Dojo 核心接口简介Dojo 的核心接口主要位于 Dojo 的三大库(“dojo”,“dijit”和“dojox”...  阅读全文
posted @ 2014-09-01 17:20 Eric_jiang 阅读(562) | 评论 (0)编辑 收藏

Define

先看define。作用是定义一个模块(module)。这个模块可以被require引用,引用了之后就可以使用define里面的东西。一个模块想当然,里面干什么事情,不一定全部自己实现。就像人要coding,除了脑子,也不能没有电脑、键盘。因此,define的第一个参数就是将要用到的其他模块引进来。第二个参数描述这个模块具体干什么,并且给第一个参数中的模块分别起一个朗朗上口的名字。就像下面这段代码描述的样子。

 

util.js

[javascript] 
  1. define([ "dojo/dom"], function(dom) {  
  2.     return {  
  3.         setRed: function(id){  
  4.             dom.byId(id).style.color = "red";  
  5.         }  
  6.     };  
  7. });  

这是一个工具模块,其中一个功能就是把网页上id对应的DOM节点变成红色。当我们要使用它的时候,就可以用require了。

 

test.jsp

[html]  
  1. <script>  
  2.     require(  
  3.         [ "dojo/ready", "test/util" ],  
  4.         function(ready, util) {  
  5.             ready(function() {  
  6.                 var id = "selected_text";  
  7.                 util.setRed(id);  
  8.             });  
  9.         });  
  10. </script>  

Declare

可以看到,上面的模块util作为工具模块,可以在被引用后任意调用其功能。这是无状态的,就好象是一个singleton的对象。但如果我们想定义“类”一样的东西,有状态,可以创建多个对象,就需要在define里用declare。最典型的例子就是dijit下面的诸多UI小控件。

举个很简单的例子,我希望基于dijit.Dialog,创建一个有特殊功能的dialog,每次打开后能把上面的一段text标记为红色。

 

RedTextDialog.js

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. define([ "dojo/_base/declare", "dijit/Dialog", "dijit/_WidgetBase",  
  2.         "dijit/_TemplatedMixin", "test/util" ], function(declare,  
  3.         Dialog, _WidgetBase, _TemplatedMixin, util) {  
  4.     return declare("test.RedTextDialog", [ Dialog, _WidgetBase, _TemplatedMixin ], {  
  5.         title: "Dialog with Red Text",  
  6.           
  7.         onDownloadEnd : function() {  
  8.             var id = "selected_text";  
  9.             util.setRed(id);  
  10.         }  
  11.     });  
  12. });  

RedTextDialog可以重写dijit.Dialog所有的方法,也可以自创方法、变量,实现自己想要的任意功能。接下来可以用require使用它。

[html] 
  1. <script>  
  2.     require(  
  3.         [ "dojo/ready", "test/RedTextDialog" ],  
  4.         function(ready, RedTextDialog) {  
  5.             ready(function() {  
  6.                 var dialog = new RedTextDialog();  
  7.                 dialog.show();  
  8.             });  
  9.         });  
  10. </script>  

可以看到,每次使用RedTextDialog时,都可以创建一个新的对象实例,因此可以做到互相之间没有关系。

目录结构


为了在test.jsp中调用上述js文件,需要在test.jsp声明js文件的位置。

[javascript] 
  1. <script>  
  2.     dojoConfig = {  
  3.         isDebug : false,  
  4.         parseOnLoad : true,  
  5.         async : true,  
  6.         packages : [   
  7.             {  
  8.                 name : "test",  
  9.                 location : "../../js/test"  
  10.             }  
  11.         ]  
  12.     };  
  13. </script>  

最后,约定俗成地,一般define类似util的singleton模块,js文件的名字第一个字母小写;而类似RedTextDialog的类模块,第一个字母大写。

posted @ 2014-09-01 16:48 Eric_jiang 阅读(309) | 评论 (0)编辑 收藏

spring的 配置文件在启动时,加载的是web-info目录下的applicationContext.xml,
运行时使用的是web-info/classes目录下的applicationContext.xml。

配置web.xml使这2个路径一致:

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
 </context-param>

多个配置文件的加载
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:conf/spring/applicationContext_core*.xml,
            classpath*:conf/spring/applicationContext_dict*.xml,
            classpath*:conf/spring/applicationContext_hibernate.xml,
            classpath*:conf/spring/applicationContext_staff*.xml,
            classpath*:conf/spring/applicationContext_security.xml
            classpath*:conf/spring/applicationContext_modules*.xml
            classpath*:conf/spring/applicationContext_cti*.xml
            classpath*:conf/spring/applicationContext_apm*.xml
        </param-value>
    </context-param>

contextConfigLocation 参数定义了要装入的 Spring 配置文件。

posted @ 2014-08-15 10:11 Eric_jiang 阅读(245) | 评论 (1)编辑 收藏

由于是使用spring mvc来做项目,因此脱离了HttpServletRequest作为参数,不能够直接使用request,要想使用request可以使用下面的方法:

在web点xml中配置一个监听

<listener>         <listener-class>             org.springframework.web.context.request.RequestContextListener         </listener-class> </listener>
之后就可以在程序使用了

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
posted @ 2014-08-14 15:54 Eric_jiang 阅读(356) | 评论 (0)编辑 收藏

 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类注册为bean

注意:如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。另外<context:annotation-config/>还提供了两个子标签

1.        <context:include-filter>

2.       <context:exclude-filter>

在说明这两个子标签前,先说一下<context:component-scan>有一个use-default-filters属性,改属性默认为true,这就意味着会扫描指定包下的全部的标有@Component的类,并注册成bean.也就是@Component的子注解@Service,@Reposity。所以如果仅仅是在配置文件中这么写

<context:component-scan base-package="tv.huan.weisp.web"/>

 Use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。

 

 可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签<context:incluce-filter>就起到了勇武之地。如下所示

<context:component-scan base-package="tv.huan.weisp.web .controller">  

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   

</context:component-scan>  

这样就会只扫描base-package指定下的有@Controller下的java类,并注册成bean

但是因为use-dafault-filter在上面并没有指定,默认就为true,所以当把上面的配置改成如下所示的时候,就会产生与你期望相悖的结果(注意base-package包值得变化)

<context:component-scan base-package="tv.huan.weisp.web ">  

<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>   

</context:component-scan>  

此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类

此时指定的include-filter没有起到作用,只要把use-default-filter设置成false就可以了。这样就可以避免在base-packeage配置多个包名这种不是很优雅的方法来解决这个问题了。

另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定<context:exclude-filter>来进行过滤,说明此包不需要被扫描。综合以上说明

Use-dafault-filters=”false”的情况下:<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描

posted @ 2014-08-13 11:22 Eric_jiang 阅读(194) | 评论 (0)编辑 收藏

     摘要: 在安装SharePoint 2013 服务器之前,请先了解硬件和软件要求http://technet.microsoft.com/library/cc262485(office.15)?ocid=fwlink#section4Microsoft SharePoint 产品准备工具会为具有内置数据库的单台服务器安装以下必备软件:Web 服务器 (IIS) 角色应用程序服务器角色Microsoft ....  阅读全文
posted @ 2014-08-11 16:15 Eric_jiang 阅读(441) | 评论 (1)编辑 收藏

var test= { $ : function(id){ return document.getElementById(id); }, addEvent : function(obj,eventType,func){ if(obj.attachEvent){obj.attachEvent("on" + eventType,func);}else{obj.addEventListener(eventType,func,false)}}, delEvent : function(obj,eventType,func){ if(obj.detachEvent){obj.detachEvent("on" + eventType,func)}else{obj.removeEventListener(eventType,func,false)} } };
posted @ 2014-08-05 15:52 Eric_jiang 阅读(253) | 评论 (0)编辑 收藏

仅列出标题
共57页: First 上一页 7 8 9 10 11 12 13 14 15 下一页 Last