一、作用域
1、当看到script标签的时候就会进入到js作用
2、调用一个function的时候
二、进入到作用域之后,发生了什么事情??
1、js预解析
开辟一个空间,找有没有var,有没有方法参数,有没有function,如果有var,有方法参数,就把var和方法参数定义的变量设置成undefined,如果有function,那么就储存function里面的所有内容。
2、js逐行执行
从上往下执行,找有没有表达式,+ - * 、== ++ – ,如果有表达式,就修改js作用域里面的变量的值。
1 | window.onload = function () { |
判断某变量的值是否等于某数组中的一个元素
1 | 示例: |
需求:
1 | //当前页URL |
【参考】: js:判断某变量的值是否等于某数组中的一个元素
js高效修改对象数组里的对象属性名
1 | appList: [ |
(因为插件的要求)改为:
1 | productArr: [ |
代码:
1 | var productArr = JSON.parse(JSON.stringify(appList).replace(/list/g, 'children')); |
【参考】: js高效修改对象数组里的对象属性名
数组相减
1 | //数组相减函数 |
JS 模拟浏览器 F5 自动刷新页面效果
1 | 1. window.location.replace(window.location.href); |
对象格式转换
1 | var data = [ |
控制滚动条滚动到某个位置
1 | document.getElementById('scrollBox').scrollTop = $(el).offset().top; |
js字符串连接换行符没有效果解决办法
1 | var a = 'aaaaa', b = 'bbbbb', c = 'ccccc'; |
js 去掉字符串前后空格
js去掉字符串前后空格的五种方法
js 去掉字符串前后空格
1 | 使用jquery |
1 | <script type="text/javascript"> |
1 | JS 去字符串空格 总结 |
用js实现模糊查询的几种方法
1. indexof 方法
语法:stringObject.indexOf(searchvalue, fromindex)
参数:searchvalue 必需。规定需检索的字符串值。 fromindex
可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。
说明:该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 searchvalue。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 searchvalue,则返回 searchvalue 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的。如果没有找到,将返回 -1。
1 | /** |
2. split 方法
语法:stringObject.split(separator, howmany)
参数:separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
说明:该方法通过在 separator 指定的边界处将字符串 stringObject 分割成子串并返回子串数组。返回的数组中的字串不包括 separator 自身。如果 stringObject 中不存在 separator,将返回一个只包含stringObject的数组。故可以根据返回数组的长度来判断是否存在子字符串 separator 。
1 | /** |
3. match 方法
语法:stringObject.match(searchvalue) 或 stringObject.match(regexp)
参数:searchvalue 必需。规定要检索的字符串值。regexp 必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。
说明:该方法将在字符串 stringObject 内检索指定的值,或找到一个或多个正则表达式的匹配。如果没有找到任何匹配的文本,将返回 null 。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
1 | /** |
4. test方法(正则匹配)
语法:RegExpObject.test(string)
参数:string 必需。要检测的字符串。
说明:该方法用于检测一个字符串是否匹配某个模式。如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
1 | /** |
性能测试
测试条件:一个长度为100的数组,每个方法测试50次,取平均值。
indexof 方法耗费时间: 0.048ms
split 方法耗费时间: 0.037ms
match 方法耗费时间: 0.178ms
test 方法耗费时间: 0.039ms
结论
从上面测试结果可以看出在几百几千甚至几万条数据量的情况下,前端去处理都是没问题的,相比发送一个 ajax 请求去后台来说,前端还是具有很大优势的,能节省不少时间。
相比其他方法,match 方法性能最差,消耗的时间差不多是其他方法的3-4倍,虽说这一点点时间相比发送ajax来说,也算提高了很多既然我们在一开始就是为了提高用户体验,那么我们也应该追求极致啦,所以 match 选手落败。
除了 match 方法,其他三个方法在性能上差不多。不过在这里有一点需要提出的就是, test 方法因为使用到了正则表达式,所以能够实现的功能会比较强大,写出来的代码也更加简洁。打个比方,在不区分大小写的模糊搜索条件下, test 方法只需在正则表达式中添加修饰符 i 即可实现不区分大小写,而 indexof 方法和 split 方法则要通过多次的方法调用和逻辑运算符才能实现效果。
屏蔽Backspace键返回上个页面
1 | //屏蔽Backspace键返回上个页面 |
阻止浏览器默认行为触发的通用方法
1 | //阻止浏览器默认行为触发的通用方法 |
H5本地缓存
jquery实时监听input输入框值的变化事件
1.只需要同时绑定 oninput 和 onpropertychange 两个事件,获取input元素,并实时监听用户输入。
1 | $('input').bind('input propertychange', function(){ |
但这并不完美,因为用的bind,所以当遇到追加的新input标签时,则不能监听了。
2.为了解决上面的问题,可以使用live替代
1 | $('input').live('input propertychange', function() |
表单input中disabled提交后得不到值的解决办法
使用readonly
模拟下拉框获取不了角度,可以让它附近的文字获取焦点。 【文字是可以获取焦点的,不是文字,一般的元素获取不了焦点】
防止事件冒泡
1 | window.event? window.event.cancelBubble = true : e.stopPropagation(); |
返回上一页
1 | javascript:window.history.go(-1); |
刷新页面
1 | window.location.reload(); |
设置复选框选中
1 | $("input").attr("checked", true); |
判断复选框是否被选中
1 | var isChecked = $("input").is(":checked"); |
设置复选框不选中
1 | $("input").attr("checked", false); |
全选/全不选复选框
1 | $('#selectAll').bind('change',function(event) { |
全选复选框和普通复选框联合
1 | var $all_check = $('#all_check'); |
获取单选框选中的值
1 | $('input[name="plan"]:checked').val(); |
监听单选按钮事件改变
1 | $('input[type=radio][name=type]').change(function() { |
JS中对象赋值只传值不传对象(地址)的方法,改变新值不影响旧值
1 | var newModel = $.extend(true,{},oldModel) |
1 | var newModel = $.extend(true,[],oldModel) |
只赋值不改变原来对象
1 | var data={a:1,b:2,c:3,d:4}; |
判断是否为移动端
1 | var isMobile = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent); |
判断输入框是否获取焦点
1 | var isFocus=$("#tRow").is(":focus"); |
单页面应用判断页面是不是刷新(谷歌浏览器)
在刷新页面的时候使用window.onbeforeunload向sessionstorage或localstorage存入一个标记譬如reloadFlag作为判断是否是刷新的依据,页面刷新后从sessionstorage或localstorage中获取存储的标记,然后执行相应的回调向后端发起请求,完成之后将sessionstorage或localstorage中获取存储的标记删除即可。
1 | // reLoadFlag.js |
第一次向后端发起请求得到数据后存储到sessionstorage或localstorage之中,之后的逻辑是每次需要数据时从sessionstorage或localstorage中去取,取不到的时候(比如关闭页面重新打开或者手动清除缓存)再重新向后端发起请求获取数据。但是这样会存在一个问题,即希望通过刷新页面向后端重新发起请求的时候因为sessionstorage或localstorage的数据仍然存在,所以不会向后端发起请求。
filter函数做数据匹配
只有一个筛选条件的时候
1 | var res = datas.filter(function (data) { |
多个筛选条件的时候(注意:要加上 > -1,不然返回有问题)
1 | var searchList = []; |
处理textarea换行数据
先使用换行符“\n”截取,然后用”~”获取
火狐浏览器,报ev is undefined
获取当前操作对象时,要记得传参
封装函数加上参数e
调用时加上参数e
搜索框——实时匹配
(输入完文字就直接匹配,包括中文输入)实现中文输入法下,仅在选词后触发input事件。参考教程
1 | 描述 |
获取横向滚动条位置
1 | var left = $(".layui-table-body").scrollLeft(); |
设置横向滚动条位置
1 | $(".layui-table-body").scrollLeft(left); |
利用js打开新页面(在另外新建窗口中打开窗口)
1 | window.open("http://doc.trackingio.com/qu-dao-pei-zhi-shuo-ming/guang-dian-tong.html","_blank"); |
jQuery–复制克隆(复制节点)
1 | //文档准备就绪函数 |
js获取日期(例如:昨天、今天和明天)
1 | function GetDateStr(AddDayCount, nowDay) { |
给对象添加变量属性(空数组)
使用[]
1 | selectChannel[selectList[i]] = []; |
改变checkbox选中状态
使用prop方法 动态改变checkbox的选中状态
使用1.6.1 以上版本(测试使用1.10.1版本可以)
捕获错误信息
1 | <body> |
返回文档的根节点(html)
1 | document.documentElement |
返回DOM对象中的body节点
1 | document.body |
在标准模式下,document.body.scrollTop恒为0;
但在怪异模式下,document.documentElement.scrollTop;
但是document.documentElement.scrollTop和document.body.scrollTop在标准模式或者是奇怪模式下都只有一个会返回有效的值,所以获取scrollTop时两个都加上
获取滚动条当前位置高度
1 | function getScrollTop(){ |
获取当前页面可视高度(注意,此处得到的是当前页面的可视高度,而不是浏览器的可视高度)
1 | function getClientHeight(){ |
获取文档完整高度
1 | function getScrollHeight(){ |
判断是否到达页面底部
1 | // 当滚动条高度加上页面可视高度等于整个文档完整高度,则页面已达到底部 |
清空尚未执行完的动画队列
1 | $(".mobie_show").stop().animate({"top":"70px","opacity":"1"}); |
把当前元素接下来尚未执行完的动画队列清空 (例如:当用户鼠标经过某元素的时候,执行某个动画,用户不断地让鼠标经过元素,但上一个动画还没有执行完毕。 加上stop是为了避免用户不停地操作)
swobject的使用
1 | var params = {wmode:"transparent"}; |
JS禁止查看网页源代码的实现方法
查看源代码的方法:
1、直接按F12
2、Ctrl+Shift+I查看
3、鼠标点击右键查看
把以上三种状态都屏蔽掉就可以了,document有onkeydown(键盘按键事件),该事件里面找到对应的keycode并处理就可以,document也有oncontextmenu鼠标右键事件,屏蔽即可。
1 | window.onload = function(){ |
网站个性化设置-换肤
结构:
1 | <body class="green"> |
样式:
1 | #content p { |
方法:
方法一:点击按钮改变body的样式
用replace替换,拿到后面的值(default、green)用replace把(btn btn-)替换为空
1
2
3
4
5
6
7
8
9$(function() {
// 单击不同的按纽,加载不同的样式
$(".theme button").click(function(){
// replace()用于替换字符串
// attr()获取属性
var theme = $(this).attr('class').replace('btn btn-','');
alert(theme);
$("body").attr('class', theme); // body添加属性
}弊端(如果button 后面还有别的类名,就不好使了)
方法二:自定义属性
1
2
3
4
5
6<div class="theme">
<button class="btn btn-default" btn-name="default">默认</button>
<button class="btn btn-green” btn-name="green">绿色</button>
<button class="btn btn-blue" btn-name="blue">蓝色</button>
<button class="btn btn-orange" btn-name="orange">橙色</button>
</div>1
2
3
4
5
6
7
8
9$(function() {
// 单击不同的按纽,加载不同的样式
$(".theme button").click(function(){
// replace()用于替换字符串
// attr()获取属性
var theme = $(this).attr('btn-name');
alert(theme);
$("body").attr('class', theme); // body添加属性
}
获取form表单全部value值
1 | var data = $("#form").serializeArray(); |
鼠标在图片上,滚动滚轮,可放大缩小图片
1 | <img src="./blog-head-img.jpg" onmousewheel="return bbimg(this)" |
delegate() 方法
delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数。
使用 delegate() 方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。
1 | $("div").delegate("button","click",function(){ |
1 | $(selector).delegate(childSelector,event,data,function) |
记录及清空搜索历史记录
移动端设备判断
1 | var ua=navigator.userAgent, wxv=parseInt(ua.substring(ua.toLowerCase().indexOf("micromessenger/")+15)); |
回调函数:
1 | var foo = 1; |
1 | var func = (function(a) { |
对返回的数据进行处理-专为数组或对象格式
1 | var data ={ |
输入框获取焦点-放大/缩小页面(scale)
1 | <div class="login-box"> |
1 | // var clientH = document.documentElement.clientHeight; |
打开页面,直接跳转到百度
1 | window.onload = function(){ |
动态追加script脚本或js文件
1 | function loadScript (url) { |
打开一个新的浏览器窗口
1 | <button onclick="openwindow()">创建窗口</button> |
1 | var w = window; |
捕获错误信息
1 | var errorTxt = ""; |
阻止事件冒泡
1 | oSpan.onclick = function(e){ |
使用定时器是为了让输入框上滑时更加自然-移动端
1 | var bfscrolltop = document.body.scrollTop; |
jQuery插件扩展
数组里的字符串转换成数字或者把数字转换成字符串
数字转字符串:
1 | var arr = [1,2,3,4,5,6,7,8,9]; |
字符串转数字:
1 | var a = ['1','2','3','4','5','6','7','8','9']; |
- 本文作者: LQbank
- 本文链接: http://example.com/2020/04/07/Javascript方法/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!