精彩js代码

189 阅读4分钟
获取url中的参数,这个函数超级有用,好多项目中都用到的
function getParam(paramName){ 
			  		paramValue =""; 
						  isFound =false; 
						  if (this.location.search.indexOf("?") ==0&&this.location.search.indexOf("=")>1){ 
						    arrSource = unescape(this.location.search).substring(1,this.location.search.length).split("&"); 
						    i =0; 
						    while (i < arrSource.length &&!isFound){ 
						      if (arrSource[i].indexOf("=") >0){ 
						        if (arrSource[i].split("=")[0].toLowerCase()==paramName.toLowerCase()){ 
						          paramValue = arrSource[i].split("=")[1]; 
						          isFound =true; 
						        } 
						      } 
						    i++; 
						    } 
						  } 
	    return paramValue;
}

这个函数的修改版

	function getParam(paramName,url){ 
			  		paramValue =""; 
						  isFound =false; 
							
						    arrSource = unescape(url).substring(1,url.length).split("&");

						    i =0; 
						    while (i < arrSource.length &&!isFound){ 
						      if (arrSource[i].indexOf("=") >0){ 
						        if (arrSource[i].split("=")[0].toLowerCase()==paramName.toLowerCase()){ 
						          paramValue = arrSource[i].split("=")[1]; 
						          isFound =true; 
						        } 
						      } 
						    i++; 
						    } 
						   
	    return paramValue;
}

这段代码就是表单提交时,点击提交的时候,跳到check_form()方法去验证,check_form里面只要return true就是提交了,return false就是不提交

<form method="post" id="addEditBrandForm" onsubmit="return check_form();"  action="index.php?route=seller/express/updata_fangan&user_token={{ user_token }}">                

<这段代码才是真正的神码,我擦,直接在前端验证那个正则,这段正则的意思是,最大长度为10位数,键盘弹起来或者粘贴代码时 执行这段js代码,将input的值以空白去代替所有非数字的元素 [^xyz] 匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'

 <input class="w400 text" type="text" value="{{fang_an.second_price}}" name="config_add_money" maxlength="10" onkeyup="this.value=this.value.replace(/[^\d.]/g,'')" onpaste="this.value=this.value.replace(/[^\d.]/g,'')" id="config[add_money]">

这段代码就厉害啦,叼,获取当前这个元素的叫做td的父亲,然后获取他之前的第7个td,然后这个td的其中一个儿子input的值

var id=$(this).parent('td').prevAll('td').eq(7).children('input').val();

这段代码一般用作ajax,php会把数组当作json传送,jQuery.parseJSON就是把json格式的数组转为数组

    var  rid=jQuery.parseJSON(data)[0].id;

原来表单的提交,除了用ajax,也可以用这个的方式去提交

$('#form-menu-menu').submit();

返回上一页并且刷新,这段代码牛逼了

self.location=document.referrer;

一个联动方案,个人感觉非常厉害,真不愧是我写的

$('select[name=\'express\']').click(function(){
			
//			var express_id = $(this).val();
				$.ajax({
					type:"post",
					url:"index.php?route=seller/express/ajax_fangan&user_token={{ user_token }}",
					data:{
						
						'express_id':$(this).val(),
						'store_id':$('input[name=\'store_id\']').val()
					},
					async:true,
					success:function(data){
						$('select[name=\'shipping_method\']').empty();
						var result = jQuery.parseJSON(data);
						console.log(result);
						var strocity="";
						for (var i = 0; i < result.length; i++) {
                             strocity += '<option value=' + result[i].id + '>';
                             strocity += result[i].name;
                             strocity += '</option>';
                         }
                         $('select[name=\'shipping_method\']').append(strocity);
				
					}
				});
			
		})

一个简简单单的事件绑定,也可以忙一个下午,我真是醉了,我也是思考了好久才决定上网找的 关于jq绑定动态dom事件,本来用on是没事的,但是怎样尝试也不行,才发现on的正确用法其实是

$(document).on("keyup", ".input-sm", function () {})

就是这样动态绑定未来的dom

<关于在当前网页中弹窗,然后选中某个商品,再将这个商品返回到当前网页,这个涉及了,layer弹窗,函数调用等知识 这段代码适用于当前页面

//					添加商品
					function selectGoods() {
						var url = "./index.php?route=seller/indent_list/indent_product&user_token={{user_token}}";
						layer.open({
							type: 2,
							title: '选择商品',
							shadeClose: true,
							shade: 0.8,
							area: ['80%', '80%'],
							content: url,
							});
							}
							
//							选择完商品回调的函数
					function call_back(table_html) {
							$('#goods_td').empty().html('<table id="goos_table" class="ncsc-default-table order">' + table_html + '</table>');
								//过滤选择重复商品
								
							$('input[name*="spec"]').each(function(i, o) {
								if($(o).val()) {
//									
									var name=$(o).attr('rel');
									$('input[name="' + name + '"]').parent().parent().remove();
//								 
								}
							});
							layer.closeAll('iframe');
							$('#goos_table  thead tr td:nth-child(5)').remove();
							$('#goos_table  tbody tr td:nth-child(6)').remove();


					}

上面这段代码,是用了layer的插件,做之前要先引入这个插件

用作回调函数的代码,其实真的是,一般是把当前页面的数据回调到父亲页面

javascript:window.parent.call_back($('#goos_table').html().replace(/库存/,'数量'));

回调到父亲页面的call_back函数中

这个是将字符串形式的数字强行转成数值型数字

 parseInt(e1)+parseInt(e2); 

将php输出的json数据,转化为数组

jQuery.parseJSON(data);

ajax提交整个表单

$('#yourformid').serialize()

<用jq去控制加载js文件,在某些情况下很好用

$.getScript( "./view/javascript/jscolor.js" );

图片上传,图片上传要配合ajax的FormData实用,这段代码是临时为上传的图片找一个地址,然后再前端显示出来,不用经过服务器

<input type='button' name='button' id='button1' value='选择上传' class='type-file-button require'>
<input name='pic[]'  id='pic'  type='file' class='type-file-file' accept='image/*'  style='display: none;' value=''>

<script type="text/javascript">
$(document).on("click",'#button1',function(){

   $("#pic").click();
    $("#pic").on("change",function(){
	var objUrl = getObjectURL(this.files[0]) ; //获取图片的路径,该路径不是图片在本地的路径
   console.log(objUrl);
   if (objUrl) {
	$(".selected").find('img').attr("src",objUrl); //将图片路径存入src中,显示出图片
	console.log($(".selected").find('img'));
	}
});
})
//建立一個可存取到該file的url
function getObjectURL(file) {
var url = null ;
if (window.createObjectURL!=undefined) { // basic
url = window.createObjectURL(file) ;
} else if (window.URL!=undefined) { // mozilla(firefox)
url = window.URL.createObjectURL(file) ;
} else if (window.webkitURL!=undefined) { // webkit or chrome
url = window.webkitURL.createObjectURL(file) ;
}
return url ;
}
</script>

<!--在图片上传的时候,由于上传多张的时候,change会执行多次,为了避免这种情况发生,可以在绑定chenge事件前-->
<!--先解绑,解绑之后再绑定,就是只会执行一次了-->

<!--图片上传ajax-->
$("#upload").off("change").on("change",function(){})



   						 		var data1 = new FormData($('#form1')[0]);
   						 		 $.showPreloader("正在上传,请稍后");
   						 								$.ajax({
   														type:"post",
   														url:"",
   														async:true,
   														cache: false,  
   											            processData: false,  
   											            contentType: false,
   														data: data1,
   														success:function(data){
   															  $.hidePreloader();
   														},
   													});	
   						 }

在js函数传值中, 由于字符串要加双引号,才能当成是字符串传值,如果不加双引号,js会默认当成是变量,所以一定要注意,在字符串拼接的时候,可以使用\这个符号,去指明这个双引号是用来标识字符串的

 onclick='del(\""+product_arr[x].list[y].code+"\")'

 <!--就像是这样-->

获取页面内dom元素的高度宽度,用做懒加载时

alert($(window).height()); //浏览器当前窗口可视区域高度 

alert($(document).height()); //浏览器当前窗口文档的高度 

alert($(document.body).height());//浏览器当前窗口文档body的高度 



alert($(document.body).outerHeight(true));//浏览器当前窗口文档body的总高度 

包括border padding margin 

alert($(window).width()); //浏览器当前窗口可视区域宽度 

alert($(document).width());//浏览器当前窗口文档对象宽度 

alert($(document.body).width());//浏览器当前窗口文档body的高度 



alert($(document.body).outerWidth(true));//浏览器当前窗口文档body的总宽度 

<!--包括border padding margin -->

alert($(document).scrollTop()); //获取滚动条到顶部的垂直高度  

alert($(document).scrollLeft()); //获取滚动条到左边的垂直宽度 

<!--这里必须注意一个问题,就是页面中必-->
<!--须要有<!DOCTYPE html></html>,这个标签,没有这个标签就根本获取不了正确的高度和宽度,-->

关于懒加载,其实就是把图片的地址存在该图片的其他属性中,然后判断甘图片是否到了可视区域,到了就用js去把这个地址放回图片中的src中,就是懒加载的原理了

懒加载

<script type="text/javascript">
		var lazy_img={
			setImg:function(index){

				if ($('img').eq(index+1).dataset) {
                    var src=$('img').eq(index+1).dataset.src;
                } else{
                    var src=$('img').eq(index+1).attr("data-src");
                }
               	$('img').eq(index+1).attr("src",src);
			},
			
		}
		
		
		window.onscroll=function(){
			var t = $(window).height()+$(window).scrollTop();
			console.log(t);
			$('img').each(function(index){
				 var h = $(this).offset().top;	
				 if (h <= t) {
                   setTimeout("lazy_img.setImg("+index+")",100);
                }
			})
		}

		$(document).ready(function(){
			window.onscroll();
		})
</script>

关于鼠标点击图片放大查看

$(document).on("click",".ev-img img",function(){
	
	var src=$(this).attr("data-src");
	var json={
	  "title": "", //相册标题
	  "id": 123, //相册id
	  "start": 0, //初始显示的图片序号,默认0
	  "data": [   //相册包含的图片,数组格式
	    {
	      "alt": "图片名",
	      "pid": 666, //图片id
	      "src": src, //原图地址
	      "thumb":src //缩略图地址
	    }
	  ]
	}

	layer.photos({
	  photos: json
	  ,anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机(请注意,3.0之前的版本用shift参数)
	}); 
})

调用了layer的插件,这个插件做弹层真的很好用,用json传入就可以了

input的属性,name查找

$("div[id]") 选择所有含有id属性的div元素 
$("input[name='keleyicom']") 选择所有的name属性等于'keleyicom'的input元素 

$("input[name!='keleyicom']") 选择所有的name属性不等于'keleyicom'的input元素 

$("input[name^='keleyi']") 选择所有的name属性以'keleyi'开头的input元素 
$("input[name$='keleyi']") 选择所有的name属性以'keleyi'结尾的input元素 
$("input[name*='keleyi']") 选择所有的name属性包含'keleyi'的input元素 

$("input[id][name$='keleyi']")

可以使用多个属性进行联合选择,该选择器是得到所有的含有id属性并且那么属性以keleyi结尾的元素

例如:

$(":input[name='keleyi']") 表示查找的是namekeleyi的表单。

这样查找就非常方便了,嘻嘻

一般用于checkbox的框,用于点击这个就全选或者全不选

onclick="$('input[name*=\'selected\']').prop('checked', this.checked);"

弹出js原生的确认框,就可以省去leyer的步骤了,而且这个非常有

onclick="confirm('{{ text_confirm }}') ? $('#form-voucher').submit() : false;"

这个用于验证输入框是否为空或者是否用空格

$("input[name='shipping_area_name']").val()==""||$("input[name='shipping_area_name']").val().indexOf(" ")>=0

这里出现精度不准确的原因是因为js的小数相乘bug,实用toFixed四舍五入,不同浏览器会有不同结果,不建议用

p_discount = parseFloat(discount)*0.1;
//乘法 
 function accMul(arg1,arg2) 
 { 
 var m=0,s1=arg1.toString(),s2=arg2.toString(); 
 try{m+=s1.split(".")[1].length}catch(e){} 
 try{m+=s2.split(".")[1].length}catch(e){} 
 return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) 
 } 
//加法 
function accAdd(arg1,arg2){ 
var r1,r2,m; 
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 
m=Math.pow(10,Math.max(r1,r2)) 
return (arg1*m+arg2*m)/m 
} 
//减法 
function Subtr(arg1,arg2){ 
 var r1,r2,m,n; 
 try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} 
 try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} 
 m=Math.pow(10,Math.max(r1,r2)); 
 n=(r1>=r2)?r1:r2; 
 return ((arg1*m-arg2*m)/m).toFixed(n); 
} 
<!--正则验证,以及跳出each循环-->
	var check={
		check_email:function(){
				var objRegExp=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
				var val=true;/*先把value当是true*/
				$('.email').each(function(){
						if(!(objRegExp.test($(this).val()))){/*如果是false的话,就执行if的内容*/
							val=objRegExp.test($(this).val());/*把false的值传给val*/
							return  false;/*跳出循环*/
						}
				})
				
				return val;/*返回false值*/
		},
	}
	<!--正则因为要验证过多的东西,所以用对象管理会更加好,直接在循环中return,是跳出当前循环而已,并不能做到
	返回函数,在循环外部继续返回,false值或者true值-->
<!--根据页面滚动的高度去变化那个hover-->
        $(window).scroll(function(){
            var tj = [];
            var strlength = $('.home-standard-layout').length;
            console.log(strlength);
            var stheigh = $('.home-standard-layout').eq(strlength-1).height();//最后一个楼层的高度
            console.log(stheigh);
            var scr = $(document).scrollTop();
            console.log(scr);
            scr=scr+300;
//          这个值是由每个分类的偏差做出的,很难准确
            $('.home-standard-layout').each(function(i){
                var sthei = $(this).offset().top;
                tj.push(sthei);//楼层距离顶部的高度添加进数组
            })
            for(var n = 0;n < strlength;n++){
                if(scr >= tj[n] && scr <= tj[n] + stheigh){
                    $(".floornav_left ul li").eq(n).addClass("darkshow").siblings().removeClass("darkshow");
                }
            }
        });
<!--这样就很帅了啊,而且好好睇-->
<!--这个加载js插件,js脚本-->
<script>
(function(){
    var bp = document.createElement('script');
    var curProtocol = window.location.protocol.split(':')[0];
    if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';        
    }
    else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>

//										var bp1 = document.createElement('script'),bp2=document.createElement('script'),bp3=document.createElement('script');
//										 bp1.src = 'css_js_img/js/jquery.min.js';	
//							   		var s = document.getElementsByTagName("script")[0];
//  								s.parentNode.insertBefore(bp1, s);
//										加载滚动插件
//										  bp2.src ='css_js_img/js/jquery.waypoints.min.js';
//										  bp3.src ='css_js_img/js/jquery.countup.min.js';
//  									s.parentNode.insertBefore(bp2, s);
//  									s.parentNode.insertBefore(bp3, s);
//										   
//											bp1.onload=function(){
												
//											}//js加载完成执行方法

后台传过来时间戳,最好的转化方法

function dealTime(val){/*修正时间格式*/
	  	let date = new Date(val);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
        let Y = date.getFullYear() + '-';
        let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
        let D = date.getDate() + ' ';
        let h = date.getHours() + ':';
        let m = date.getMinutes() + ':';
        let s = date.getSeconds();
        return Y+M+D+h+m+s;
}

最好的验证身份证方法

export const testCode=(idCard)=>{/*加权因子验证身份证*/
	let regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
            //如果通过该验证,说明身份证格式正确,但准确性还需计算
            if(regIdCard.test(idCard)){
	              if(idCard.length==18){
                    var idCardWi=new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
                    var idCardY=new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
                    var idCardWiSum=0; //用来保存前17位各自乖以加权因子后的总和
                    for(var i=0;i<17;i++){
                        idCardWiSum+=idCard.substring(i,i+1)*idCardWi[i];
                    }
                    var idCardMod=idCardWiSum%11;//计算出校验码所在数组的位置
                    var idCardLast=idCard.substring(17);//得到最后一位身份证号码
                    //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
                    if(idCardMod==2){
                        if(idCardLast=="X"||idCardLast=="x"){
                            return true;
                        }else{
                            return false;
                        }
                    }else{
                        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
                        if(idCardLast==idCardY[idCardMod]){
                             return true;
                        }else{
                        	    return false;
                        }
                    }
                }
            }else{
                return false;

            }
}

============================================================= 销毁js变量

js变量分为两种,一种是全局变量,一种是局部变量。 全局变量,在js文件的任意地方都可以使用,它的生命周期就是js文件使用的周期。 局部变量,它在所属的方法,或者说是它在自己属于的对象里面才存在,这个对象或者方法被解析过了,它就自动没有了。 所以如果你要销毁变量,如果是全局变量,那么你需要覆盖它,如果是局部变量你只要等待它所在的方法结束,它就自动销毁了。 将变量赋值为undefined 如果是个对象的属性,可以使用delete删除某对象属性或者方法

==================================================== 字符串转数组,数组转字符串

String.split() 执行的操作与 Array.join 执行的操作是相反的。

很简单易懂吧,

======================================================

关于动态增加对象属性,和动态定义变量名

做项目的时候遇到需要批量生成变量名的地方,如下:

var myChart = "myChart" + index;
myChart.setOption(option);
index为函数参数; 但是myChart的值只是一个字符串,并不是变量名!
搜索了一些资料得出解决方法:

var myChart = eval("myChart" + index);
myChart.setOption(option);

eval()函数可以实现将字符串计算为变量名。

js是一个动态的语言,js也有对象,而这个对象就是一堆的键值对 key:value

而我们要是要给对象添加新的属性的时候只需要

obj.newKey=value;

就好了

但是如果我们不知道呢,我们不知道我们要加入的属性是什么属性名呢,这个属性名是可以变的呢

这个时候我们可以

var a="newKey";

obj[a]=value;

这个样子进行增加就好了

var b="v3";  
 a[b]=200;//只有这种方法可以变量传入  

而我们获得变量,就是很简单的事情了

================================ 刷新本页

window.location.reload();
<!--这个方法最好用-->

====================

判断对象中是否有某属性的常见方式总结,不同的场景要使用不同的方式。

一、点( . )或者方括号( [ ] )

  通过点或者方括号可以获取对象的属性值,如果对象上不存在该属性,则会返回undefined。当然,这里的“不存在”指的是对象自身和原型链上都不存在,如果原型链有该属性,则会返回原型链上的属性值。

// 创建对象
let test = {name : 'lei'}
// 获取对象的自身的属性
test.name   //"lei"
test["name"]   //"lei"

// 获取不存在的属性
test.age    //undefined

// 获取原型上的属性
test["toString"]  //toString() { [native code] }

// 新增一个值为undefined的属性
test.un = undefined

test.un    //undefined 不能用在属性值存在,但可能为 undefined的场景

  所以,我们可以根据 Obj.x !== undefined 的返回值 来判断Obj是否有x属性。

  这种方式很简单方便,局限性就是:不能用在x的属性值存在,但可能为 undefined的场景。 in运算符可以解决这个问题

二、 in 运算符

  MDN 上对in运算符的介绍:如果指定的属性在指定的对象或其原型链中,则in 运算符返回true。

'name' in test  //true
'un' in test    //true
'toString' in test //true
'age' in test   //false

  示例中可以看出,值为undefined的属性也可正常判断。

  这种方式的局限性就是无法区分自身和原型链上的属性,在只需要判断自身属性是否存在时,这种方式就不适用了。这时需要hasOwnProperty()

三、hasOwnProperty()

test.hasOwnProperty('name')  //true 自身属性
test.hasOwnProperty('age')   //false 不存在
test.hasOwnProperty('toString') //false 原型链上属性

  可以看到,只有自身存在该属性时,才会返回true。适用于只判断自身属性的场景。

总结

  三种方式各有优缺点,不同的场景使用不同的方式,有时还需要结合使用,比如遍历自身属性的时候,就会把 for ··· in ···和 hasOwnProperty()结合使用。

===============================================================================================================================

解决不同分辨率样式问题,设置长度或者高度时或者大小时,用rem,在html中定义font-size就行了




<script type="text/javascript" >
    /*网页字跟随页面自动变化*/
     function setRem(){
         /*获取当前页面的宽度*/
         var width = document.body.offsetWidth;
         /*设置页面的字体大小*/
         var nowFont=width/375*20;
         /*通过标签名称来获取元素*/
         var htmlFont=document.getElementsByTagName('html')[0];
         // 给获取到的元素的字体大小赋值
         htmlFont.style.fontSize =nowFont+"px";
     }
      setRem();
      window.onresize=setRem;  //监听屏幕变化

--------------------- 
作者:王小傻、QAQ 
来源:CSDN 
原文:https://blog.csdn.net/godsor/article/details/83115750 
版权声明:本文为博主原创文章,转载请附上博文链接!