第一周内容笔记基本使用鼠标滑过与否控制div大小变量与参数条件判断问题问题场景问题描述解决过程思考题第二周内容笔记点击不同按钮显示不同样式通过更换类名实现样式更改点击不同按钮更换对应颜色函数参数问题思考题问题内容解决过程第三周内容笔记点击弹出对应弹窗什么是行间事件扩展测试场景设想页面功能分析代码编写select知识点问题第四周内容笔记上课的内容关于2.4的一个神奇的解决办法js函数调用加括号和不加括号区别全选功能的实现通过标签名称获取一组元素for循环数组计算input标签的value属性课程案例JS操作元素内容和属性的两种办法js对象属性通过点(.) 和 方括号([]) 的不同之处表单元素与非表单元素内容修改的方法问题getElementsByTagName元素选取逻辑问题描述测试解决button标签和input标签type=“button”的区别问题描述解决方案第五周内容笔记上课的内容反选功能实现全选、不选和反选功能实现联动选择问题函数调用成功但是不执行问题描述解决过程问题总结第六周内容笔记form表单互相作用域submit刷新页面的问题实现选项卡JS数据类型与类型转换问题第七周内容第八周内容笔记函数参数返回值京东双色球问题双色球的实行思考试验场景实验过程实现输入框监听字符串比较百度联想实现从在线笔记到网站搭建初级——第三方平台说明codimd作业部落csdn/简书/博客园进阶——静态网站实现思路静态笔记实现vuepressHexoGitbook自己搭建笔记托管github/gitee+git第三方托管服务自己搭建服务器高级——动态网站网站模板开源项目个人开发个人开发在线笔记展示(原创)简介技术路线效果展示总结——从零到站长第九周内容笔记定时器基础内容自动播放选项卡问题第十周内容笔记JS的组成部分DOM常见操作DOM查询DOM增加DOM删除DOM修改操作元素内容和属性的两种办法上移下移功能的实现问题第十一周内容笔记留言板功能右下角悬浮框功能实现任务清单功能实现问题留言板扩展问题描述尝试解决判断是否是IE6问题描述解决过程第十二周内容笔记Ajax数据交互简介服务器环境搭建与配置Ajax交互流程和注意问题问题ajax缓存问题问题描述测试过程第十三周内容笔记使用Ajax获取数据并渲染跨域介绍jsonp问题


第一周

内容

笔记

基本使用

  • 利用document.getElementById('xxx')选中对应的元素

鼠标滑过与否控制div大小

  • onclick:点击
  • onmouseover:鼠标滑入
  • onmouseout:鼠标离开
  • 示例代码:

变量与参数

  • 定义
  • 调用

只调用不定义会存在相关问题

  • 变量的定义

条件判断

  • 判断div的状态并进行显示与隐藏的调整

问题

问题场景

  • 通过js判断语句实现元素显隐控制

问题描述

  • 为什么通过js第一次获取带的元素样式为空
  • 当不涉及到嵌套的判断语句的时候,效果显示是很正常的,但是通过控制台打印,输出的第一个对象是存在问题的(为空)!
  • 点击进行测试

image-20220310165449330

  • 代码如下
  • 进一步进行嵌套循环测试,核心js代码如下:
  • 这个时候,是不能实现显隐控制的,因为获取到的元素对应值为空,测试相关信息输出如下:

image-20220310165822872

  • 测试获取其他样式信息,即尝试获取元素宽高信息,核心代码如下:
  • 点击进行测试
  • 测试结果如下:

image-20220310170036682

解决过程

  • 通过上网查询,最终得知问题关键点在内联样式、内部样式与外部样式上!通过js只能获取到内联样式,但是我们代码编写的是内部样式,所以获取到的内容为空。
  • 小破站上面的课程内容是获取内联样式的方法,获取其他样式方法如下,进一步根据相关内容进行代码调整!

image-20220310170236839

  • 通过内部样式修改会涉及到一个问题就是由于js的特性,只能修改一些元素的属性,并不能直接修改内部样式(虽然查询到有类似setAttribute()、cssTest()方法,但是也只是操作对应元素的内联样式),所以同样要实现显隐的控制,就需要利用其他的办法,这里使用的办法是改变元素的样式类名(方法很多,列举其一),实现代码与效果图如下:
  • 点击进行测试

image-20220310170347171

  • 问题成功解决

思考题

第二周

内容

笔记

点击不同按钮显示不同样式

  • 利用document.body.style获取body标签样式
  • 其中注意:html内,子标签会继承父标签样式,所以这里设置body标签字体会影响div标签内的字体大小。
  • 点击进行测试
  • 完整代码:

通过更换类名实现样式更改

  • 太多样式属性的情况下,通过2.2.1中的方法更改将会非常繁杂,所以提前设置css,通过更换css达到样式更改将会更加简洁与易维护。
  • document.body.classNAme = 'xxx'
  • 点击进行测试
  • 完整代码:

 

点击不同按钮更换对应颜色

  • 拓展到小说换肤就是,点击不同按钮,切换到对应主题
  • 最易想到的思路(省略相关代码):
  • 当我们主题只有几个时,可以通过多个函数实现,但是当主题多到十几个或几十个时,代码只在一定程度上有所变化,大量js代码不仅没必要,还会增加文件大小,同时还会影响后期维护。

函数参数

 

问题

  • 暂无(不断补充)

思考题

问题内容

  • 下述连接,第一次点击没有效果。
  • 测试链接
  • 完整代码

 

解决过程

  • 此问题的相关内容与1.3相关内容知识点完全一致,不进行更多的记录,下面进行相关总结阐释:

    • 首先简单阐释内部样式、内联样式、以及外部样式,如图:在head标签内引入的css文件为外部样式(图中标记为1);写于style标签内的样式为内部样式(图中标记为2);写于标签的对应style属性里的样式为内联样式(图中标记为3)。

      image-20220311205622863

    • 通过js操作标签样式,只能操作内联样式,而本问题内,内联样式初始设置为空,所以js执行,第一次获取到的值为空,不满足判断条件,便执行else语句,使其内联样式有相关内容,进一步便能进行判断了。

    • 了解到问题关键在这里后,进行1.3中的相关测试便能理解相关内容了。

第三周

内容

笔记

点击弹出对应弹窗

  • 根据课程内容,进行三种方法测试,代码与测试链接如下:
  • 点击进行测试

 

什么是行间事件

  • js代码与页面加载

    • 整个页面的加载顺序是从上至下。
    • 在HTML body部分中的JavaScripts会在页面加载完成之后执行。
    • 在HTML head部分中的JavaScripts会在被调用的时候才执行,但是在主页和其余部分代码之前预先装载。也就是如果把javascript放在head里的话,则先被解析,但这时候body还没有解析,也就是dom对象产生前执行。
  • 什么是行间事件?

    • 行间事件就是写到HTML元素中的执行事件,例如1.2.2中的内容

    image-20220317201507332

  • 什么是提取行间事件

    • 提取行间事件就是将行间事件提取到js中的过程,示例如下:

     

  • 为什么要提取行间事件

    • 要是直接将onclick="testclick()"写在标签内,JavaScript与HTML代码就混淆在了一起,既不容易维护,同时对于多人协作代码时,也会很大程度影响开发效率,还有一些其他不利之处。
    • 提取行间事件也达到了行为、样式、结构三者分离的目的。(个人理解就是房子的建造、装修、电工各司其职咯)

扩展测试

场景设想

  • 最近一直在针对页面样式进行操作,同时如第二周课程中的内容,小说换肤,我们都知道小说阅读支持很多自定义的内容,包括字体、行间距、背景、字体大小等内容,所以扩展内容便以小说阅读界面为例,进一步进行实现与测试。
  • 样例链接
  • image-20220318130631097

页面功能分析

  • 下拉的可选中列表

    • 多个下拉列表(合理选用标签)
    • 选中并传参(传参方式需严谨)
    • 每个下拉框对应不同样式的调整(一个函数肯定不能完成)
  • 鼠标事件

    • 顶部导航栏预加鼠标滑过有不同效果

代码编写

  • 自定义主题核心代码:
  • 完整代码由于代码量较大,不在此处贴出了。可点击上方测试链接,进行源代码查看。

 

select知识点

  • 关于select标签:

    • 到select对象: var myselect=document.getElementById("test");
    • 到选中项的索引:var index=myselect.selectedIndex ;
    • 到选中项options的value: myselect.options[index].value;
    • 到选中项options的text: myselect.options[index].text;
    • 操作select标签需要使用onchange事件
  • onchange事件:

    • onchange 事件会在域的内容改变时发生;
    • onchange 事件也可用于单选框与复选框改变后触发的事件;

问题

  • 暂无(不断补充)

第四周

内容

笔记

上课的内容

关于2.4的一个神奇的解决办法

  • 简单解析:实际上并没有真正的解决问题,只是恰好这个问题只存在于第一次调用函数,所以在加载的时候调用一次函数,能比较巧妙的在显示方面避免这个问题,但是这种方法也只针对本例子有效,举个例子,要是每个判断语句都是有确切的判断条件的,而不是有一个else语句,那么这个函数判断的时候,获取到为空的话,将不满足任何一个判断,那么也将不会给予style属性相关值,那么再次调用函数依旧不能运行,不切实解决获取方法问题,那么这个bug永远存在。

js函数调用加括号和不加括号区别

  • 函数是一个对象函数名其实就是指向函数体的指针
  • 不加括号, 可以认为是查看该函数的完整信息,是访问函数指针,并不调用函数;
  • 不加括号传参,相当于传入函数整体;也就是函数名赋值给click等的事件,触发click事件时才会执行此函数名对应的函数
  • 加括号 表示立即调用(执行)这个函数里面的代码(花括号部分的代码);
语法描述
函数名 fun 为参数fun函数体对象是参数
带括号的函数 fun() 作为参数立即执行函数后的返回值作为参数
  • 归纳一下:带()时候直接弹出对话框了, 因为带括号就直接执行函数体内部代码了,不带括号就把函数给事件,事件触发才执行。那么问题来了html里面写成 "函数名()"为什么又可以了呢!不就是加上了双引号吗?原因是写成字符串的时候它会和eval()的执行原则一样,eval(‘字符串’) 就是把其中的字符串解析成js代码并运行,可以这样理解,加上引号之后,就不是直接调用了,是把它当成了一段字符串格式的js代码执行,相当于就是把函数体内部的代码提出来放到了引号里面,然后触发事件的时候才会执行这些代码。在浅显一点理解就是,加上引号之后,获取到的函数体代码就不会解析成js代码直接执行了,触发事件的时候才当成js代码执行。

    也就是说加括号不加括号主要区别体现在js代码内,js代码内函数加括号,那么就会直接解析成js代码执行,不加括号的话,就是指向对应函数,然后触发事件的时候才会调用函数。(多是个人理解)

    为什么会直接执行,这应该是js特性吧,也不太清楚,反正运行文件的时候,只要出现了可运行的js代码,就都会运行。

    然后就是可不可以在js内通过双引号调用呢是不行的,js内部使用引号的话,就是当成字符串赋值了。

全选功能的实现

通过标签名称获取一组元素

  • 方法为getElementById()
  • 但是需要注意的是,一般都需要限定父标签,在父标签内进行相关内容的选择。

for循环

  • for循环的用法等与其他语言大同小异。

数组计算

  • 计算数组的长度:方法与其他语言大同小异,xxxx.length

input标签的value属性

  • input 标签的 value 属性的作用是由 input 标签的 type 属性的值决定的

  • 当 type 的取值为 button、reset、submit 中的其中一个时,此时 value 属性的值表示的是按钮上显示的文本

  • 当 type 的取值为 text、password、hidden 中的其中一个时,此时 value 属性的值表示的是输入框中显示的初始值,此初始值可以更改,并且在提交表单时,value 属性的值会发送给服务器(既是初始值,也是提交给服务器的值)

  • 当 type 的取值为 checkbox、radio 中的其中一个时,此时 value 属性的值表示的是提交给服务器的值

  • 当 type 的取值为 image 时,点击它提交表单后,会将用户的点击位置相对于图像左上角的 x 坐标和 y 坐标提交给服务器

    • type="checkbox" 时,其 value 属性的值表示在复选框呈勾选状态时提交给服务器的数据值,默认为 on
    • type="image" 定义图像形式的提交按钮,此时必须把 src 属性 和 alt 属性 与 <input type="image"> 结合使用(alt 属性表示图片未正常显示时,用于替换图片的提示;如果不写这个属性,当图片未正常显示时,会默认显示提交这两个字)
  • checkbox 型的 input 标签的不足之处在于:提交表单时,只有处于勾选状态的复选框的数据值才会发送给服务器。也就是说,如果没有任何一个复选框被选中,那么服务器就不会收到与其相关的数据项。

  • 当设置 input 标签的 type 属性值为checkbox 或者 radio 时,必须同时设置 input 标签的 value 属性。

  • type="file" 时,不能使用 value 属性。

课程案例

JS操作元素内容和属性的两种办法

js对象属性通过点(.) 和 方括号([]) 的不同之处

  • 点操作符: 静态的,右侧必须是一个以属性名称命名的简单标识符。属性名用一个标识符来表示。标识符必须直接出现再js程序中,它们不是数据类型,因此程序无法修改它们。
  • 中括号操作符: 动态的,方括号里必须是一个计算结果为字符串的表达式,属性名通过字符串表示。字符串是js的数据类型,在程序运行时可以修改和创建它们。
  • 利用中括号更加的灵活,可以用变量来访问属性,更加的灵活。
  • 点击进行测试

 

表单元素与非表单元素内容修改的方法

  • 这部分主要是如何修改标签显示的文字内容
  • 表单元素通过修改其value属性实现
  • 非表单元素通过innerHTML、innerText方法实现输入

问题

getElementsByTagName元素选取逻辑

问题描述

测试解决

button标签和input标签type=“button”的区别

问题描述

解决方案

第五周

内容

笔记

上课的内容

  • js编写与测试,多利用控制台咯,有问题打印出来看看。

反选功能实现

  • 非运算符(!):非运算符(!)就是取反,对一个表达式执行逻辑非操作。其结果是把表达式强制转换成true或false这两个结果。
  • 样例链接

全选、不选和反选功能实现

  • 主要内容就是结合所学进行综合测试,没有更多新的内容。
  • 样例链接

联动选择

  • 上下复选框,联动控制
  • 主要难点是上下控制,操作每一个内容的时候需要根据需求逻辑针对另一部分的内容进行控制,就需要根据需求在两个地方分别嵌套与判断。
  • 样例链接
  • 在联动选择这块,按照正常的逻辑,for循环会在加载页面的时候执行一次,最终就直接跳出循环了;再执行checkfun函数(也就是点击下面复选框的时候)的时候,为什么直接跳过了for循环,又能定位到对应的input标签。但是,这样思考的话就忽略了一个细节,那就是input1本身就是一个数组,那么input1[1]...本身就存在了,所以这个for循环就只需要执行一次,分别给每个input[1]...添加点击事件。那么就定义好了,当事件发生时调用对应函数。

 

问题

函数调用成功但是不执行

问题描述

  • 场景是联动选择,主要问题就是js内的函数调用成功,编辑器也有高亮提示,且逻辑和语法没有任何问题。但是在触发对应事件的时候,函数死活不执行。具体表现如下:

  • 第一个情况:

    • 点击上面的复选框,下面的复选框没有变化,对应上面复选框的函数也没有执行。
    • 测试链接
    • 核心代码:
    • 测试效果就是无论怎么点击都不执行
  • 第二个情况:

    • 先贴一下代码:
    • 测试链接

    • 点击下面的复选框不正常执行对应函数,但是更加诡异的是如下图点击2、3、4号复选框的时候,又执行了如上面代码块中的checkfun函数。点击1号复选框的时候,没有任何反应。这也确定了,函数调用没有任何问题。

      具体的内容可以点击上面链接查看控制台输出。

    image-20220402213726795

解决过程

  • 按照上面的情况来看,基本上就能确定就是函数的调用和执行的问题了,于是在网上查找关于js调用函数成功不执行的内容,得到的内容几乎百分之六十都是说的定义的函数名是涉及到了js关键字的(还有百分之四十和本题情况无关),但是这一点基本可以完全排除。但是由于网上找不到符合本例情况的解决方案和内容。只能进一步进行测试尝试了。

  • 尝试一:

    • 将上面的函数定义与调用方式改成直接调用函数,不再声明,示例代码如下:
    • 测试链接
    • 结果是能完美实现效果并且按预期执行每个函数。
  • 尝试二:

    • 将上面的函数定义方式改成定义命名函数,示例代码如下:
    • 测试链接
    • 结果同样是能完美实现效果和执行每个函数。
  • 其实测试完,也一直不知道到底是什么问题,百度也没找到合适的答案。

  • 接着就是不断的阅读代码,最终综合上面内容,可以发现,出现问题的那部分,和其他两种方式最大的区别就是第一种方法把函数赋值给了一个变量,函数的调用是调用的对应变量,按照页面的加载顺序,先在对应事件调用变量,那个变量此时是没有值的,所以不能执行对应函数体。

    示例1:

    示例2:

  • 接着是解释一下为什么5.3.1.1的第二种情况里的‘诡异情况’,其实明白了上面的原理,再回到5.3.1.1的第二种情况的测试链接里,for循环分别给input[i]赋值,如下图,是执行了多次的,但是i==0时,也就是第一次赋值那么对应的的函数还没定义,也就不能正常赋值了。

    image-20220402230022210

问题总结

  • 其实是想总结一下这些函数的区别,以及定义函数的其他关键字等内容的,但是感觉不能一两句说明白,所以也就不说了,但是问题解决思路还是可以总结一下的,就是遇到问题不一定要百度,多结合底层的原理与基础内容,多看看代码,也许就看明白了。

第六周

内容

笔记

form表单互相作用域submit刷新页面的问题

  • button标签和input标签type=“button”的区别
  • 本质上是没有区别的,在4.3中之所以会有相关问题,根本原因也不是button标签的问题,而是设置了form表单,button在表单内,切默认是submit的类型,点击后会产生一个提交事件,并刷新页面,所以会出现相关bug。

实现选项卡

  • this关键字

    • 面向对象编程语言中的this表示当前对象的一个引用、
    • JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
    • 在方法中,this 表示该方法所属的对象
    • 如果单独使用,this 表示全局对象
    • 在函数中,this 表示全局对象
    • 在函数中,在严格模式下,this 是未定义的(undefined)。
    • 在事件中,this 表示接收事件的元素
    • 可以将 this 引用到任何对象
  • js给元素自定义属性的两种方法

    • element.属性 = '值'
    • element.setAttribute ( '属性 ','值 ')
  • 样例链接

JS数据类型与类型转换

  • 数据类型

    • 值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
    • 引用数据类型(对象类型):对象(Object)、数组(Array)、函数(Function),还有两个特殊的对象:正则(RegExp)和日期(Date)。
  • 查看数据类型:typeof

  • String类型-字符串:字符串是存储字符的变量
  • Number类型-数字:覆盖整数和浮点数。数字可以有很多操作,比如,乘法 *、除法 /、加法 +、减法 - 等等。除了常规的数字,还包括所谓的"特殊数值"也属于这种类型:Infinity、-Infinity 和 NaN。

    • Infinity代表数学概念中的无穷大。是一个比任何数字都大的特殊值;-Infinity就是负无穷
    • NaN代表一个计算错误。它是一个不正确的或者一个未定义的数学操作所得到的结果,就是not a number的缩写。
    • NaN是粘性的。任何对NaN的进一步数学运算都会返回NaN
    • 在 JavaScript 中做数学运算是安全的。我们可以做任何事:除以 0,将非数字字符串视为数字,等等。脚本永远不会因为一个致命的错误(“死亡”)而停止。最坏的情况下,我们会得到 NaN 的结果。
  • Boolean类型-逻辑类型:布尔(逻辑)只能有两个值:true 或 false。

  • Array-数组
  • 数据转换

    • 显性转换:指通过String、Number和Boolean等构造方法手动转换成对应的字符串、数字和布尔值。

      • String(value)value 转换为字符串类型
      • Number(value)value 转换为 number 类型,转为数字类型的方法还包括parseIntparseFloatparseInt 将变量转换为整型数。只有对字符串型的数据调用该函数才有意义,其他类型使用parseInt函数,则会返回NaN;parseFloat用于将字符串转换为浮点数格式,在进行检查时,它会逐个字符进行检测,遇到非法字符时停止,转换合法的数字为浮点数,这里的非法字符是指不是数字0-9和小数点,和parseInt不同的时,小数点为parseFloat中的合法字符,用于表示浮点数中的小数点。不过需要注意的是,一个字符中有多个小数点,则使用parseFloat函数时,第二个及以后的小数点视为非法字符。
      • Boolean(value) 显式地进行转换为boolean类型。
    • 隐性转换:不需要人为强制的进行转换,js会自动将类型转换为需要的类型,不同场景转换不同。

 

问题

  • 暂无(不断补充)

第七周

内容

  • 无内容

第八周

内容

笔记

函数参数

  • 我们可以通过参数将任意数据传递给函数。

  • 在如下示例中,函数有两个参数:from 和 text。

  • 当函数在 (*)(**) 行中被调用时,给定值被复制到了局部变量 fromtext。然后函数使用它们进行计算。

  • 这里还有一个例子:我们有一个变量 from,并将它传递给函数。请注意:函数会修改 from,但在函数外部看不到更改,因为函数修改的是复制的变量值副本:

  • 当一个值被作为函数参数(parameter)传递时,它也被称为 参数(argument)

  • 换一种方式,我们把这些术语搞清楚:

    • 参数(parameter)是函数声明中括号内列出的变量(它是函数声明时的术语)。
    • 参数(argument)是调用函数时传递给函数的值(它是函数调用时的术语)。
    • 我们声明函数时列出它们的参数(parameters),然后调用它们传递参数(arguments)。
  • 在上面的例子中,我们可以说:“函数 showMessage 被声明,并且带有两个参数(parameters),随后它被调用,两个参数(arguments)分别为 from"Hello"”。

返回值

  • 函数可以将一个值返回到调用代码中作为结果,最简单的例子是将两个值相加的函数:

  • 指令 return 可以在函数的任意位置。当执行到达时,函数停止,并将值返回给调用代码(分配给上述代码中的 result)。

  • 在一个函数中可能会出现很多次 return。例如:

  • 只使用 return 但没有返回值也是可行的。但这会导致函数立即退出

  • 在上述代码中,如果 checkAge(age) 返回 false,那么 showMovie 将不会运行到 alert

  • 空值的 return 或没有 return 的函数返回值为 undefined

  • 如果函数无返回值,它就会像返回 undefined 一样:

  • 空值的 returnreturn undefined 等效:

京东双色球

  • 三目运算:n<10?'0'+n:''+n:如果n小于10就加0,不小就不加。

  • 课上实现方式测试链接

  • 双色球,应该是两组数,所以改进一下:

  • 测试链接

  • 核心代码

 

问题

双色球的实行

思考

  • 双色球的实际运行过程中怎么保证生成的这一组数不会重复呢?即如何保证不同的用户买的号码是不同的,这一部分内容是否能直接通过js实现。
  • 尽管这种可能性很小,但是从逻辑上讲,要是js仅仅是生成七个随机数,那么生成一样号码,也不是完全不可能。
  • 要保证每一组数不同,目前个人能想到的就一种方法,那就是与数据库对比,产生一组数的时候同时传输到后端与数据库进行对比,查看数据库中是否已经存在,进一步确定是否返回给用户。
  • 但是这一部分内容,会涉及到操作数据库,要是已经产生过大量的号码,那么每生成一个号码后端就要遍历并判断一遍,那么无疑后端的压力是巨大的。
  • 所以具体可以怎么优化呢!

试验

场景

  • 输入框输入提示,主要出现的使用场景有很多,最常见的是两种,分别是表单提交提示,填国家的时候,提示国家名称,在邮箱框提示邮箱等,还有一种就是搜索框提示,这两种实现原理差不多,但是分开来讲是因为,前者大部分是静态数据,后者是从数据库拿数据。

实验过程

实现输入框监听

  • 当input输入内容的时候打印输入的内容,核心代码与实现效果如下:

  • 测试链接

    image-20220425103927508

字符串比较

  • 根据监听到的内容和已有数据进行对比,对比的方法就是字符串对比,就是用输入的字符串和数组内元素进行对比,具体还需要获取到输入的字符串长度length,和目标字符串前length个字符串对比,满足即输出,代码与测试效果如下:
  • 测试链接

image-20220425111009310

  • 其实到这里就基本实现我们想要的效果的核心代码,进一步的展示就是将匹配到的内容写入一个数组,然后循环数组并利用innerHTML进行写入即可。进一步进行另一个功能的实现,不进行这部分的实现了。

百度联想实现

  • 其实我们日常看到的都是ajax,异步请求数据,但是现在前端一般都没有用原生js实现的了,会借用jquery等前端框架,所以本实例不进行ajax相关内容展示,利用动态创建script创建标签请求json数据并渲染到指定函数。
  • 首先是数据接口,这个接口是在网上找的百度接口,传入关键词就有json返回。https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词
  • 效果如下:

image-20220425120720726

  • 其次就是实现:有了数据,就好实现了,主要实现请求和渲染两个事情,所以主要是两个函数:

    • 动态请求数据函数:完成监听与动态script创建来请求数据

      • 监听输入框,本例使用键盘事件来实现监听,如果有值,便取出相关值。
      • 将百度接口和取出的输入框值进行完整url拼接,利用creatElement新建标签,并通过 document.body.appendChild插入标签,便完成了数据请求的主要内容,再利用cd参数传递到下面的渲染函数。如下,text.value就是搜索框的值,"&cb=xuanran"就是完成数据渲染(其最底层的原理是回调函数,这里就是将这个标签获取到的json对象作为一个参数传递到我们指定的这个函数xuanran)。
      • "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+text.value+"&cb=xuanran"
    • 接受数据并渲染:接收上一步的数据并渲染。

      • 这部分很简单,操作相关元素就行,需要注意的就是json的格式。
  • 测试链接

image-20220425122229014

  • 核心代码:

从在线笔记到网站搭建

  • 针对在线笔记,在上课的时候,老师一边讲的时候一边想到平时接触到的一些网站或者说手册,就这样好像有点醍醐灌顶,在线能放代码的笔记(Markdown笔记)?方式方法那还不一抓一大把!!!
  • 关键是什么?关键是我感觉这一部分扩展直接关联到本课程了——《网站建设与开发》
  • 本部分内容就将从实现在线Markdown笔记的初级、进阶、高级三个阶段进行阐释与介绍,最后进行示例展示并结合前面内容,针对网站建设相关内容进行总结。

初级——第三方平台

说明

codimd

作业部落

csdn/简书/博客园

进阶——静态网站

实现思路

静态笔记实现

vuepress

Hexo

image-20220425131924131

Gitbook

自己搭建

笔记托管

github/gitee+git

第三方托管服务

自己搭建服务器

高级——动态网站

网站模板

开源项目

个人开发

个人开发在线笔记展示(原创)

简介

  • 如9.3.3中所述,用开源的会有一些限制,于是就想着尝试开发一个在线笔记网站了,而且功能不多,搭建起来应该不难,所以就开始搭建了
  • 花了近4天多敲代码、1天上线(踩了很多坑,服务器环境出问题了,本来很简单,但折腾了一天)
  • 目前已经上线了,官方网址https://note.jiumoz.com/
  • 实现了markdown笔记编写、发布、图片上传等核心功能,具体的可以点击上面链接进行体验。
  • 部分功能还待完善,例如前端提示、分页查询等

技术路线

  • 简单阐释涉及的技术内容:

    • 数据存储:mysql、阿里云oss对象存储
    • 前端页面:bootstrap、jquery等框架
    • 后端:SpringBoot、Shiro、Thymeleaf......
    • 编辑器:Editor.md

效果展示

总结——从零到站长

上面部分的所有内容扩展出来其实就是网站建设与开发,恰好就和本课程契合起来了,所以从网站建设角度进行一下总结:

  • 网站类型:网站分为静态网站和动态网站,我个人理解就是有没有数据库。

  • 搭建静态网站:

    • 生成静态网页文件:如9.2.2
    • 找一个静态网站托管平台:如9.2.3
    • 利用git工具或其他方法上传静态文件并发布
  • 搭建动态网站:

    • 服务器搭建:如9.2.3.3
    • 系统开发(网站框架/个人开发):关于个人开发就同9.3.3、9.3.4,需要很多技术性内容
    • 系统发布:要熟悉linux、服务器配置等内容

总结起来,网站建设与开发就是实现从零到发布并维护网站的过程。

第九周

内容

笔记

定时器基础内容

  • setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
  • setInterval() 方法会不停地调用函数,直到 clearInterval()被调用或窗口被关闭。由 setInterval() 返回的ID 值可用作 clearInterval() 方法的参数。
  • 提示: 1000 毫秒= 1 秒。
  • 测试代码:实现动态显示时间,测试链接

 

  • clearInterval() 方法可取消由 setInterval() 函数设定的定时执行操作。
  • clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。
  • 注意: 要使用 clearInterval() 方法, 在创建执行定时操作时要使用全局变量:myVar = setInterval("javascript 函数", milliseconds);
  • 测试代码:结束显示当前时间,测试链接

 

  • setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
  • 提示: 使用 clearTimeout() 方法来阻止函数的执行。
  • 测试实例:打开一个新窗口,3 秒后将该窗口关闭,测试链接

 

  • clearTimeout() 方法可取消由 setTimeout() 方法设置的定时操作。
  • clearTimeout() 方法的参数必须是由 setTimeout() 返回的 ID 值。
  • 测试实例:定时后弹窗,在规定时间前点击不弹窗,测试链接

 

自动播放选项卡

  • 实现思路:手动实现选项卡切换-->添加定时任务-->鼠标事件
  • 测试链接

问题

  • 暂无

第十周

内容

笔记

JS的组成部分

JavaScript的核心,描述了语言的基本语法(var、for、if、array等)和数据类型(数字、字符串、布尔、函数、对象(obj、[]、{}、null)、未定义),ECMAScript是一套标准,定义了一种语言(比如JS)是什么样子。

DOM(文档对象模型)是 HTML 和 XML 的应用程序接口(API)。DOM 将把整个页面规划成由节点层级构成的文档。HTML 或 XML 页面的每个部分都是一个节点的衍生物。请考虑下面的 HTML 页面:

DOM节点层次图如下

image-20220506203532673

对浏览器窗口进行访问和操作,例如弹出新的浏览器窗口,移动、改变和关闭浏览器窗口,提供详细的网络浏览器信息(navigator object),详细的页面信息(location object),详细的用户屏幕分辨率的信息(screen object),对cookies的支持等等。BOM作为JavaScript的一部分并没有相关标准的支持,每一个浏览器都有自己的实现。

DOM常见操作

DOM查询

方法描述
document.getElementById(“id属性值”);根据元素的id属性查询一个元素节点对象
document.getElementsByName(“name属性值”);根据元素的name属性值查询一组元素节点对象
document.getElementsByTagName(“标签名”);根据标签名来查询一组元素节点对象
  • 语法
  • 方式
方式描述
元素.childNodes获取当前元素的所有子节点,但是会获取到空白的文本子节点
元素.children获取当前元素的所有子元素
元素.firstChild获取当前元素的第一个子节点,但会获取到空白的文本子节点
元素.lastChild获取当前元素的最后一个子节点
元素.parentNode获取当前元素的父元素
元素.previousSibling获取当前元素的前一个兄弟节点
元素.nextSibling获取当前元素的后一个兄弟节点
firstElementChild获取当前元素的第一个子元素
元素.firstChild.nodeValue读取第一个子节点的文本内容

DOM增加

示例代码:测试链接

DOM删除

示例代码:测试链接

DOM修改

示例代码:测试链接

操作元素内容和属性的两种办法

上移下移功能的实现

所有待移动的元素全部为兄弟元素,然后同在一个父标签下,所以操作方式就可以类比数据结构中的数组操作,判断位置——>通过对应方法改变位置

问题

  • 暂无

第十一周

内容

笔记

留言板功能

首先就是要获取到姓名和内容,然后就是将获取到的内容写入到指定的位置,思路和实现都比较简单

右下角悬浮框功能实现

任务清单功能实现

实现的思路比较简单:

  1. 点击添加,将任务添加到清单;
  2. 鼠标滑入清单有消息提示和样式变化;
  3. 清单添加点击事件,点击后移除元素;

问题

留言板扩展

问题描述

视频中的代码简单复现的话,最终效果就是可以一直添加同样的留言,正常情况下,同样的留言就只能添加一次。

尝试解决

  1. 最开始的思路是写入留言板区域的时候判断是否存在,但是这样的话其实非常的麻烦,要判断的东西太多了。所以不太可行
  2. 就换一种,就是提交完后,直接将姓名区和留言区打好的内容给删除,这样用户就不会重复提交了。

判断是否是IE6

问题描述

实现右下角悬浮框的功能的时候,按照视频中的方法,在控制悬浮框显示与位置之前,先判断一下是不是ie6浏览器,此时js代码如下,此时,预期效果没有达到,也没有通过判断,也就是触发对应的事件的时候,都止步在了输出‘开始测试’,不会输出我们预计需要的那个值。其实到这里,不能达到预期效果的根本原因就大致知道了,就是这个判断语句出的问题,解决一下IE6的判断就好。

测试效果与链接如下:

image-20220514221353022

解决过程

第十二周

内容

笔记

Ajax数据交互简介

image-20220519164125248

服务器环境搭建与配置

Ajax交互流程和注意问题

问题

ajax缓存问题

问题描述

视频中,改变txt文件的内容,再次请求,数据不会改变,也就是浏览器缓存了数据。

但是个人测试的时候,数据是随着文件内容的改变更改的。也就是浏览器并没有缓存数据。

测试过程

  • 浏览器的原因

    因为视频中的测试,是用的ie浏览器,而且ie浏览器众所周知会搞怪,所以很合理的就怀疑是浏览器的原因;

    百度了一下,也基本确认了是ie浏览器的问题。

    测试了edge、火狐、谷歌都没有缓存问题,但是又不想装ie,就没有实际的测试结果。

  • ajax的原因

    因为视频中用的ajax库和我们的不一样,所以也就有了一点怀疑,但根据上面的解决缓存问题的办法去阅读我们用的库的源码,也没有发现处理过;

  • 根据上面的测试可以简单的得到结论了,那就是测试结果出现的原因是浏览器的原因。(但是没有很深层次的了解,很多东西还不是很清楚)

第十三周

内容

笔记

使用Ajax获取数据并渲染

image-20220527003933118

跨域介绍

jsonp

问题