移动端开发——javascript

  javascript(简称js)语言在移动前端应用很广。可以说必不可少,许多效果都是和js相关的。包括现在移动端的一些框架。jqmobi、jqtouch、sencha touch、jquerymobile等等。这些都是基于js而进行编写的。这篇暂时不讨论这些框架。以后会慢慢介绍其中的一两个框架的具体使用方法。这篇主要讨论一下部分常用的js事件在移动端的使用。举几个例子:

 

1、隐藏地址导航栏:

<script type="text/javascript">

// 该函数由Simon Willison编写,它只有一个参数,该参数表示被调用的函数名(在页面加载完毕时执行的函数的名字)     

  function addLoadEvent(func) {var oldOnload = window.onload;if (typeof window.onload != 'function') {window.onload = func;}else {window.onload = function() {oldOnload();func();}}}
// 添加Load事件处理
    addLoadEvent(hideMenu);
    function hideMenu() {
        setTimeout("window.scrollTo(0, 0)", 1);
    }

 

以上代码是针对IOS系统的移动端收缩地址导航栏作用的(部分安卓机也可以)。核心代码其实就是一句:

setTimeout("window.scrollTo(0, 0)", 1);

利用定时器,将窗口移动到内容端的最上端。从而隐掉地址导航栏。

2、判断手机横竖屏状态:

<script type="text/javascript">

   function hengshuping(){  

      if(window.orientation==180||window.orientation==0){

        alert("竖屏状态!")       

   } if(window.orientation==90||window.orientation==-90){

        alert("横屏状态!")             }

  }

 window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", hengshuping, false); </script>

移动端的浏览器一般都支持window.orientation这个参数,通过这个参数可以判断出手机是处在横屏还是竖屏状态。从而根据实际需求而执行相应的程序。通过添加监听事件onorientationchange,进行执行就可以了。

3、判断是否是从主屏幕图标进入的网站。

<script type="text/javascript">
if ('standalone' in navigator && !navigator.standalone && (/iphone|ipod|ipad/gi).test(navigator.platform) && (/Safari/i).test(navigator.appVersion) && window.orientation==90||window.orientation==-90) {document.write('<link rel="stylesheet" href="css/add2home.css">');document.write('<script type="application\/javascript" src="js/add2home.js" charset="utf-8"><\/s' + 'cript>');}
</script>

通过判断navigator.standalone来确定是否是从主屏幕图标来进入网站的。这个主要是应用在webapp端还是web端进入网站的。从而进行相应的操作。本例是navigator.standalone等于false即是从浏览器(web端)进入的网站的。那么在document文档中写入两段代码。

4、取消浏览器默认行为:

 var preventDefaultScroll = function(event) {         

     event.preventDefault();         

     window.scroll(0,0);         

     return false;     

  };    

  document.addEventListener('touchmove', preventDefaultScroll, false);

 

取消浏览器默认行为,主要是为了控制一些手势事件。让它们按照具体的需求来进行相应的操作。核心代码是

event.preventDefault(); 当手指滑动(touchmove)时进行触发。

5.手机加速度事件

<script type="text/javascript">var page=1; var xx=0; var jishu=0; function deviceMotionHandler(eventData) { var acceleration = eventData.accelerationIncludingGravity; var zhuanhouX=Math.round(acceleration.x); if(xx-zhuanhouX>3||xx-zhuanhouX<-3){ xx=zhuanhouX; jishu++; } if(jishu>10){ var imgshu=$("#yidongDiv").find("img").length; var yidongJuli=$("#rongqi").width(); if(!$("#yidongDiv").is(":animated")){ if(page==imgshu){ $("#yidongDiv").animate({left:'0px'},500) page=1; $("#changwenzi").attr("src","images/wenzi1.png") } else{ $("#yidongDiv").animate({left:'-='+yidongJuli},500) $("#changwenzi").attr("src","images/wenzi"+(page+1)+".png") page++; } } jishu=0; xx=0; }; } window.addEventListener('devicemotion', deviceMotionHandler, false); </script>

 

这个例子中,是通过获取手机加速度,来进行一个动画的实例。在IOS5以上版本已经可以支持devicemotion事件。android4.0也开始支持这个事件。eventData.accelerationIncludingGravity这个属性获取到的是一组数值

它包括X\Y\Z轴的一个数组。通过对var zhuanhouX=Math.round(acceleration.x);X值的正负进行判断手机是否处于水平左右摇晃状态,从而引发动画。

<!DOCTYPE html>
<html>
<meta charset="utf-8"/>
<meta name="viewport" content="width=480" />
<head>
<style>
#stage{width:480px;height:360px;overflow:hidden;background-color: black;
}
#bg {position:relative;width:480px;height:360px;overflow:hidden;background-color: red;
}#phone {position:absolute;left:0px;top:0px;
}
</style>
<title>360°旋转</title>
</head>
<body style="overflow:hidden;padding:0; margin:0;"><div id="stage"><div id="bg"><img id="phone" src="images/360pic1.jpg" /></div></div><span id="toleft">往左转</span><span id="toright">往右转</span><script type="text/javascript">var c_i = 1;var c1=new Array();//创建数组,i的数量是图片的总数;进行for循环。for(var i=1;i<=72;i++){c1[i]=new Image();c1[i].src="images/360pic"+i+".jpg";}//定义要360度旋转的对象var main_swipe = document.getElementByIdx_x("phone");//创建滑动的基本距离和滑动方法属性。var defaults = {threshold: {x: 10,y: 30},swipeLeft: function() {showPicLeft();},swipeRight: function() {showPicRight();},};//定义初始坐标var originalCoord = { x: 0, y: 0 };var shiftCoord = { x: 0, y: 0 };var finalCoord = { x: 0, y: 0 };main_swipe.addEventListener("touchstart",function(event) {//定义滑动初始时的坐标originalCoord.x = event.targetTouches[0].pageX;originalCoord.y = event.targetTouches[0].pageY;shiftCoord.x = event.targetTouches[0].pageX;shiftCoord.y = event.targetTouches[0].pageY;finalCoord.x = originalCoord.x;finalCoord.y = originalCoord.y;}, false);main_swipe.addEventListener("touchmove",function(event) {//定义滑动中的坐标event.preventDefault();finalCoord.x = event.targetTouches[0].pageX;finalCoord.y = event.targetTouches[0].pageY;//当横向滑动距离大于5时,则判断为有效滑动并执行向左滑动的方法。反之则向向右滑动。if(finalCoord.x - shiftCoord.x > 5){window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeLeft();shiftCoord.x = finalCoord.x;}else if(finalCoord.x - shiftCoord.x < -5){window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeRight();shiftCoord.x = finalCoord.x;}}, false);main_swipe.addEventListener("touchend",function(event) {var changeY = originalCoord.y - finalCoord.y;//滑动结束时,进行坐标判断。并执行向左或是向右的方法if(changeY < defaults.threshold.y && changeY > (defaults.threshold.y*-1)) {changeX = originalCoord.x - finalCoord.x;if(changeX > defaults.threshold.x) {window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeRight();}if(changeX < (defaults.threshold.x*-1)) {window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeLeft();}}}, false);//向左滑动方法var showPicLeft = function(){c_i--;if(c_i < 0){c_i = 72;};document.getElementByIdx_x("phone").src = c1[c_i].src;}//向右滑动方法var showPicRight = function(){c_i++;if(c_i > 72){c_i = 1;};document.getElementByIdx_x("phone").src = c1[c_i].src;}var zidongleft;var zidongright;var panduanleft=false;var panduanright=false;//添加向左自动滑动功能document.getElementByIdx_x("toleft").addEventListener("touchstart",function(event){window.clearInterval(zidongright);if(panduanleft==false){zidongleft=setInterval(function(){defaults.swipeLeft()},50);}panduanleft=true;panduanright=false;},false);//添加向右自动滑动功能 document.getElementByIdx_x("toright").addEventListener("touchstart",function(event){window.clearInterval(zidongleft);if(panduanright==false){zidongright=setInterval(function(){defaults.swipeRight()},50);}panduanright=true;panduanleft=false;},false);</script>
</body>
</html>//代码中,定义了一个元素main_swipe,这个元素就是要进行手势操作的对象。main_swipe.addEventListener("touchstart",function(event) {//定义滑动初始时的坐标originalCoord.x = event.targetTouches[0].pageX;originalCoord.y = event.targetTouches[0].pageY;shiftCoord.x = event.targetTouches[0].pageX;shiftCoord.y = event.targetTouches[0].pageY;finalCoord.x = originalCoord.x;finalCoord.y = originalCoord.y;}, false);
//我们为这个对象添加监听事件,touchstart就是表示当手指刚放到屏幕上就触发,通过event对象我们可以获取当前触摸点的坐标。
//即event.targetTouches[0].pageX; event.targetTouches[0].pageY;
//其中event.targetTouches是一个包含触摸数据的数组。其默认的数组第一项就是当前的坐标集合。
//通过event.targetTouches[0].pageX; event.targetTouches[0].pageY;
//这样,我们就可以获取到当前触摸点的X和Y坐标。//接下来我们为了继续获取该元素的触摸移动中的坐标就要添加touchmove的事件。
main_swipe.addEventListener("touchmove",function(event) {//定义滑动中的坐标event.preventDefault();finalCoord.x = event.targetTouches[0].pageX;finalCoord.y = event.targetTouches[0].pageY;//当横向滑动距离大于5时,则判断为有效滑动并执行向左滑动的方法。反之则向向右滑动。if(finalCoord.x - shiftCoord.x > 5){window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeLeft();shiftCoord.x = finalCoord.x;}else if(finalCoord.x - shiftCoord.x < -5){window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeRight();shiftCoord.x = finalCoord.x;}}, false);

注意,在获取触摸移动中的坐标的时候,一定要先把浏览器的默认行为禁止 event.preventDefault();

触摸移动中的获取的坐标方法同触摸开始的方法是一样的。这里就不在继续阐述。

通过条件判断,当touchmove时的X坐标大于touchstart时的X坐标,则证明用户向右滑动,反之则向左滑动。

通过这个判断来执行defaults.swipeRight();或是defaults.swipeLeft();。从而实现360°旋转的功能。

 

当手指离开屏幕时,即touchend。同样要获取离开的坐标,以便为下一次touchstart来进行坐标定义。

main_swipe.addEventListener("touchend",function(event) {var changeY = originalCoord.y - finalCoord.y;//滑动结束时,进行坐标判断。并执行向左或是向右的方法if(changeY < defaults.threshold.y && changeY > (defaults.threshold.y*-1)) {changeX = originalCoord.x - finalCoord.x;if(changeX > defaults.threshold.x) {window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeRight();}if(changeX < (defaults.threshold.x*-1)) {window.clearInterval(zidongright);window.clearInterval(zidongleft);panduanleft=false;panduanright=false;defaults.swipeLeft();}}}, false);

以上的效果,就是一个典型的touch手势事件的简单应用。手势应用在移动前端应用范围很广。通过实际项目操作来体会其中的用途。

 原文地址:http://blog.sina.com.cn/s/blog_3f1fc8950101g8rh.html

转载于:https://www.cnblogs.com/mopagunda/p/4642704.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 源码编译安装过程-以安装XZ解压为例

一、描述 Linux安装软件一般有两种安装方式&#xff1a;安装包安装和源码安装。 1、安装包安装。安装包安装比较简单&#xff0c;例如采用apt-get install 软件名 命令&#xff0c;安装 deb 包的 Linux 操作系统&#xff08;例如Raspberry Debian、Ubuntu等&#xff09;中&a…

服装企业信息化计算机化的趋势,服装企业信息化建设的研究.pdf

服装企业信息化建设研究摘要随着信息经济时代的来临和经济全球化的进一步加快&#xff0c;信息化的浪潮正席卷全球&#xff0c;信息化革命正在打破并重组现存的国际经济秩序和结构&#xff0c;并促使其由物质型向信息型经济转变。随着经济的全球化趋势&#xff0c;如果没有信息…

symantec backup exec 2010 基本错误总结

1 由于介质服务器死机导致的作业失败2 由于网络阻塞或中断导致的作业失败3 由于设备出错、空间不足或损坏导致的作业失败4 由于相互关联的靠前作业失败牵涉靠后复制作业出错导致的作业失败5 由于作业时间安排不当导致的作业失败&#xff08;涉及到磁带的单进程写入&#xff09;…

剑指offer:替换空格

##题目&#xff1a;请实现一个函数&#xff0c;把字符串中的每个空格替换成%20。例如输入“We are happy."&#xff0c;则输出”We%20are%20happy."。最容易想到的是&#xff0c;从头到尾扫描&#xff0c;每次碰到空格就替换。但是时间复杂度为o(n2)。时间复杂度为o(…

PS1参数详解

From: http://www.safe5.com/patch/xitongloudong/linux/20120305/27116.html bash Shell Prompt Characters Character \a The bell character \d The date in the format ‘‘Day Month Date’’ \e The ASCII escape character \h The local hostname \H The fully qual…

华为IoT平台NB编解码插件开发详细教程【上篇】

目录 0、前言 一、环境搭建 1.1 安装JDK 1.2 安装eclipse 1.3 安装Maven 二、Profile说明 三、插件编写 3.1 源文件说明 3.2 修改文件路径&#xff08;包含&#xff09; 3.3 修改pom.xml 3.4 导入工程 3.5 代码实现 3.6 生成jar包 0、前言 本教程分为上、下篇&am…

用MySQL实现微博关注关系的方案分析

关注关系产生的四种关系状态 关注粉丝双向关注(互粉)无关系用词follower表示粉丝 -- 追随者 用词following表示关注 -- 追随 设计的结构必须能满足以下功能&#xff1a; 查询关注列表查询粉丝列表查询双向关注列表判断两个用户的关系查询带关系状态的任一列表第一种方案 用一行…

带你封装一个上传图片组件(ant design+react)

目录 需求实现 实现效果 代码封装 UploadImage组件 备注 BaseUploadImage组件 index.less 样式文件 父组件引用 需求实现 1可以支持上传最多九张图片 2图片支持预览 替换 删除 3支持自定义上传文件大小 格式 未上传提示 实现效果 代码封装 UploadImage组件 * Descri…

计算机面试的时候写过的代码,程序员悲催瞬间:来之不易的美团面试,我尽然挂了(还原真实场景)...

一面1、自我介绍答&#xff1a;自我介绍是面试中唯一的自己主动介绍自己的环节&#xff0c;一定要好好把握好&#xff0c;你数据结构学的号可以手撕一个红黑树你就说我数据结构掌握地很好&#xff0c;反正就是要把自己的优势凸显出来&#xff0c;比如自己对于java的知识较熟悉&…

C语言中return和exit的区别

1&#xff0c;exit用于在程序运行的过程中随时结束程序&#xff0c;exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数&#xff0c;然后会做一些自身的清理工作&#xff0c;同时刷新所有输出流、关闭所有打开的…

华为IoT平台NB编解码插件开发详细教程【下篇】

上篇文章介绍了编解码开发汇总的环境搭建、Profile说明和插件编写&#xff0c;本篇教程就插件打包、插件质检和插件签名详解。 目录 四、插件打包 五、插件质检 六、插件签名 七、附件 四、插件打包 1、新建package文件&#xff0c;包含一个“preload”子文件夹&#xff…

【PostGIS】PostgreSQL15+对应PostGIS安装教程及空间数据可视化

一、PostgreSQL15与对应PostGIS安装 PostgreSQL15安装&#xff1a;下载地址PostGIS安装&#xff1a;下载地址&#xff08;选择倒数第二个&#xff09; 1、PostgreSQL安装 下载安装包&#xff1b;开始安装&#xff0c;这里使用默认安装&#xff0c;一直next直到安装完成&…

系统没有远程桌面,如何安装远程桌面

From: http://blog.sina.com.cn/s/blog_53657b280100avdb.html 系统没有远程桌面,如何安装远程桌面 可能是远程桌面对应的组件文件被删除&#xff0c;或是相关服务被停止而造成的&#xff0c;先单击“开始/运行”&#xff0c;输入&#xff1a;regsvr 32remotepg.dll并回车注…

su su - sudo

1.su只是切换了root身份&#xff0c;但是shell环境仍然是普通用户的shell&#xff0c;su切成root后&#xff0c;pwd工作目录仍然是普通用户的工作目录 2.su - 用户和shell环境一起切换到了root身份了。以root身份登录&#xff0c;执行实际用户login以后的所有操作&#xff08;包…

React实现图片自适应

数据格式 [1xxxx,2xxxx,3xxxx,4xxxx,5xxxx,6xxxx,7xxxx,8,xxxx,9xxxx] 运行效果 代码部分 <divgutter{24}style{{width: 100%,display: flex,justifyContent: space-between,flexWrap: wrap ,}}>{item.imgList &&item.imgList.map((itemList, index) > (<…

上交大计算机复试机师难不难,本科复旦,考研上海交大复试第一,我感觉难度并不大...

我本人去年考研上海交大凯原法学院法学硕士&#xff0c;初试370分&#xff0c;排名第四。复试182分&#xff0c;排名第一。本科复旦&#xff0c;有过转专业经历因此法学院课程只学了3年&#xff0c;比较匆忙&#xff0c;基础不算好。2020年国家法律职业资格考试和考研同时备考&…

C与C++中的extern与static、extern C与__cplusplus的作用

一、概述 以C语言编写的源文件后缀名为.c&#xff0c;以C语言编写的源文件后缀名为.cpp&#xff0c;C支持函数的重载&#xff0c;C和C编译器对函数的编译处理是不完全相同。C编译后的函数一般是以函数名和形参类型来命名&#xff0c;C则是直接利用函数名进行命名。 假设有函数…

共谋节点两个单列表

题目&#xff1a;输入两个单链表。找出公共结点。 思路&#xff1a;若两个单链表有公共结点。其形状必然为“Y”型&#xff0c;也就是说公共结点后的全部结点都是同样的。我们首先获得两个链表的长度。求得长度之差为n&#xff0c;再定义两个指针分别指向两个链表首部&#xff…

bzero, memset ,setmem 区别

From: http://blog.csdn.net/agathe/article/details/6066157 bzero 原型&#xff1a; extern void bzero(void *s, int n);用法&#xff1a; #include <string.h>功能&#xff1a;置字节字符串s的前n个字节为零。 说明&#xff1a;bzero无返回值。 举例&am…