React - ES6 - Ajax获取接口数据渲染到UI组件【完整示例】

本站PHP后端接口: http://code.liuxinxiu.com/php/Interface/Jsoncallback.php?GUID=1&&Jsoncallback=1
本实例用 ES5 + JSX 语法编写[对应实例] : http://liuxinxiu.com/React_Ajax_setState_Render_UI_ES5/
- /****** ES6输入文件[调用模块依赖] ******/
- import React, { Component, PropTypes } from 'react'
- import $ from 'n-zepto'
- /****** ES5输入文件[调用模块依赖] ******/
- //var React=require('react');
- //var $=require('n-zepto');
- //import * as from './commentList.js'
- //import list from './commentList.js';
- /****** 本地模拟Array数据******/
- var movies = [
- {
- id: 1,
- name: '速度与激情001',
- date: 2011
- },
- {
- id: 2,
- name: '速度与激情002',
- date: 2009
- }
- ];
- /****** 外部子组件map数组当做模板之用 ES5 + JSX 语法编写 ******/
- var MoviesList = React.createClass({
- render: function () {
- // this.props 用于从组件外部传入数据
- var _movies = this.props._movies;
- return (
- <li className="datali">
- {_movies.id}-{_movies.name}
- </li>
- )
- }
- });
- /****** 外部子组件map数组当做模板之用 ES6 + JSX 语法编写 ******/
- let CommentList=class CommentList extends Component {
- constructor(props) {
- super(props); //ES6调用父类构造函数super不能少!
- this.state = {
- wording: '你好呀, '
- };
- }
- /****** Ajax子组件中[主体模板] ******/
- render(){
- return <ul>{this.props.comments.map(this.renderComment)}</ul>;
- }
- /****** Ajax子组件中[嵌套模板] ******/
- renderComment({plat,type,name,guid,cre_time,lottery}){
- return (
- <li>{plat}--{type}--{name}--{guid}--{cre_time}--{lottery}</li>
- )
- }
- }
- /****** 使用ES6 + JSX 语法编写 class xx extends React.Component{} 创建一个组件 ******/
- class CommentListContainer extends Component {
- /****** [ES6-constructor||ES5-getInitialState] ******/
- constructor(){
- super();
- this.state = {
- loading: true,
- title: '我喜欢的电影',
- movies: [],
- comments: []
- }
- }
- componentDidMount(){
- $.ajax({
- type: 'GET',
- url: 'http://code.liuxinxiu.com/php/Interface/Jsoncallback.php',
- data: {GUID:'1'},
- dataType:'jsonp', //告诉Ajax调用$jsonp
- jsonp: "Jsoncallback", //zpeto-1.2支持自定义回调名
- success: function(data){
- var yy=JSON.stringify(data);
- var tlist=JSON.stringify(data.enttityList);
- //console.log(tlist);
- //console.log(this.state.title+'22');
- this.setState({
- comments:data.enttityList,
- lottery:data.enttityList[0].lottery
- });
- var commentsStr=JSON.stringify(this.state.comments);
- console.log("\n--->>commentsStr:\n"+commentsStr); //查看获取的数据
- //console.log(this.state.comments+'33')
- }.bind(this),
- error: function(xhr, type){
- alert(xhr+type+'Ajax error!');
- }
- });
- //console.log(this.state.comments+'++++--!!'); //ajax底下拿不到结果因为提前于异步
- }
- render(){
- return <CommentList comments={this.state.comments}/>;
- }
- }
- /****** ES5输出给router ******/
- //module.exports=DemoComponent;
- /****** ES6输出给router ******/
- export default CommentListContainer;
React - ES5 - Ajax获取接口数据渲染到UI组件【完整示例】

本站PHP后端接口: http://code.liuxinxiu.com/php/Interface/Jsoncallback.php?GUID=1&&Jsoncallback=1
本实例用 ES6 + JSX 语法编写[对应实例] : http://liuxinxiu.com/React_Ajax_setState_Render_UI_ES6/
- //import React, { Component, PropTypes } from 'react'
- //import $ from 'n-zepto'
- var React=require('react'); //Es-5
- var $=require('n-zepto'); //Es-5
- //import * as from './commentList.js'
- //import list from './commentList.js';
- /****** 外部子组件map数组当做模板之用 ******/
- var MoviesList = React.createClass({
- render: function () {
- // this.props 用于从组件外部传入数据
- ar _movies = this.props._movies;
- return (
- <li className="datali">
- {_movies.id}-{_movies.name}
- </li>
- )
- }
- });
- /****** 本地模拟Array数据******/
- var movies = [
- {
- id: 1,
- name: '速度与激情001',
- date: 2011
- },
- {
- id: 2,
- name: '速度与激情002',
- date: 2009
- }
- ];
- /****** 使用Es5语法 React.createClass 创建一个组件 ******/
- var DemoComponent = React.createClass({
- /****** 使用 getInitialState 的返回值作为数据的默认值 ******/
- getInitialState: function () {
- // this.state 用于存储数据comments被Ajax赋值要先定义个名称
- return {
- loading: true,
- title: '我喜欢的电影',
- movies: [],
- comments: []
- }
- },
- componentDidMount: function() {
- $.ajax({
- type: 'GET',
- url: 'http://code.liuxinxiu.com/php/Interface/Jsoncallback.php',
- data: {GUID:'1'},
- dataType:'jsonp', //告诉Ajax调用$jsonp
- jsonp: "Jsoncallback", //zpeto-1.2支持自定义回调名
- success: function(data){
- var yy=JSON.stringify(data);
- var tlist=JSON.stringify(data.enttityList);
- console.log(tlist);
- //console.log(this.state.title+'22')
- this.setState({
- comments:data.enttityList,
- lottery:data.enttityList[0].lottery
- });
- var slist=JSON.stringify(this.state.comments);
- console.log(slist)
- //console.log(this.state.comments+'33')
- }.bind(this),
- error: function(xhr, type){
- alert(xhr+type+'Ajax error!'); //error
- }
- });
- //console.log(this.state.comments+'++++--!!'); //ajax底下拿不到结果因为提前于异步
- },
- render: function () {
- // this.state 用于存储当前的数据
- var comments = this.state.comments;
- //var dataHtml=movies.map(<p>{name}</p>);// 注意这里 bind(this) 修正了上下文
- /****** Movies子模板 ******/
- function renderMovies({id,name}){
- return <li>{id}-{name}</li>;
- }
- /****** Movies大模板[内嵌子模板] ******/
- //var dataHtml = movies.map(renderMovies);
- /****** Movies大模板[外调子模板] ******/
- var dataHtml = movies.map(function(movies){
- return (
- <MoviesList _movies={movies}/>
- )
- }.bind(this));// 注意这里 bind(this) 修正了上下文
- //console.log('movies:'+movies+'--'+'dataHtml:'+dataHtml);
- /****** Ajax子模板******/
- function renderComment({plat,type,name,guid,cre_time,lottery}){
- return <li>{plat}--{type}--{name}--{guid}--{cre_time}--{lottery}</li>;
- }
- /****** Ajax大模板 ******/
- var AjaxHtml = this.state.comments.map(renderComment);
- //var AjaxHtml='11'
- console.log('comments:'+comments+'--'+'AjaxHtml:'+AjaxHtml);
- return (
- <ul>{AjaxHtml}</ul>
- )
- }
- });
- /****** ES5输出给router ******/
- module.exports=DemoComponent;
- /****** ES6输出给router ******/
- //export default DemoComponent;
使用ES5||ES6 -- 输入文件示例 [调用所依赖的模块]:
- /****** ES5调用依赖模块[require]被打包会自动生成关联代码 ******/
- var MyComponent = require('./components/movie-list');
- /****** ES6调用依赖模块 ******/
- import MyComponent from './components/movie-list';
使用ES5||ES6 -- 输出文件示例[输出给被依赖模块]:
- /****** ES5输出给router ******/
- module.exports=DemoComponent;
- /****** ES6输出给router ******/
- //export default DemoComponent;
使用ES5 -- 创建一个组件:
- /****** 使用Es5语法 React.createClass 创建一个组件 ******/
- var DemoComponent = React.createClass({
- /****** 使用 getInitialState 的返回值作为数据的默认值(!return) ******/
- getInitialState: function () {
- return {
- loading: true,
- title: '我喜欢的电影',
- // 注意这里将 外部传入的数据赋值给了 this.state
- movies: []
- }
- },
- /****** 输出HTML模板,此处可以调用子组件******/
- render: function () {
- return (
- <div className="component-hello">
- {this.state.title}
- </div>
- )
- }
- });
使用ES5 -- map遍历当前Array并调用渲染数据的[外部]子组件:
- /****** 使用Es5语法 遍历数组并调用外部子组件 ******/
- var MoviesList=React.createClass({...});
- var dataHtml = movies.map(function(movies){
- return (
- <MoviesList _movies={movies}/>
- )
- }.bind(this));// 注意这里 bind(this) 修正了上下文
- return (
- <ul>{dataHtml}</ul>
- )
- /****** 外部子组件map数组当做模板之用 ******/
- var MoviesList = React.createClass({
- render: function () {
- // this.props 用于从组件外部传入数据
- var _movies = this.props._movies;
- return (
- <li className="datali">
- {_movies.id}-{_movies.name}
- </li>
- )
- }
- });
使用ES5 -- map遍历当前Array并调用渲染数据的[内部]子组件:
- /****** 使用Es5语法 遍历数组并调用内部子组件 ******/
- function renderMovies({id,name}){
- return <li>{id}-{name}</li>;
- }
- var dataHtml = movies.map(renderMovies);
- return (
- <ul>{dataHtml}</ul>
- )
Ajax获取接口数据并设置到state :
- componentDidMount(){
- $.ajax({
- type: 'GET',
- url: 'http://code.liuxinxiu.com/php/Interface/Jsoncallback.php', //JSONP接口
- data: {GUID:'1'},
- dataType:'jsonp', //告诉Ajax调用$jsonp
- jsonp: "Jsoncallback", //zpeto-1.2支持自定义回调名
- success: function(data){
- var yy=JSON.stringify(data);
- var tlist=JSON.stringify(data.enttityList);
- //console.log(tlist);
- //console.log(this.state.title+'22');
- this.setState({
- comments:data.enttityList,
- lottery:data.enttityList[0].lottery
- });
- var commentsStr=JSON.stringify(this.state.comments);
- console.log("\n--->>commentsStr:\n"+commentsStr); //查看获取的数据
- //console.log(this.state.comments+'33')
- }.bind(this),
- error: function(xhr, type){
- alert(xhr+type+'Ajax error!');
- }
- });
- //console.log(this.state.comments+'++++--!!'); //ajax底下拿不到结果因为提前于异步
- }
react 的事件调用分类
- 触摸事件:onTouchCancel\onTouchEnd\onTouchMove\onTouchStart
- (只会在移动设备上接受)
- 键盘事件:onKeyDown\onKeyPress\onKeyUp
- 剪切事件:onCopy\onCut\onPaste
- 表单事件:onChange\onInput\onSubmit
- 焦点事件:onFocus\onBlur
- UI元素:onScroll(移动设备是手指滚动和PC的鼠标滑动)
- 滚动事件:onWheel(鼠标滚轮)
- 鼠标类型:onClick\onContextMenu(右键)\onDoubleClick\onMouseDown\onMouseEnter\
- onMouseLeave\onMouseMove\onMouseOut\onMouseOver\onMouseUp
- onDrag\onDrop\onDragEnd\onDragEnter\onDragExit\onDragLeave\onDragOver\onDragStart
react 嵌套路由相关

/src/js/app.js
- import React, { PropTypes, Component } from 'react';
- import {render} from 'react-dom'; //render((_component),Dom);
- //import ReactDOM from 'react-dom'; //ReactDOM.render((_component),Dom);
- import getRouter from './getRouter';
- import { Router, Route, Link, IndexRoute, hashHistory } from 'react-router';
- /* using an ES6 transpiler, like babel */
- //import { createHistory } from 'history/createBrowserHistory'
- //import createBrowserHistory from 'history/createBrowserHistory';
- /* Import Component */
- import Hello from '../components/hello/hello.jsx'
- import Other from '../components/other/other.jsx'
- /* ensure test */
- require.ensure(['./test'],function(require){
- var aModule = require('./test');
- console.log("xxxx");
- },'test');
- /* create history for router */
- //const history = createHistory()
- /* Router Config */
- render((
- <Router history={hashHistory}>
- <Route path="/" component={getRouter}>
- <IndexRoute component={Hello} />
- <Route path="other" component={Other} />
- </Route>
- </Router>
- ), document.getElementById('app'));
/src/js/getRouter.js
- import React, { PropTypes, Component } from 'react';
- export default React.createClass ({
- render() {
- return <div>
- {this.props.children}
- </div>
- }
- });
/src/components/hello/hello.jsx
- import React, { PropTypes, Component } from 'react';
- /* 导入组件样式hello.css */
- import styles from './css/hello.css';
- //require("./css/hello.css");
- class Hello extends React.Component {
- render(){
- return (
- <div className="hello">
- <p>Hello World!!!!!!!...</p>
- <p>cll不错!</p>
- </div>
- );
- };
- };
- export default Hello;
/src/components/other/other.jsx
- class Other extends React.Component {
- render() {
- return (
- <div>
- <p>this is other component!!!</p>
- <p>111111111cll不错!</p>
- </div>
- )
- }
- }
- export default Other;
关于setTimeout传参的思考

- function countdown(n){
- //var i=10;if(!n)n=i;
- function _show(o){
- return function(){
- countdown(o);
- }
- }
- if(n>0){
- console.log(n);n--;
- setTimeout(_show(n),1000);
- }
- };countdown(10);
JS把数组类型转换为JSON对象或JSON字符串

- var a = ['a','b','c'];
- var json = {};
- for(var i=0;i<a.length;i++)
- {
- json[i]=a[i];
- }
- var jsonStr=JSON.stringify(json);//结果:"{'1':'a','2':'b','3':'c'}"
- var jsonObj=JSON.parse(jsonStr); //结果:[object Object]
JS Array To Json 加强版:
1. 自然数自动递增并设置K值
2. 取偶数Length为Json数组的K值
- /******** 获取客户端请求的header整体头部信息 ********/
- this.rawHeaders=function(state){
- var json={};
- if(!state){
- for(var i=0;i<req.rawHeaders.length;i++){
- var s,s=i;
- if(i%2==0){
- s++;json[req.rawHeaders[i]]=req.rawHeaders[s];
- }
- }
- }
- if(state){
- for(var i=0;i<req.rawHeaders.length;i++){
- json[i]=req.rawHeaders[i];
- }
- }
- var jsonStr=JSON.stringify(json);//结果:"{'1':'a','2':'b','3':'c'}"
- var jsonObj=JSON.parse(jsonStr); //结果:[object Object]
- return jsonObj;
- };
ArtTemplate_List 实例

ArtTemplate_List 实例1
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>basic-demo</title>
- <script src="../dist/template.js"></script>
- </head>
- <body>
- <div id="content"></div>
- <script id="test" type="text/html">
- {{if isAdmin}}
- <h1>{{title}}</h1>
- <ul>
- {{each list as value i}}
- <li>索引 {{i + 1}} :{{value}}</li>
- {{/each}}
- </ul>
- {{/if}}
- </script>
- <script>
- var data = {
- title: '基本例子',
- isAdmin: true,
- list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
- };
- var html = template('test', data);
- document.getElementById('content').innerHTML = html;
- </script>
- </body>
- </html
ArtTemplate_List 实例2
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>compile-demo</title>
- <script src="../dist/template.js"></script>
- </head>
- <body>
- <h1>在javascript中存放模板</h1>
- <div id="content"></div>
- <script>
- var source = '<ul>'
- + '{{each list as value i}}'
- + '<li>索引 {{i + 1}} :{{value}}</li>'
- + '{{/each}}'
- + '</ul>';
- var render = template.compile(source);
- var html = render({
- list: ['摄影', '电影', '民谣', '旅行', '吉他']
- });
- document.getElementById('content').innerHTML = html;
- </script>
- </body>
- </html>
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>basic-demo</title>
- <script src="../dist/template.js"></script>
- </head>
- <body>
- <h1>在javascript中存放模板</h1>
- <div id="content"></div>
- <script>
- /***** 小模版 *****/
- var source=''
- +'<ul>'
- + '{{each list as value i}}'
- + '<li>索引 {{i+1}} :{{value}}</li>'
- + '{{/each}}'
- +'</ul>';
- /***** 定义变关联逻辑代码片段(小模版) *****/
- var connectJs=template.compile(source);
- /***** 最终的数据源等于==逻辑代码关联数据 *****/
- var htmlData=connectJs({
- list: ['摄影', '电影', '民谣', '旅行', '吉他']
- });
- /***** 把最终处理后的数据源插入到页面 *****/
- document.getElementById('content').innerHTML=htmlData;
- </script>
- </body>
- </html>
实例访问地址:http://code.liuxinxiu.com/jstpl/artTemplate/demo/best.html
include嵌入子模板:
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>include-demo</title>
- <script src="../dist/template.js"></script>
- </head>
- <body>
- <div id="content"></div>
- <script id="test" type="text/html">
- <h1>{{title}}</h1>
- {{include 'list'}}
- </script>
- <script id="list" type="text/html">
- <ul>
- {{each list as value i}}
- <li>索引 {{i + 1}} :{{value}}</li>
- {{/each}}
- </ul>
- </script>
- <script>
- var data = {
- title: '嵌入子模板',
- list: ['文艺', '博客', '摄影', '电影', '民谣', '旅行', '吉他']
- };
- var html = template('test', data);
- document.getElementById('content').innerHTML = html;
- </script>
- </body>
- </html>
理解部分(使用普通for循环加声明语法,进行数组遍历)1:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>AtrTemplate</title>
- </head>
- <body>
- <div id="content"></div>
- <script src="js/template-native.js"></script>
- <script id="test" type="text/html">
- <%for( i = 0; i < content.length; i++) {%>
- <h1><%=content[i].title%></h1>
- <p>条目内容 : <%=content[i].list%></p>
- <%}%>
- // 等同于普通的for循环,在普通的for循环上给每一行语法声明加上<% xx %>
- // 等同于普通的for循环,在普通的for循环上取值部分加上类似jsp的变量声明 <%= xx %>
- //for(i=0;i<content.length;i++){
- // <h1><%=content[i].title%></h1>
- // <p>条目内容 : <%=content[i].list%></p>
- //}
- </script>
- <script>
- /***** 自造数据,content为数组List便于测试循环 *****/
- var data={
- content:[
- {
- title: "artTemplate",
- list: "新一代 javascript 模板引擎",
- },
- {
- title: "特性",
- list: "性能卓越,执行速度快"
- }
- ]
- };
- /***** 用template映射数据到逻辑代码区域|也可以理解称给逻辑代码片段绑定数据源 *****/
- var html=template('test',data);
- /***** 选择页面Dom元素,插入处理后的数据 *****/
- document.getElementById("content").innerHTML=html;
- </script>
- </body>
- </html>
理解部分(使用普通for循环加声明语法,进行双层嵌套数组遍历)2:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>AtrTemplate -- 简介</title>
- </head>
- <body>
- <div id="content"></div>
- <script src="js/template-native.js"></script>
- <script id="listtemp">
- </script>
- <script id="test" type="text/html">
- //循环嵌套,循环数组里的数组
- <%for(i=0;i<content.length;i++){%>
- <h1><%=content[i].title%></h1>
- <ul>
- <%for(j=0;j<content[i].list.length;j++){%>
- <li><%=content[i].list[j]%></li>
- <%}%>
- </ul>
- <%}%>
- </script>
- <script>
- var data={
- content:[
- {
- title: "artTemplate",
- list:["新一代 javascript 模板引擎"]
- },
- {
- title: "特性",
- list: [
- "性能卓越,执行速度通常是 Mustache 与 tmpl 的 20 多倍",
- "支持运行时调试,可精确定位异常模板所在语句",
- " 对 NodeJS Express 友好支持",
- "安全,默认对输出进行转义、在沙箱中运行编译后的代码(Node版本可以安全执行用户上传的模板)",
- " 支持include语句",
- "可在浏览器端实现按路径加载模板",
- "支持预编译,可将模板转换成为非常精简的 js 文件",
- "模板语句简洁,无需前缀引用数据,有简洁版本与原生语法版本可选",
- "支持所有流行的浏览器"
- ]
- }
- ]
- };
- /***** 用template映射数据到逻辑代码区域|也可以理解称给逻辑代码片段绑定数据源 *****/
- var html=template('test',data);
- /***** 选择页面Dom元素,插入处理后的数据 *****/
- document.getElementById("content").innerHTML=html;
- </script>
- </body>
- </html>
- /***** 格式化日期 *****/
- function formatDate(_strTime,_format){
- var date=new Date(_strTime);
- var paddNum=function(num){
- num+="";
- return num.replace(/^(\d)$/,"0$1");
- }
- //指定格式字符
- var cfg={
- yyyy:date.getFullYear() //年:4位
- ,yy :date.getFullYear().toString().substring(2) //年:2位
- ,M :date.getMonth() + 1 //月:如果1位的时候不补0
- ,MM :paddNum(date.getMonth()+1) //月:如果1位的时候补0
- ,d :date.getDate() //日:如果1位的时候不补0
- ,dd :paddNum(date.getDate()) //日:如果1位的时候补0
- ,hh :date.getHours() //时
- ,mm :date.getMinutes() //分
- ,ss :date.getSeconds() //秒
- }
- _format||(_format="yyyy-MM-dd hh:mm:ss");
- return _format.replace(/([a-z])(\1)*/ig,function(m){return cfg[m];});
- }
- formatDate("Tue Jul 16 01:07:00 CST 2013","yyyy-MM-dd ");
JS FormData对象

通常我们提交(使用submit button)时,会把form中的所有表格元素的name与value组成一个queryString,提交到后台。这用jQuery的方法来说,就是serialize。但当我们使用Ajax提交时,这过程就要变成人工的了。因此,FormData对象的出现可以减少我们一些工作量。
想得到一个FormData对象:
var formdata = new FormData(); |
W3c草案提供了三种方案来获取或修改FormData。
方案1:创建一个空的FormData对象,然后再用append方法逐个添加键值对:
var formdata = new FormData(); |
formdata.append( "name" , "呵呵" ); |
formdata.append( "url" , "http://www.baidu.com/" ); |
方案2:取得form元素对象,将它作为参数传入FormData对象中!
var formobj = document.getElementById( "form" ); |
var formdata = new FormData(formobj); |
方案3:利用form元素对象的getFormData方法生成它!
var formobj = document.getElementById( "form" ); |
var formdata = formobj.getFormData() |
利用Formdata对象,我们可以使用原生js通过ajax实现异步上传图片,当然,现在已经有jquery的批量上传插件了,实现原理就是利用了Formdata。
TouchEvent测试

- <!-- HTML5 -->
- <!DOCTYPE html>
- <html>
- <head>
- <title>TouchEvent测试</title>
- <meta charset="utf-8">
- </head>
- <body>
- <h2>TouchEvent测试</h2>
- <br />
- <div id="version" style="border:2px solid black;background-color:yellow"></div>
- <br />
- <br />
- <br />
- <br />
- <br />
- <br />
- <div id="result" style="border:2px solid red; color:red;">未触发事件!</div>
- <div id="test" style="border:2px solid red">
- <ul>
- <li id="li1">测试条目1</li>
- <li id="li2">测试条目2</li>
- <li id="li3">测试条目3</li>
- <li id="li4">测试条目4</li>
- <li id="li5">测试条目5</li>
- <li id="li6">测试条目6</li>
- <li id="li7">测试条目7</li>
- <li id="li8">测试条目8</li>
- <li id="li9">测试条目9</li>
- <li id="li10">测试条目10</li>
- <li id="li11">测试条目11</li>
- <li id="li12">测试条目12</li>
- <li id="li13">测试条目13</li>
- <li id="li14">测试条目14</li>
- <li id="li15">测试条目15</li>
- <li id="li16">测试条目16</li>
- <li id="li17">测试条目17</li>
- <li id="li18">测试条目18</li>
- <li id="li19">测试条目19</li>
- <li id="li20">测试条目20</li>
- </ul>
- </div>
- <script type="text/javascript">
- //全局变量,触摸开始位置
- var startX = 0, startY = 0;
- //touchstart事件
- function touchSatrtFunc(evt) {
- try
- {
- //evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等
- var touch = evt.touches[0]; //获取第一个触点
- var x = Number(touch.pageX); //页面触点X坐标
- var y = Number(touch.pageY); //页面触点Y坐标
- //记录触点初始位置
- startX = x;
- startY = y;
- var text = 'TouchStart事件触发:(' + x + ', ' + y + ')';
- document.getElementById("result").innerHTML = text;
- }
- catch (e) {
- alert('touchSatrtFunc:' + e.message);
- }
- }
- //touchmove事件,这个事件无法获取坐标
- function touchMoveFunc(evt) {
- try
- {
- //evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等
- var touch = evt.touches[0]; //获取第一个触点
- var x = Number(touch.pageX); //页面触点X坐标
- var y = Number(touch.pageY); //页面触点Y坐标
- var text = 'TouchMove事件触发:(' + x + ', ' + y + ')';
- //判断滑动方向
- if (x - startX != 0) {
- text += '<br/>左右滑动';
- }
- if (y - startY != 0) {
- text += '<br/>上下滑动';
- }
- document.getElementById("result").innerHTML = text;
- }
- catch (e) {
- alert('touchMoveFunc:' + e.message);
- }
- }
- //touchend事件
- function touchEndFunc(evt) {
- try {
- //evt.preventDefault(); //阻止触摸时浏览器的缩放、滚动条滚动等
- var text = 'TouchEnd事件触发';
- document.getElementById("result").innerHTML = text;
- }
- catch (e) {
- alert('touchEndFunc:' + e.message);
- }
- }
- //绑定事件
- function bindEvent() {
- document.addEventListener('touchstart', touchSatrtFunc, false);
- document.addEventListener('touchmove', touchMoveFunc, false);
- document.addEventListener('touchend', touchEndFunc, false);
- }
- //判断是否支持触摸事件
- function isTouchDevice() {
- document.getElementById("version").innerHTML = navigator.appVersion;
- try {
- document.createEvent("TouchEvent");
- alert("支持TouchEvent事件!");
- bindEvent(); //绑定事件
- }
- catch (e) {
- alert("不支持TouchEvent事件!" + e.message);
- }
- }
- window.onload = isTouchDevice;
- </script>
- </body>
- </html>