去除选中标签后默认颜色
可能有用的方案
# 方案一,css
body{
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
# 方案二,js
document.onselectstart=new Function("return false");
# 方案三,css
*{outline:none;}
# 方案三
-webkit-appearance:none;
我一般用这个:
::-webkit-input-placeholder{color:#999;}
input[type="text"],input[type="password"]{-webkit-appearance:none;appearance:none;outline:none;-webkit-tap-highlight-color:rgba(0,0,0,0);border-radius:0;}
# 方案四
-webkit-tap-highlight-color:rgba(0,0,0,0);
-webkit-tap-highlight-color:rgba(255,255,255,255);
键盘事件
keydown()
# keydown事件会在键盘按下时触发.
keyup()
# keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件
keypress()
# keypress事件会在敲击按键时触发,我们可以理解为按下并抬起同一个按键
获取键盘上对应的ASCII码
$(document).keydown(function(event){
console.log(event.keyCode);
alert(event.keyCode);
});
常用键对应的编码
0键值48..9键值57
a键值97..z键值122
A键值65..Z键值90
+键值43;-键值45
.键值46;退格8;
tab键值9;Enter键值13
回车触发按钮事件
$("body").keydown(function(event) {
if (event.keyCode == 13) {
$('#submit').click();
//阻止默认事件
event.preventDefault();
// 阻止冒泡事件
//event.stopPropagation();
// 阻止默认和冒泡
//return false;
}
});
$('#submit').click(function(){
alert("test")
})
进度条自动填充
html
<div id="process_container">
<div id="timeline" ></div>
</div>
css
#process_container{
258px;
height: 2px;
position: absolute;
left: 56px;
top: 458px;
border: 1px solid #524C9C;
}
#timeline{
background: #D740D5;
float: left;
height: 100%;
text-align:center;
line-height:150%;
}
javascript
var playMusic = {
// 开始播放
startPlay: function(){
playMusic.showBar()
}
// 暂停播放
stopPlay: function(){
window.clearTimeout(this.SHOWBAR_TIME_OBJ);
}
SHOWBAR_TIME_OBJ:new Object(),
// 显示进度条
showBar: function(){
if(parseFloat($("#timeline").css("width")) < 258){
var tmpWidth = $("#timeline").css("width");
$("#timeline").css("width", parseFloat(tmpWidth) + 258.0/32)
}else{
$("#timeline").css("width",258);
window.clearTimeout(this.SHOWBAR_TIME_OBJ);
// return;
}
//定时执行函数
this.SHOWBAR_TIME_OBJ=window.setTimeout("playMusic.showBar()",1000);
}
}
图形旋转
html
<div id="play_card"><img src="../images/play/paly_card.png"></div>>
css
#play_card {
240px;
height: 240px;
position: absolute;
left: 63px;
top: 105px;
}
javascript
var playMusic = function(){
// 开始旋转
startPlay: function(){
this.setPlayCard(1)
}
// 停止旋转
stopPlay: function(){
this.setPlayCard(2)
}
// 播放盘状态
PLAYCARD_TIME_OBJ: new Object(),
setPlayCard: function(i,current=0){
if(i == 1){
current = current +10;
$("#play_card").css("transform", 'rotate('+ current%360 + 'deg');
this.PLAYCARD_TIME_OBJ = window.setTimeout("playMusic.setPlayCard("+1+','+ current+")", 1000);
}else if(i == 2){
window.clearTimeout(this.PLAYCARD_TIME_OBJ);
}
},
}
图片加载过慢
方案一:将图片服务和应用服务分离
七牛服务器提供的压缩图片的方法
一般来讲,用户看到的文字、图片等都是由运营上传的,如果运营直接在后台上传了一张很大的图片,那么前端页面在加载的时候就会较慢,有可能图片会有明显的加载过程,这个时候,就需要我们对图片进行处理了,比如我们公司的logo图标,地址是:点击打开链接。尺寸是1024*1024,大小是80.7kb,但是我只是需要在微信分享链接中使用这个图片,根本不需要这么大尺寸的图片,那么就很有必要压缩一下了,比如在这个图片的链接地址后面添加参数:?imageView2/2/w/300,就能够把这张图片压缩到300*300,大小为28.9kb。这样这张图片的加载速度就会加快很多。
方案二:将图片压缩
判断用户的设备(主要用在移动端)、网络等,分别加载不同质量的图片(例如高端 iPhone wifi 情况下,就可以加载双倍高清图等,蜂窝网络下面,就加载个单倍或者有损压缩过的)。
或者先加载低质量的图片,让浏览者可以看到,然后再在后台加载更高清的,等加载完了,浏览者还在观看,就插入替换掉。或者先加载低质量小图片列表,然后让用户点击,触发类似 fancybox 的效果,弹窗出现大图片。或者利用资源预加载(三个 HTML5 不常见特性简介)当用户还没打开的时候,就开始加载。
方案三:图片懒加载
jQuery图片延迟加载插件jQuery.lazyload,使用延迟加载在可提高网页下载速度。在某些情况下,它也能帮助减轻服务器负载。
使用方法
// 引用jquery和jquery.lazyload.js到你的页面
<script src="jquery-1.11.0.min.js"></script>
<script src="jquery.lazyload.js?v=1.9.1"></script>
// html图片调用方法
// 为图片加入样式lazy 图片路径引用方法用data-original
<img class="lazy" data-original="img/bmw_m1_hood.jpg">
<img class="lazy" data-original="img/bmw_m1_side.jpg">
<img class="lazy" data-original="img/viper_1.jpg">
<img class="lazy" data-original="img/viper_corner.jpg">
<img class="lazy" data-original="img/bmw_m3_gt.jpg">
// js初始化lazyload并设置图片显示方式
<script type="text/javascript" charset="utf-8">
$(function() {
$("img.lazy").lazyload({effect: "fadeIn"});
});
</script>
// 在图片中也可以不使用 class="lazy",初始化时使用:
$("img").lazyload({effect: "fadeIn"});
参数设置
$("img.lazy").lazyload({
placeholder : "img/grey.gif", //用图片提前占位
// placeholder,值为某一图片路径.此图片用来占据将要加载的图片的位置,待图片加载时,占位图则会隐藏
effect: "fadeIn", // 载入使用何种效果
// effect(特效),值有show(直接显示),fadeIn(淡入),slideDown(下拉)等,常用fadeIn
threshold: 200, // 提前开始加载
// threshold,值为数字,代表页面高度.如设置为200,表示滚动条在离目标位置还有200的高度时就开始加载图片,可以做到不让用户察觉
event: 'click', // 事件触发时才加载
// event,值有click(点击),mouseover(鼠标划过),sporty(运动的),foobar(…).可以实现鼠标莫过或点击图片才开始加载,后两个值未测试…
container: $("#container"), // 对某容器中的图片实现效果
// container,值为某容器.lazyload默认在拉动浏览器滚动条时生效,这个参数可以让你在拉动某DIV的滚动条时依次加载其中的图片
failurelimit : 10 // 图片排序混乱时
// failurelimit,值为数字.lazyload默认在找到第一张不在可见区域里的图片时则不再继续加载,但当HTML容器混乱的时候可能出现可见区域内图片并没加载出来的情况,failurelimit意在加载N张可见区域外的图片,以避免出现这个问题.
});
https://www.cnblogs.com/moqiutao/p/6959163.html
方案四:css Sprites
方案五:将图片压缩成base64格式来节约请求
将图片压缩成base64,随html或者css一起下载到浏览器,不需要额外的请求,这样就节约了请求
如果将图片转换成base64,实际上是变大了,并且浏览器在decode base64编码的图片时需要耗费很多时间的,所以如果我们选择此种方案的话,最好选择一些小图片,不然得不偿失,在webpack中可以设置最大多少byte的图片压缩成base64,针对decode base64编码的图片比较慢的问题,我们可以选择使用canvas来加速.当向canvas发出绘画命令时,浏览器直接将指令发到图形加速器而不需要开发者更多的干预,硬件图形加速器则以难以执行的运算速度实时绘画和渲染图形.因此,我们可以使用canvas来渲染base64编码后的图片
屏幕进度条拖动
js
processBarControl:function(){
const timeProgressWrapper = document.getElementById("time_processWrapper");
const timeProgress = document.getElementById('time_process');
const timeProgressBtn = document.getElementById('time_processBtn');
const timeProgressWrapperWidth = timeProgressWrapper.offsetWidth;
const volumeProgressWrapper = document.getElementById('volume_processWrapper');
const volumeProgress = document.getElementById('volume_process');
const volumeProgressBtn = document.getElementById('volume_processBtn');
const volumeProgressWrapperHeight = volumeProgressWrapper.offsetHeight;
let timeTouchPoint = 0;
let timeBtnLeft = 0;
let volumeTouchPoint = 0;
let volumeBtnBottom = 0;
/**
* 时间轴触摸开始事件
*/
timeProgressBtn.addEventListener('touchstart', e => {
let timeTouch = e.touches[0]
timeTouchPoint = timeTouch.clientX // 获取触摸的初始位置
timeBtnLeft = parseInt(getComputedStyle(timeProgressBtn, null)['left'], 10) // 此处忽略IE浏览器兼容性
})
/**
* 时间轴触摸移动事件
*/
timeProgressBtn.addEventListener('touchmove', e => {
e.preventDefault(); // 防止浏览器默认行为
e.stopPropagation(); // 防止冒泡
if(e.touches.length > 1) return; // 防止多点触控
let timeTouch = e.touches[0];
let timeDiffX = timeTouch.clientX - timeTouchPoint; // 通过当前位置与初始位置之差计算改变的距离
let timeBtnLeftStyle = timeBtnLeft + timeDiffX ;// 为按钮定义新的left值
if (timeBtnLeftStyle > timeProgressWrapperWidth) {
timeBtnLeftStyle = timeProgressWrapperWidth
}
else if (timeBtnLeftStyle < 0) {
timeBtnLeftStyle = 0
}
window.event?window.event.cancelBubble=true:e.stopPropagation();
timeTouch.target.style.left = timeBtnLeftStyle + 'px';
let timePer = timeBtnLeftStyle / timeProgressWrapperWidth;
Player.current = parseInt(timePer*Player.duration);
Player.setCurrent(Player.current);
timeProgress.style.width = timePer * 100 + '%'; // 通过按钮的left值与进度条容器长度的比值,计算进度条的长度百分比
})
/**
* 时间轴触摸离开事件
*/
timeProgressBtn.addEventListener('touchend', e =>{
alert(Player.current);
noticeServerCodeAndValue("setMusicProgress",Player.current)
window.event?window.event.cancelBubble=true:event.stopPropagation();
})
jQuery
$('#webchat_scroller').on('touchstart',function(e) {
var touch = e.originalEvent.targetTouches[0];
var y = touch.pageY;
});
$('#webchat_scroller').on('touchmove',function(e) {
e.preventDefault(); // 防止浏览器默认行为
e.stopPropagation(); // 防止冒泡
if(e.originalEvent.targetTouches.length > 1) return; // 防止多点触控
var touch = e.originalEvent.targetTouches[0];
var y = touch.pageY;
});
$('#webchat_scroller').on('touchend',function(e) {
var touch = e.originalEvent.changedTouches[0];
var y = touch.pageY;
});
长按事件
$("#stopRecord").on({
touchstart: function(e){
longClick=0;//设置初始为0
timeOutEvent = setTimeout(function(){
//此处为长按事件
MeetingRecord.timeCountObj.shutdownTimer();
MeetingRecord.waitOkObj.startTimer();
$(".recordButton").css("display", "none");
$("#recordOver").css("display", "block");
longClick=1;//假如长按,则设置为1
},500);
},
touchmove: function(){
clearTimeout(timeOutEvent);
timeOutEvent = 0;
e.preventDefault();
},
touchend: function(e){
clearTimeout(timeOutEvent);
if(timeOutEvent!=0 && longClick==0){
//此处为点击事件
MeetingRecord.timeCountObj.shutdownTimer()
$(".recordButton").css("display", "none")
$("#continueRecord").css("display", "block");
}
return false;
}
});
JS打印
整体打印
<button id="print1">打印全部</button>
$('#print1').click(function(){
window.print();
});
局部打印
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>局部打印案例</title>
<script type="text/javascript">
function doPrint() {
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->"; // 开始打印标识字符串有17个字符
eprnstr="<!--endprint-->"; // 结束打印标识字符串
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); // 从开始打印标识之后的内容
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); // 截取开始标识和结束标识之间的内容
window.document.body.innerHTML=prnhtml; // 把需要打印的指定内容赋给body.innerHTML
window.print(); // 调用浏览器的打印功能指定区域
window.document.body.innerHTML=bdhtml; // 还原页面
}
</script>
</head>
<body>
<p>1不需要打印的地方</p>
<p>2这里不要打印啊</p>
<!--startprint--><!--注意要加上html里star和end的这两个标记-->
<h1>打印标题</h1>
<p>打印内容</p>
<!--endprint-->
<button type="button" onclick="doPrint()">打印</button>
<p>不打印的地方啊哈哈哈哈</p>
<p>2</p>
</body>
</html>
局部打印指定部分之外的内容
// 在打印前将指定部分隐藏,打印后再将指定的部分显示出来
$('#print3').click(function(){
$('p').hide();
window.print();
$('p').show();
});
打印分页css,相当于分页符,总是在此div后分页
<div style="height:300px; page-break-after:always"></div>
// position 值为 relative 或 static 的非浮动块级元素。当时absolute的时候是不起作用的。
判断扫码的客户端
根据UserAgent中的关键字来判断,如果有 MicroMessenger 为微信,如果有 ApliPayClient 则为支付宝 。否则,不是这两家
function IsWeixinOrAlipay(){
var ua = window.navigator.userAgent.toLowerCase();
//判断是不是微信
if ( ua.match(/MicroMessenger/i) == 'micromessenger' ) {
return "WeiXIN";
}
//判断是不是支付宝
if (ua.match(/AlipayClient/i) == 'alipayclient') {
return "Alipay";
}
//哪个都不是
return "false";