首页
前端面试题
前端报错总结
电子书
更多
插件下载
Search
1
JavaScript基础(二)操作符 流程控制
42 阅读
2
HTML基础
20 阅读
3
Vue基础
17 阅读
4
wctype.h
14 阅读
5
Vue2(知识点)
13 阅读
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
登录
Search
liuxiaobai
累计撰写
108
篇文章
累计收到
12
条评论
首页
栏目
默认分类
HTML CSS
HTML基础
CSS
HTML5 CSS3
javaScript
javaScript基础
javaScript高级
Web APIs
jQuery
js小总结
WEB开发布局
Vue
PS切图
数据可视化
Git使用
Uniapp
c语言入门
标准库
嵌入式
页面
前端面试题
前端报错总结
电子书
插件下载
搜索到
22
篇与
的结果
2021-11-16
Vue基础
初识Vue:<!-- 准备好一个容器 --> <div id="root"> <h1>Hello,{{name.toUpperCase()}},{{address}}</h1> </div> <script type="text/javascript" > Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。 //创建Vue实例 new Vue({ el:'#root', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器字符串。 data:{ //data中用于存储数据,数据供el所指定的容器去使用,值我们暂时先写成一个对象。 name:'atguigu', address:'北京' } }) </script>1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;2.root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法;3.root容器里的代码被称为【Vue模板】;4.Vue实例和容器是一一对应的;5.真实开发中只有一个Vue实例,并且会配合着组件一起使用;6.{{xxx}}中的xxx要写js表达式,且xxx可以自动读取到data中的所有属性;7.一旦data中的数据发生改变,那么页面中用到该数据的地方也会自动更新;注意区分:js表达式 和 js代码(语句)1.表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方: (1). a (2). a+b (3). demo(1) (4). x === y ? 'a' : 'b'2.js代码(语句) (1). if(){} (2). for(){}Vue模板语法有2大类:1.插值语法: 功能:用于解析标签体内容。 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性。2.指令语法: 功能:用于解析标签(包括:标签属性、标签体内容、绑定事件.....)。 举例:v-bind:href="xxx" 或 简写为 :href="xxx",xxx同样要写js表达式,且可以直接读取到data中的所有属性。 备注:Vue中有很多的指令,且形式都是:v-????,此处我们只是拿v-bind举个例子。Vue中有2种数据绑定的方式:1.单向绑定(v-bind):数据只能从data流向页面。 2.双向绑定(v-model):数据不仅能从data流向页面,还可以从页面流向data。备注: 1.双向绑定一般都应用在表单类元素上(如:input、select等) 2.v-model:value 可以简写为 v-model,因为v-model默认收集的就是value值。data与el的2种写法1.el有2种写法 (1).new Vue时候配置el属性。 (2).先创建Vue实例,随后再通过vm.$mount('#root')指定el的值。2.data有2种写法 (1).对象式 (2).函数式如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式,否则会报错。3.一个重要的原则:由Vue管理的函数,一定不要写箭头函数,一旦写了箭头函数,this就不再是Vue实例了。MVVM模型M:模型(Model) :data中的数据V:视图(View) :模板代码VM:视图模型(ViewModel):Vue实例观察发现: 1.data中所有的属性,最后都出现在了vm身上。 2.vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)1.Vue中的数据代理: 通过vm对象来代理data对象中属性的操作(读/写)2.Vue中数据代理的好处: 更加方便的操作data中的数据3.基本原理: 通过Object.defineProperty()把data对象中所有属性添加到vm上。 为每一个添加到vm上的属性,都指定一个getter/setter。 在getter/setter内部去操作(读/写)data中对应的属性。事件的基本使用:1.使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名; 2.事件的回调需要配置在methods对象中,最终会在vm上; 3.methods中配置的函数,不要用箭头函数!否则this就不是vm了; 4.methods中配置的函数,都是被Vue所管理的函数,this的指向是vm 或 组件实例对象; 5.@click="demo" 和 @click="demo($event)" 效果一致,但后者可以传参;Vue中的事件修饰符:1.prevent:阻止默认事件(常用); 2.stop:阻止事件冒泡(常用); 3.once:事件只触发一次(常用); 4.capture:使用事件的捕获模式; 5.self:只有event.target是当前操作的元素时才触发事件; 6.passive:事件的默认行为立即执行,无需等待事件回调执行完毕;键盘事件1.Vue中常用的按键别名: 回车 => enter 删除 => delete (捕获“删除”和“退格”键) 退出 => esc 空格 => space 换行 => tab (特殊,必须配合keydown去使用) 上 => up 下 => down 左 => left 右 => right 2.Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要转为kebab-case(短横线命名) 3.系统修饰键(用法特殊):ctrl、alt、shift、meta (1).配合keyup使用:按下修饰键的同时,再按下其他键,随后释放其他键,事件才被触发。 (2).配合keydown使用:正常触发事件。 4.也可以使用keyCode去指定具体的按键(不推荐) 5.Vue.config.keyCodes.自定义键名 = 键码,可以去定制按键别名计算属性:1.定义:要用的属性不存在,要通过已有属性计算得来。 2.原理:底层借助了Objcet.defineproperty方法提供的getter和setter。 3.get函数什么时候执行? (1).初次读取时会执行一次。 (2).当依赖的数据发生改变时会被再次调用。 4.优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。 5.备注: 1.计算属性最终会出现在vm上,直接读取使用即可。 2.如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。监视(侦听)属性watch:1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作 2.监视的属性必须存在,才能进行监视!! 3.监视的两种写法: (1).new Vue时传入watch配置 (2).通过vm.$watch监视深度监视:(1).Vue中的watch默认不监测对象内部值的改变(一层)。 (2).配置deep:true可以监测对象内部值改变(多层)。 备注: (1).Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以! (2).使用watch时根据数据的具体结构,决定是否采用深度监视。computed和watch之间的区别: 1.computed能完成的功能,watch都可以完成。 2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。 两个重要的小原则: 1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。 2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。 绑定样式:class样式 写法:class="xxx" xxx可以是字符串、对象、数组。 字符串写法适用于:类名不确定,要动态获取。 对象写法适用于:要绑定多个样式,个数不确定,名字也不确定。 数组写法适用于:要绑定多个样式,个数确定,名字也确定,但不确定用不用。style样式 :style="{fontSize: xxx}"其中xxx是动态值。 :style="[a,b]"其中a、b是样式对象。条件渲染:1.v-if 写法: (1).v-if="表达式" (2).v-else-if="表达式" (3).v-else="表达式" 适用于:切换频率较低的场景。 特点:不展示的DOM元素直接被移除。 注意:v-if可以和:v-else-if、v-else一起使用,但要求结构不能被“打断”。2.v-show 写法:v-show="表达式" 适用于:切换频率较高的场景。 特点:不展示的DOM元素未被移除,仅仅是使用样式隐藏掉3.备注:使用v-if的时,元素可能无法获取到,而使用v-show一定可以获取到。v-for指令: 1.用于展示列表数据 2.语法:v-for="(item, index) in xxx" :key="yyy" 3.可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)*面试题:react、vue中的key有什么作用?(key的内部原理)虚拟DOM中key的作用: key是虚拟DOM对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟DOM】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下: 2.对比规则: (1).旧虚拟DOM中找到了与新虚拟DOM相同的key: ①.若虚拟DOM中内容没变, 直接使用之前的真实DOM! ②.若虚拟DOM中内容变了, 则生成新的真实DOM,随后替换掉页面中之前的真实DOM。 (2).旧虚拟DOM中未找到与新虚拟DOM相同的key 创建新的真实DOM,随后渲染到到页面。用index作为key可能会引发的问题: 1. 若对数据进行:逆序添加、逆序删除等破坏顺序操作: 会产生没有必要的真实DOM更新 ==> 界面效果没问题, 但效率低。 2. 如果结构中还包含输入类的DOM: 产生错误DOM更新 ==> 界面有问题。开发中如何选择key?: 1.最好使用每条数据的唯一标识作为key, 比如id、手机号、身份证号、学号等唯一值。 2.如果不存在对数据的逆序添加、逆序删除等破坏顺序操作,仅用于渲染列表用于展示,用index作为key是没有问题的。Vue监视数据的原理:vue会监视data中所有层次的数据。如何监测对象中的数据? 通过setter实现监视,且要在new Vue时就传入要监测的数据。 (1).对象中后追加的属性,Vue默认不做响应式处理 (2).如需给后添加的属性做响应式,请使用如下API: Vue.set(target,propertyName/index,value) 或 vm.$set(target,propertyName/index,value)如何监测数组中的数据? 通过包裹数组更新元素的方法实现,本质就是做了两件事: (1).调用原生对应的方法对数组进行更新。 (2).重新解析模板,进而更新页面。4.在Vue修改数组中的某个元素一定要用如下方法: 1.使用这些API:push()、pop()、shift()、unshift()、splice()、sort()、reverse() 2.Vue.set() 或 vm.$set()特别注意:Vue.set() 和 vm.$set() 不能给vm 或 vm的根数据对象 添加属性!!!收集表单数据:若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。 若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值。 若:<input type="checkbox"/> 1.没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,是布尔值) 2.配置input的value属性: (1)v-model的初始值是非数组,那么收集的就是checked(勾选 or 未勾选,是布尔值) (2)v-model的初始值是数组,那么收集的的就是value组成的数组备注:v-model的三个修饰符: lazy:失去焦点再收集数据 number:输入字符串转为有效的数字 trim:输入首尾空格过滤过滤器:定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理)。 语法: 1.注册过滤器:Vue.filter(name,callback) 或 new Vue{filters:{}} 2.使用过滤器:{{ xxx | 过滤器名}} 或 v-bind:属性 = "xxx | 过滤器名"备注: 1.过滤器也可以接收额外参数、多个过滤器也可以串联 2.并没有改变原本的数据, 是产生新的对应的数据我们学过的指令: v-bind : 单向绑定解析表达式, 可简写为 :xxx v-model : 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on : 绑定事件监听, 可简写为@ v-if : 条件渲染(动态控制节点是否存存在) v-else : 条件渲染(动态控制节点是否存存在) v-show : 条件渲染 (动态控制节点是否展示)v-text指令: 1.作用:向其所在的节点中渲染文本内容。 2.与插值语法的区别:v-text会替换掉节点中的内容,{{xx}}则不会。v-html指令: 1.作用:向指定节点中渲染包含html结构的内容。 2.与插值语法的区别: (1).v-html会替换掉节点中所有的内容,{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意:v-html有安全性问题!!!! (1).在网站上动态渲染任意HTML是非常危险的,容易导致XSS攻击。 (2).一定要在可信的内容上使用v-html,永不要用在用户提交的内容上!v-cloak指令(没有值): 1.本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。 2.使用css配合v-cloak可以解决网速慢时页面展示出{{xxx}}的问题。v-once指令: 1.v-once所在节点在初次动态渲染后,就视为静态内容了。 2.以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。v-pre指令: 1.跳过其所在节点的编译过程。 2.可利用它跳过:没有使用指令语法、没有使用插值语法的节点,会加快编译。定义全局指令Vue.directive('fbind',{ //指令与元素成功绑定时(一上来) bind(element,binding){ element.value = binding.value }, //指令所在元素被插入页面时 inserted(element,binding){ element.focus() }, //指令所在的模板被重新解析时 update(element,binding){ element.value = binding.value } }) 生命周期: 1.又名:生命周期回调函数、生命周期函数、生命周期钩子。 2.是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。 3.生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。 4.生命周期函数中的this指向是vm 或 组件实例对象。常用的生命周期钩子:1.mounted: 发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】。2.beforeDestroy: 清除定时器、解绑自定义事件、取消订阅消息等【收尾工作】。 关于销毁Vue实例 1.销毁后借助Vue开发者工具看不到任何信息。 2.销毁后自定义事件会失效,但原生DOM事件依然有效。 3.一般不会在beforeDestroy操作数据,因为即便操作数据,也不会再触发更新流程了。Vue中使用组件的三大步骤: 一、定义组件(创建组件) 二、注册组件 三、使用组件(写组件标签)一、如何定义一个组件? 使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;区别如下: 1.el不要写,为什么? ——— 最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。 2.data必须写成函数,为什么? ———— 避免组件被复用时,数据存在引用关系。备注:使用template可以配置组件结构。二、如何注册组件? 1.局部注册:靠new Vue的时候传入components选项 2.全局注册:靠Vue.component('组件名',组件)三、编写组件标签: <school></school>几个注意点:1.关于组件名:一个单词组成: 第一种写法(首字母小写):school 第二种写法(首字母大写):School多个单词组成: 第一种写法(kebab-case命名):my-school 第二种写法(CamelCase命名):MySchool (需要Vue脚手架支持)备注: (1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。 (2).可以使用name配置项指定组件在开发者工具中呈现的名字。2.关于组件标签: 第一种写法:<school></school> 第二种写法:<school/>备注:不用使用脚手架时,<school/>会导致后续组件不能渲染。3.一个简写方式: const school = Vue.extend(options) 可简写为:const school = options关于VueComponent: 1.school组件本质是一个名为VueComponent的构造函数,且不是程序员定义的,是Vue.extend生成的。 2.我们只需要写<school/>或<school></school>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行的:new VueComponent(options)。 3.特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent!!!! 4.关于this指向: (1).组件配置中: data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】。 (2).new Vue(options)配置中: data函数、methods中的函数、watch中的函数、computed中的函数 它们的this均是【Vue实例对象】。 5.VueComponent的实例对象,以后简称vc(也可称之为:组件实例对象)。 Vue的实例对象,以后简称vm。一个重要的内置关系1.一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype 2.为什么要有这个关系:让组件实例对象(vc)可以访问到 Vue原型上的属性、方法。
2021年11月16日
17 阅读
4 评论
0 点赞
2021-11-16
JS 常用方法集合
除数取整:1.只保留整数部分:parseInt(5/2) 2.向上取整,有小数就整数部分加1:Math.ceil(5/2) 3.四舍五入:Math.round(9/2) 4.向下取整:Math.floor(5/2)大小写:1.使字符串全部变为小写:toLowerCase() \ toLocaleLowerCase() 2.使全部字符变为大写:toUpperCase() \ toLocaleUpperCase()字符串相关1.返回指定索引的字符:charAt() 2.字符串拼接:concat() 3.取从第几位到指定长度的字符串:substr() var stringValue = "hello world"; console.log(stringValue.substr(3)); //"lo world" console.log(stringValue.substr(3,7)); //"lo worl" 4.取介于两个指定下标之间的字符串:substring() var stringValue = "hello world"; console.log(stringValue.substring(3)); //"lo world" console.log(stringValue.substring(3,7)); //"lo w" 5.返回一个新的数组,介于两个指定下标之间的字符串:slice() var stringValue = "hello world"; console.log(stringValue.slice(3)); //"lo world" console.log(stringValue.slice(3,7)); //"lo w" 6.返回子字符串的位置(没有找到返回-1):首次的位置:IndexOf、最后的位置:lastIndexOf var stringValue = "hello world"; console.log(stringValue.indexOf("o")); //4 console.log(stringValue.lastIndexOf("o")); //7 7. 删除头尾的空格:trim() 8.检索指定的值:match() var str1 = "lixiaoqi"; console.log(str1.match('iao')); //检索字符串,返回的是字符 console.log(str1.match('lll')); //没有指定的字符,返回的是null 9.返回指定的第一个匹配项的索引(未检测到返回-1):search() 10.替换现有字符串:.replace() 11.把字符串分割成字符串数组:split(分隔符)数组相关1. 返回从原数组中指定开始下标到结束下标之间的项组成的新数组(原数组不变):slice() var arr = [1,2,3,4,5,6,7,8]; console.log(arr.slice(4)); //从4开始到结束 [5, 6, 7, 8] console.log(arr.slice(2,6));//数组下表从0开始,从2开始,到6的前一个位置结束 [3, 4, 5, 6] 2.splice() 删除(2个参数,起始位置,删除的项数) 插入(3个参数,起始位置,删除的项数,插入的项) 替换(任意参数,起始位置,删除的项数,插入任意数量的项数) var arr = [1,2,3,4,5]; console.log(arr.slice(2,3)); // 实际得到的新数组的项数是end-strat [3] console.log(arr.slice(1,5)); // [2, 3, 4, 5] 3.将参数添加到数组的最后,返回新数组的长度:push() var arr = [1,2,3,4,5]; console.log(arr.push(6,7,8)); // 返回的是新数组的长度 8 4.删除数组的最后一个元素,返回被删除的值(减少数组的长度):pop() var arr = ['a', 'b', 'c', 'd', 'e']; console.log(arr.pop()); // e console.log(arr.length); // 4 5.向数组的开头添加一个或多个的元素,并返回新的长度:unshift() var arr = [1,2,3,4,5]; console.log(arr.unshift(2,4,5,{name:'liqi'})); //返回的是新数组的长度 9 6.删除数组的第一个参数,数组的长度减1:shift() var arr = ['a', 'b', 'c', 'd', 'e']; console.log(arr.shift()); // 返回的是删除的数组的值 a 7.按指定的参数对数组进行排序,返回的值是经过排序后的数组: sort() var arr = [1,'q',3,6,2,'a',9]; console.log(arr.sort()); // 返回的是排序后的数组 [1, 2, 3, 6, 9, "a", "q"] 8.将数组中的元素进行反转,倒序显示:reverse() var arr = [1,2,3,4,5] console.log(arr.reverse()); // [5, 4, 3, 2, 1] 9.把两个字符串连接起来,返回的值是一个副本:concat(a, b) var arr1 = [1,'q',3,6,2,'a',9]; console.log(arr1.concat('-', arr1)); //新创建一个数组,原数组不变 [1, "q", 3, 6, 2, "a", 9, "-", 1, "q", 3, 6, 2, "a", 9] console.log(arr1); //原数组不变 [1,'q',3,6,2,'a',9] 10.用分隔符将数组的元素组成一个字符串:join() var arr1 = [1,'q',3,6,2,'a',9]; console.log(arr1.join(',')); //以逗号分隔 1,q,3,6,2,a,9 console.log(arr1.join(' ')); //以空格分隔 1 q 3 6 2 a 9 11.从数组的开头向后查找,(接受两个参数,要查找的项和查找起点的位置索引):indexOf() var arr = [1,2,3,4,5,6,78]; console.log(arr.indexOf(78, 2)); // 查找78所在的位置,返回的项的索引 6 console.log(arr.indexOf(3, 1)); // 2 console.log(arr.indexOf(2)); // 1 12.从数组末尾开始获取:lastIndexof() 13.遍历数组:for var arr = [1, 4, 9, 16]; for (var i = 0; i < arr.length; i++){ console.log(arr[i]); } 14.对数组的每个元素执行一次提供的函数:foeEach() var arr = ['a', 'b', 'c']; arr.forEach(function(item) { console.log(item); // a // b // c }); 15.对数组的每一项运行给定的函数,返回没戏函数调用的结果组成的数组:map() var arr = [1, 4, 9, 16]; console.log(arr.map(x => x * 2)); //对数组的每项*2 [2, 8, 18, 32] 16.通过检查指定数组中符合条件的所有元素(不会改变原始数组):filter() var arr = [1,12,7,8,5] function fn(i) { return i > 5; } console.log(arr.filter(fn)); // [12, 7, 8] 17.把数组转换成字符串,每一项用,分割:toString() var arr = [1,2,3,4,5] console.log(arr.toString()); // 1,2,3,4,5 18.every和some every 是所有函数的每个回调都返回 true 的时候才会返回 true,当遇到 false 的时候终止执行,返回 false。 some 函数是存在有一个函数返回 true 的时候终止执行并返回 true,否则返回 false。 // every var arr = [1,6,8,-2,-5,7,-4] var isPositive = arr.every(function(value){ return value > 0; }) console.log(isPositive) // false //some var arr = [1,6,8,-2,-5,7,-4] var isPositive = arr.some(function(value){ return value > 0; }) console.log(isPositive) // true 19.reduce(function(v1,v2),value) 和 reduceRight(functio(v1,v2),value) 遍历数组,调用回调函数,将数组元素组合成一个值,reduce 从索引最小值开始,reduceRight 反向,方法有两个参数(回调函数,把两个值合成一个,返回结果;value,一个初始值,可选) var arr = [1,2,3,4,5,6] console.log(arr.reduce(function(v1,v2){ return v1 + v2; })) // 21 //开始是1+2 = 3,之后3+3 =6,之后6+4 =10,之后 //10+5 =15,最后15+6 =21 console.log(arr.reduce(function(v1,v2){ return v1 - v2; },100)) // 79 //开始的时候100-1=99,之后99-2=97,之后97-3=94,之后 //94-4=90,之后90-5=85,最后85-6=79 20.判断一个对象是否为数组:isArray() var arr = [3,4,5] console.log(Array.isArray(arr)); // trueMathMath本身就是一个对象, 不需要在通过构造函数去创建, 该对象中集合了很多关于数学运算的方法 Math.abs() 获取一个对象的绝对值 Math.round() 四舍五入 Math.PI π Math.max() 求几个数的最大数 Math.min() 求几个数的最小数 Math.ceil() 向上取整 Math.floor() 向下取整 Math.random() 随机数 (随机生成0 ~1之间的数)JS选取DOM元素的方法注意:原生JS选取DOM元素比使用jQuery类库选取要快很多1、通过ID选取元素 document.getElementById('myid'); 2、通过CLASS选取元素 document.getElementsByClassName('myclass')[0]; 3、通过标签选取元素 document.getElementsByTagName('mydiv')[0]; 4、通过NAME属性选取元素(常用于表单) document.getElementsByName('myname')[0]; JS修改CSS样式 document.getElementById('myid').style.display = 'none'; JS修改CLASS属性 document.getElementById('myid').className = 'active'; 如果有多个CLASS属性,即用空格隔开 document.getElementById('myid').className = 'active div-1'; 移除该元素上的所有CLASS document.getElementById('myid').className = ''; 注意:使用classList会优于使用className 复制代码 document.getElementById('myid').classList.item(0); //item为类名的索引 document.getElementById('myid').classList.length; //只读属性 document.getElementById('myid').classList.add('newClass'); //添加class document.getElementById('myid').classList.remove('newClass'); //移除class document.getElementById('myid').classList.toggle('newClass'); //切换,有则移除,没有则添加 document.getElementById('myid').classList.contains('newClass'); //判断是否存在该class补充:add和remove方法不允许链式操作,因为返回的都是undefined,其次,也不允许同时添加或删除多个class,可以自行扩展一下JS修改文本document.getElementById('myid').innerHTML = '123'; JS创建元素并向其中追加文本 var newdiv = document.createElement('div'); var newtext = document.createTextNode('123'); newdiv.appendChild(newtext); document.body.appendChild(newdiv); 同理:removeChild()移除节点,并返回节点 cloneNode() 复制节点 insertBefore() 插入节点(父节点内容的最前面)注意:insertBefore() 有两个参数,第一个是插入的节点,第二个是插入的位置追加元素的几种方法:1.在父级最前面追加一个子元素:prepend() $('#page ul').prepend('<li id="prevPage">上一页</li>'); 2.在父级最后面追加一个子元素:append() $('#page ul').append('<li id="nextPage">下一页</li>'); 3.将子元素追加到父级的最前面:prependTo() $("<li id="prevPage">上一页</li>").prependTo($("#page ul")); 4.将子元素追加到父级的最后:appendTo() $("<li id="nextPage">下一页</li>").appendTo($("#page ul")); 5.在当前元素之前追加(是同级关系):before() $("#wrap").before("<p class='siblings'>我是同级元素before</p>"); 6.在当前元素之后追加(是同级关系):after() $("#wrap").after("<p class='siblings'>我是同级元素after</p>"); 7.将元素追加到指定对象的前面(是同级关系):insertBefore() $("<p class='three'>我是同级元素insertBefore</p>").insertBefore($("#wrap")); 8.将元素追加到指定对象的后面(是同级关系):insertAfter() $("<p class='three'>我是同级元素insertAfter</p>").insertAfter($("#wrap")); 9.在节点的最后追加子元素:appendChild() // 创建script标签 var script = document.createElement('script'); // 设置src属性 script.src = 'http://localhost:3001/better?callback=fn2'; // 将script标签追加到页面中 document.body.appendChild(script); // 或者 // 创建p节点 var para = document.createElement("p"); // 创建文本节点 var node = document.createTextNode("我是子集appendChild新段落。"); // 把文本节点添加到p节点里 para.appendChild(node); // 查找div var element = document.getElementById("wrap"); // 把p节点添加到div1里 element.appendChild(para); JS返回所有子节点对象 childNodes firstChild 返回第一个子节点 lastChild 返回最后一个子节点 parentNode 返回父节点对象 nextSibling 返回下一个兄弟节点对象 previousSibling 返回前一个兄弟节点对象 nodeName 返回节点的HTML标记名称 var mylist = document.getElementById('myid'); for(var i=0,i<mylist.childNodes.length;i++){ console.log(mylist.childNodes[i]); }常用的封装好的方法:1、n-m之间的随机数 function numRandom(n, m) { if (n > m) { return parseInt(m + Math.random() * (n - m + 1)); } else { return parseInt(n + Math.random() * (m - n + 1)); } } 2、时间过滤器 yyyy-mm-dd hh:mm:ss filters = (data) =>{ var time = new Date(data); var timeStr = time.getFullYear()+"-"+ (time.getMonth()+1).toString().padStart(2,"0")+"-"+ time.getDate().toString().padStart(2,"0")+ " "+ time.getHours().toString().padStart(2,"0")+":"+ time.getMinutes().toString().padStart(2,"0")+":"+ time.getSeconds().toString().padStart(2,"0"); return timeStr; } function formatDate(date) { var year = date.getFullYear(); var month = date.getMonth() + 1; var day = date.getDate(); var hour = date.getHours(); var minute = date.getMinutes(); var second = date.getSeconds(); // return year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second; return year + '-' + (String(month).length > 1 ? month : '0' + month) + '-' + (String(day).length > 1 ? day : '0' + day) + ' ' + (String(hour).length > 1 ? hour : '0' + hour) + ':' + (String(minute).length > 1 ? minute : '0' + minute) + ':' + (String(second).length > 1 ? second : '0' + second) } //如果记得时间戳是毫秒级的就需要*1000 不然就错了记得转换成整型 var d = new Date(); //Tue Mar 26 2019 05:00:00 GMT+0800 (中国标准时间) console.log(formatDate(d)) //2019-03-26 05:00:00 3、返回顶部通用方法 function backTop(btnId) { var btn = document.getElementById(btnId); var d = document.documentElement; var b = document.body; window.onscroll = set; btn.style.display = "none"; btn.onclick = function () { btn.style.display = "none"; window.onscroll = null; this.timer = setInterval(function () { d.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1); b.scrollTop -= Math.ceil((d.scrollTop + b.scrollTop) * 0.1); if (d.scrollTop + b.scrollTop == 0) clearInterval(btn.timer, (window.onscroll = set)); }, 10); }; function set() { btn.style.display = d.scrollTop + b.scrollTop > 100 ? "block" : "none"; } } backTop("goTop");对象Object构造方法Object.assign()将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。 Object.create()用指定的原型对象和属性创建一个新对象。 Object.defineProperty()将给定描述符描述的命名属性添加到对象。 Object.defineProperties()将给定描述符描述的命名属性添加到对象。 Object.entries()返回一个包含[key, value]给定对象自己的可枚举字符串属性的所有对的数组。 Object.freeze()冻结对象。其他代码无法删除或更改其属性。 Object.fromEntries()从可迭代的[key, value]对中返回一个新对象。(这是的反向 Object.entries)。 Object.getOwnPropertyDescriptor()返回对象的命名属性的属性描述符。 Object.getOwnPropertyDescriptors()返回一个包含对象自身所有属性描述符的对象。 Object.getOwnPropertyNames()返回一个数组,其中包含给定对象自己的所有可枚举和不可枚举属性的名称。 Object.getOwnPropertySymbols()返回直接在给定对象上找到的所有符号属性的数组。 Object.getPrototypeOf()返回prototype指定对象的。 Object.is()比较两个值是否相同。求所有NaN值(不同于“抽象相等比较”和“严格相等比较”)。 Object.isExtensible()确定是否允许扩展对象。 Object.isFrozen()确定对象是否冻结。 Object.isSealed()确定对象是否密封。 Object.keys()返回一个数组,其中包含给定对象自己的所有可枚举字符串属性的名称。 Object.preventExtensions()防止对象的任何扩展。 Object.seal()防止其他代码删除对象的属性。 Object.setPrototypeOf()设置对象的原型(其内部[[Prototype]]属性)。 Object.values()返回一个数组,该数组包含与给定对象自己的所有可枚举字符串属性相对应的值。更改数组对象中属性的参数名: let data1 = [ { appName: "应用1", capacity: 233456 }, { title: "应用2", key: 124535 } ]; let data2 = []; data1.forEach(item => { data2.push({ name: item.appName || item.title, value: item.capacity || item.key }); }); console.log(data2)
2021年11月16日
7 阅读
2 评论
0 点赞
2021-10-11
模板引擎
1. 模板引擎文档:http://aui.github.io/art-template/zh-cn/Github: https://github.com/aui/art-template1.1 Ajax 项目中存在的问题数据和HTML字符串拼接导致代码混乱,拼接容易出错,增加修改难度。业务逻辑和用户界面混合,代码不易维护。for (var i = 0; i < result.length; i++) { html += '<!DOCTYPE html>\ <html lang="en">\ <head>\ <meta charset="UTF-8">\ <title>'+ title +'</title>\ </head>\ <body>\ <h1 onclick="sayHi('+name+')">你好,'+name+' 我今年 '+age+'岁</h1>\ <ul>\ <li title="'+hobbies[0]+'">'+hobbies[0]+'</li>\ </ul>\ </body>\ </html>'; }1.2 模板引擎的作用使用模板引擎提供的模板语法可以使数据和HTML字符串拼接的更加美观,代码易于维护。模板引擎能够使用户界面的数据拼接和JavaScript业务逻辑分离,增加程序的可扩展性。使用模板引擎可以提高开发效率。<h1>你好, {{name}}, 我今年{{age}}岁</h1> <ul> {{each}} <li>{{$value.hobbies}}</li> {{/each}} </ul>1.3 模板渲染<script src="./js/template-web.js"></script> <script type="text/html" id="tpl"> <div> <span>{{name}}</span> <span>{{age}}</span> </div> </script> // 将特定模板与特定数据进行拼接 const html = template('tpl',{ name: '张三', age: 20 }); 2. 模板语法模板语法的作用是告诉模板引擎数据和模板要如何进行拼接。2.1 输出将数据显示在模板中。 <h2>{{value}}</h2> <h2>{{a ? b : c}}</h2> <h2>{{a + b}}</h2>2.2 原文输出如果数据中携带HTML标签,默认情况下,模板引擎不会解析标签,会将其转义后原文输出。<h2>{{@ value }}</h2>2.3 条件判断 {{if 条件}} ... {{/if}} {{if v1}} ... {{else if v2}} ... {{/if}}{{if 条件}} <div>条件成立 显示我</div> {{else}} <div>条件不成立 显示我</div> {{/if}}2.4 循环 {{each target}} {{$index}} {{$value}} {{/each}}2.5 导入模板变量<div>$imports.dataFormat(time)</div>template.defaults.imports.变量名 = 变量值; $imports.变量名称function dateFormat(未格式化的原始时间){ return '已经格式化好的当前时间' } template.defaults.imports.dateFormat = dateFormat;总结<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <!-- 1. 将模板引擎的库文件引入到当前页面 --> <script src="/js/template-web.js"></script> </head> <body> <div id="container"></div> <!-- 2.准备art-template模板 --> <script type="text/html" id="tpl"> <h1>{{username}} {{age}}</h1> </script> <script type="text/javascript"> // 3.告诉模板引擎将那个数据和哪个模板进行拼接 // 1) 模板id 2)数据 对象类型 // 方法的返回值就是拼接好的html字符串 var html = template('tpl', {username: 'zhangsan', age: 30}); document.getElementById('container').innerHTML = html; </script> </body> </html>
2021年10月11日
5 阅读
0 评论
0 点赞
1
2
3
4
...
8