js学习笔记--问题记录

js

代码执行

暴露在脚本块中的程序,在页面打开的时候执行,
并且遵守自上而下的顺序依次逐行执行,(这个代码的执行不需要事件)
引入外部独立的js文件的时候,js文件中的内容,会遵循自上而下的方式依次逐行执行

概念

全局变量:
在函数体之外的声明变量属于全局变量,全局变量的声明周期是:
浏览器打开时声明,浏览器关闭时销毁,尽量少用。因为全局变量
会一直在浏览器的内存当中,耗费内存空间
能使用局部变量尽量使用局部变量。

局部变量:
在函数体当中声明的变量,包括一个函数的形参都属于局部变量,
局部变量的声明周期是:函数开始执行时局部变量的内存空间开辟,函数执行结束之后,局部变量的内存空间释放。
局部变量声明周期较短。

事件

(1)blur 失去焦点
(2)change下拉列表选中项改变,或文本框内容改变
(3)click 鼠标单击
(4)dbclick 鼠标双击
(5)focus 获得焦点
(6)keydown键盘按下
(7)keyup键盘弹起
(8)load页面加载完毕
(9)mousedown鼠标按下
(10)mouseover鼠标经过
(11)mousemove鼠标移动
(12)mouseout鼠标离开
(13)mouseup鼠标弹起
(14)reset 表单重置
(15)select 文本被选定
(16)submit 表单提交

任何一个事件都会对应一个事件句柄,在事件前加on
事件句柄以属性的形式存在。

正则表达式

常见的正则表达式符号

		. 匹配除换行符以外的任意字符
		\w 匹配字母或者数字或者下划线或者汉字
		\s匹配任意的空白字符
		\d匹配单词的开始或结束
		^ 匹配字符串的开始
		$ 匹配字符串的结束。
		*重复零次或更多次
		+重复一次或更多次
		?重复零次或一次
		{n} 重复n次
		{n,} 重复n次或者更多次
		{n,m} 重复n到m次 
			
		\大写字母 (否定)
		[^x]
		{^aeiou} 	

第一种方式:

			var r =/正则表达式/flags;

第二种方式:(使用内置支持类)

			var r =new RegExp("正则表达式","flags");
			
			关于flags :
				g:全局变量
				i:忽略大小写
				m:多行搜索。前面是正则表达式时,m不能使用,只是前面是普通字符串的时候,m可以使用,

正则表达式的test()方法

			true/false =正则表达式对象.test(用户的字符串).

注意

window.alert(“hello world”); //alert函数会阻塞整个页面的加载。

vue

vue的缩略图:vue-preview

编程式导航

  网页中有两种跳转方式:

  1. 使用a标签的形式,标签跳转
  2. 使用js脚本条状,window.location.href,变成跳转

路由跳转:

 this.$router.push('/home/goodsinfo/' + id);
 // 也可以传递对象
this.$router.push({path:"'/home/goodsinfo/' + id"});
//传递路由和参数
 this.$router.push({name:"goodsinfo",param:{id:id}});

需要区分 r o u t e 和 route和 routerouter:

  1. this.$route 是路由参数对象,所有路由中的参数,包括params和query都属于他。
  2. this.$router 是路由导航对象,用它可以使用js代码实现路由的前进和后退,跳转到url地址。

码云提交代码

git add .
git commit -m “第四天,打卡”
git push

vuex

vuex 是一个专为vue.js应用程序开发的状态管理模式(公共数据管理工具),为保存组件之间的共享数据诞生的,共享的数据可以放到vuex内部,相当于一个共享仓库。

安装:

npm install vuex -D
或者 npm install vuex --save

导入、注册 vuex包

import Vuex from 'vuex'
Vue.use(Vuex)

创建vuex数据仓储对象

var store = new Vuex.store({
	state:{
		//类似vue中的data,用于存储数据
		count:0
	},
	mutations:{
		//类似vue中的methods
		increment(state){
			state.count++
		},
		substrace(state,obj){
			state.count-=(obj.a + obj.b);
		}
	},
	getters:{
		// 只负责对外提供数据,不能修改数据,修改的需要在mutation中
		// 使用$store.getters.optCount
		optCount:function(state){
			return '当前最新的count值:' + state.count;
		}
	}
})

在vue中引用

var vm = new Vue({
	el:'#app',
	data:{
		msg1:'welcome',
	},
	store:store,
})

如果在组件中访问store中的数据,需要通过 this.$store.state.XXX 的方式

如果vuex创建的store挂载到了vm实例上,只要挂载到了vm上,就能全局访问,$store.state
如:

<h3>总数量:{{$store.state.count}}</h3>

<script>
export default {
    methods:{
        plus(){
            this.$store.state.count++;
        }
    }
}
</script>

如果要操作state中的值,推荐通过mutation里面的方法操作,防止数据紊乱
this.$store.commit(‘方法名称’),默认第一个参数为state
例如上面的方法修改为:

plus(){
            // this.$store.state.count++;
            this.$store.commit('increment')
        },

mutations中的函数参数列表中最多支持两个参数,即支持传入一个参数2,可通过对象的方式传入多个参数

methods:{
        plus(){
            // this.$store.state.count++;
            this.$store.commit('increment')
        },
        minus(){
            var obj = {
                a:2,
                b:1
            }
           this.$store.commit('substrace',obj);
        }
    }

访问时,可以使用如下方式:

<h3>{{$store.getters.optCount}}</h3>

总结:

  1. state中的数据最好不要修改,如果修改可通过mutations中的方法
  2. 如果组件想要从state中获取数据,同故宫this.$store.state.xxx
  3. 通过组件修改数据同故宫mutations的方法,this.$store.commit(‘方法名’)
  4. 如果需要对获取的数据进行统一包装,可以使用getters
  5. 使用getters,可以通过this.$store.getter.***方法

移除监听window resize事件,debounce

连接地址

mounted() {
  window.addEventListener('resize', this.resize, true)
},
beforeDestroy() {
  window.removeEventListener('resize', this.resize, true)
},
methods: {
  resize: debounce(function() {
   this.radarChart.resize()
  }, 300),
 }

socketio

总是提示跨域问题,解决:
var io = require('socket.io')(http, { cors: true });后面的参数{ cors: true }是关键,
后台代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http, { cors: true });

app.get('/', function(req, res){
    res.send('<h1>你好web秀</h1>');
});

io.on('connection',function(socket) {
    console.log("有人链接");
    //接收数据
    socket.on('send', function (data) {
        console.log(data);
        // 发送数据
        socket.emit('resend', {
            msg: `你好${data.msg}`,
            code: 200
        });
    });
});

http.listen(3000, function(){
    console.log('listening on *:3000');
});

原文链接:https://blog.csdn.net/weixin_44827418/article/details/122409863
前端

<template>
  <div class="hello">
    <input type="text" v-model="msg">
    <button @click="sendMsg">发送</button>
  </div>
</template>

<script>
import io from 'socket.io-client'
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
  mounted () {
    const socket = io('ws://localhost:3000')
    this.socket = socket
    window.socket = socket
    socket.on('connect', function () {
      console.log('连接建立成功了!')
    })
    socket.on('disconnect', function () {
      console.log('断开连接了')
    })
    socket.on('resend', function (data) {
      console.log(data)
    })
  },
  methods: {
    sendMsg () {
      // 发送信息给服务端
      this.socket.emit('send', {
        msg: this.msg
      })
    }
  }
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>


映射外网

可以使用ngrok将本机映射为一个外网的web服务器
(使用美国的服务器,所以比较慢)

ngrok	http 80

使用http方式启动,映射本机80端口

复选框手动选中触发事件写法

$('#id').prop('checked',true).change();

bootstrap table中selectpicker在表内的解决

现象:在这里插入图片描述
表格内容填充样式,下拉框的选项在表格内显示
我解决的方法,修改表格的样式,去除overflow auto:

$('#newUserTableContainer .fixed-table-body').css('overflow-x','visible')
$('#newUserTableContainer .fixed-table-body').css('overflow-y','visible')

效果:
在这里插入图片描述
我想要的效果。

bootstrapValidator 校验红框样式模态窗中不清除

现象:模态窗中有复选框和相应要校验的输入内容,勾选时校验,取消勾选时不校验,如下:

 $('#checkbox').change(function(){
     $('#From').bootstrapValidator('addField',$('#input'),{
         validators: {
             notEmpty: {
                 message: '不能为空'
             }
         }
 	});
 	if(!$('#checkbox').is(':checked')){//没有勾选
    	$('#From').bootstrapValidator('removeField',$('#input'));
    }
})

如果取消勾选 ,关闭弹窗后,再次打开,之前校验的样式还在。

解决方法:清空校验前,先把对应字段添加上

var param;
$('#Dialog').on('hidden.bs.modal',param, function (event) {
    $('#From').bootstrapValidator('addField',$('#input'),{});//校验内容貌似可以不写
    $("#From").data('bootstrapValidator').destroy();
    $('#From').data('bootstrapValidator',null);    
})

点击事件执行了两遍

这里主要记录下思路,原因是自己使用$('#button').click(function(){})注册点击事件写到了函数中,而此函数被重复调用,相当于注册了两遍,导致了此现象,可以修改逻辑,或者改成以下写法:

$("#button").unbind("click").click(function(){});

bootstrap Table 表头重复

现象:在tab标签页中有个表格,切换tab页时,表格经常会表头重复。
在这里插入图片描述
解决方法:查找了很多都不合适,参考模态窗中表格的解决方法,在tab事件中重置表格。

$('#myTab a[href="#sheet"]').on('shown.bs.tab', function (e) {
     $('#Table').bootstrapTable('resetView');
})

好像动态加载的样式都会收到隐藏的影响。

谷歌浏览器本地文件访问

记录下:右键点击chrome.exe,选择“创建快捷方式”或者“发送到”→“桌面快捷方式”),右键点击快捷方式,选择属性。 然后将“–enable-webgl --ignore-gpu-blacklist --allow-file-access-from-files”参数加到原来的参数后面

XMLHttpRequest请求发送JSON

注释的部分为常用的格式

var xmlhttp = new XMLHttpRequest();
xmlhttp.open('POST', url, true);
// xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// xmlhttp.send('datas=1');
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify(postData));

Unexpected token } in JSON at position 571

我遇到的是结尾前有个逗号,即最后一个属性后不可以加逗号

项目更新了node版本后

大概做了以下工作,防止以后忘了

  1. 删除了package.json 和 package-lock.json ,同样还有node_module
  2. 所以需要对应的npm initnpm install --D
  3. 但是还是没有解决对应的node版本,所以将本机的全局nodejs卸载后重新安装了对应版本的node
  4. 以上操作也解决了sqlite3的安装失败问题,以为之前是32位,现在换成了64位,感觉是安装时根据系统的node版本进行编译了,光是更换了项目中node.exe还是不够;
  5. 运行是不识别ejs,``npm install ejs --D";

vscode不进入断点,不打印信息

全局nodejs使用的8.12.0,更换为14.16.0后可以正常打印信息

heapdump安装

正常执行npm install heapdump --save
可能会报错提示: stack Error: Can’t find Python executable “python”
这是可以单独下载python2.7,应该是这个地址 ,然后配置系统环境变量:

  1. PYTHONPATH :值是安装目录,例如C:\Python27
  2. PYTHON :值是%PYTHONPATH%\python.exe
  3. 修改设置:npm config set python "C:\Python27\python.exe"

还有需要注意的是,项目运行的node版本和环境的版本最好一直,这样安装的才能使用。

JSON.parse unexpected 错误

  1. Unexpected token , in JSON at position ;最终结果是数据格式拼错误
var oridata = {
          "AVG" : -4.021018037335511e+32,
          "R" : 4.021426879624494e+33,
          "SD" : 1.271627581241022e+33,
          "T" : "2021-10-8 14:21:1.0",
          "V" : [
             -4.021217341801231e+33,
             7855378683396096.,
             -7679397230280704.,
             1.715589746709156e-06,
             -2.812386810279686e-26,
             -1.023335754305393e+28,
             -1708748175310848.,
             -2.720618786030415e-32,
             2.095378232633429e+29,
             6820374016.0
          ]
       }

其中的数组中有一个很大的数,导致拼接的时候小数点后没有数字

  1. 大佛寺

数据库

sqlserver2008 mdf过大

本以为删除表truncate table tableName后就会变小,结果并没有;
搜索后发现,需要右键数据库,任务,收缩,数据库,操作后,mdf变小了

sqlite插入字符串带单引号

INSERT INTO "Roles" (Name,ID) VALUES ('i am ''haha''',2)

用单引号将单引号包含起来
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值