为什么要使用JSONP?

在早期,访问html页面必须进行跳转,页面的展示也依靠点击超链接,由于加载一个新页面,这不可避免的需要进行刷新。
有些利用页面种嵌入iframe,点击链接/按钮iframe访问页面,达到页面不刷新的目的,这种实现方式很丑陋。

而JSONP是一种更方便的更新数据方式,类似于现在的ajax

JSONP具体是怎么做的?

  1. 创建一个随机的函数名,
  2. 创建一个<script>,并将src指向要访问的后端服务器地址,如/?callback=函数名
  3. <script>加入文档就会立即向指定地址发起请求
  4. 服务器收到请求,将数据写入自己要返回的内容中,如函数名(参数)
  5. 客户端收到,立即执行了<script>中的内容,也就是函数名(参数),通过这种方式就完成了动态的更新。

JSONP参数可以是任意的,不过为了统一,一般使用callback=这种调用。

JSONP的请求是跨域的,后端服务器只要实现了callback调用,就可以直接使用。但同时由于使用的是动态加载<script>资源,JSONP只能使用get方式请求资源。

jQuery对其进行了封装,调用方式如下

1
2
3
4
5
6
7
$.ajax({
url: "xxxx"
dateType: 'jsonp'
success: function(A){
...
}
})

我的简单实现可以在这里

阅读全文 »

DOM标准

标准前的标准

在未指定标准前就已经有了事实上的标准
如:

1
2
3
button.onclick = function{

}

DOM1

有了更多的事件

  • blur
  • click
  • focus
  • select

DOM2

事件被单独列出来,有了拥有了事件流,事件捕获,事件冒泡,事件取消,也是最广泛的版本

事件详解

阅读全文 »

当我们使用下面的div的id是会发现得到的并不是我们想要的

1
<div id="parent"><div>
1
console.log(parent) //window

全局变量很容易造成变量名冲突,应该尽量少的使用全局变量

构建局部作用域

既然不能创建全局变量,我们就应该创建一个局部作用域
在使用let的情况下,一对{}就可以包含一个局部作用域,但在使用var的情况下,我们需要使用函数创建局部作用域。

1
2
3
function (){
...
}.call()

在一些浏览器中会遇到语法错误,我们可以使用()包裹整个函数,也可以在前面加上-或者+,或者!,只要是单目运算符都可以

阅读全文 »

要达到的效果

我需要这个小demo可以在接受Node的实例和选择器,并且可以立即调用相关的操作方法

侵入式或者非侵入式?

我其实可以直接在Node的原型对象上加上我自己写的方法,其它什么都不用做,不过这种方式会霸占变量名,而且更改了原来的原型对象,很容易带来冲突 ,所以可以选择自己新增一个方法,从这个方法里调用原来Node的方法,不对原来的Node做任何变动,这种方式叫就非侵入式。

具体实现

这里其实有两种实现方法,一种是直接用函数构造出具有相关方法属性的对象,一次搞定。

1
2
3
4
5
6
7
8
9
function xxx(){
let x ={}
...
//找到的Node实例加到x种
x.a =function(){
...
}
return x
}

另一种是构造出相关属性的对象,再构造一个拥有相关方法的原型,将__proto__指向原型

1
2
3
4
5
6
7
8
9
10
11
12
let yyy ={
x:function (){
...
}
}
function xxx(){
let x ={}
...
//找到的Node实例加到x种
x.__proto__=yyy
return x
}

后面这种方式会更好一点,不过先使用前一种种方式实现一次

阅读全文 »

什么是DOM?

DOM全称为Document Object Model,是js用来操控XHTML,在DOM中,所有标签都是node的子集,文档最开始的属性标识了文档采用的版本,比如<!DOCTYPE html>表示是html5,这个属性每个HTML/XHTML文档都必须具有。将文档每个标签以树形的方式组织方便js对 其进行操控,着建里起的模型就叫DOM。

node

DOM中所有标签及元素等都被抽象地称为node节点,比如对于标签元素,还具有

DOM标准

Element对象代表页面中具有的标签,构造函数为Element,整个文档被称为document,对应的构造函数为Document
元素中的文字被Text构造出来

Element、Document、Text都继承自node,其它结点还有注释结点Comment这些,不过平时很少用

nodeType

编号 节点
1 标签
3 文字
7 注释
9 document
10 声明文档类型的标签
11 虚拟DOM

属性

阅读全文 »

函数是什么?

函数在js中是以字符串的形式储存起来的(这会带来效率问题吧?)

在js中函数也是个对象,执行的代码块以字符串的形式保存在对象某个地方,使用f()就是调用这块代码。
传统的调用方式是使用.call()执行函数。

声明方式

具名函数

就是有名字的函数

1
2
function f(){
}

具名函数的声明,初始化,赋值都会被变量提升至顶部

匿名函数

就是没有名字的函数

阅读全文 »

前言

js中window拥有非标准库和标准库,标准库中有Object及相关api,Sting,Boolean等,我们可以先试试这些函数/对象

Object()

Object()会根据传入的参数返回不同的值

  • 基本类型,所有可以被包装的的基本类型都会被包装成包装类型
    传入空对象,undefined,或者不传,返回null,传入非空对象返回原对象

使用new Array()方式和构造函数没有区别

这里我们可以总结一下
如果是基本类型的函数/对象,不加new和加new是不相同的
如果是对象,比如Function 我们这里的Array,这两者是等同的

Function构造函数

let a = new Function('a','b','a+b')
参数可以无到任意,但至少有函数体

function是个关键字,Function是个全局对象

阅读全文 »

写本文得目的主要是为了帮助我的笨蛋马q儿子,面向0基础的小白,看完这篇文章你也就可以为自己重装系统,不花一份钱啦!

简单装机

注意,名为简单装机的原因是一以下所有的步骤都是理想状态下的,由于系统、各厂商bios不同,历史各种版本迭代原因,带来了许多兼容性问题,本应该丝滑流畅的安装过程总有可能遇到难以解决的兼容性问题,我可以尽可能的把我所遇到的问题及解决办法写下来,但不可避免会让文章变得冗长,晦涩,因此我决定不写这方面的坑,如果你遇到了,去<baidu.com>或者<google.com>上寻找解决方案吧!网络是最大百科全书。

安装前的准备

你需要的硬件准备

  • 一个至少8G的U盘
  • 一台能上网的PC

你需要的软件准备

下载工具

你可以选用迅雷,尽管它很臃肿。

下载系统

阅读全文 »

全局对象window

标准里名为 global
但浏览器实现为window,global具有的window都有

ECMAScript规定的

如:

  • parseInt()
  • parseFloat()
  • ……

浏览器私有

每个浏览器不一样,
比如chrome/firefox具有

  • alert()
    弹出提示框
    还有
  • prompt()
    提示输入
  • confirm()
    提示确认
  • console()
    控制台打印
  • setTimeout(function,3000)
    指定毫秒后执行函数
  • document
    document也是私有的
    dom规范由w3c指定

声明对象

var n = new number(1)
把1包装成对象,会有更多的一些方法

阅读全文 »

历史

1991年 李爵士发明万维网
1992年 其同事发明html和css
1993年 成立w3c
1995年 网景公司成立 能够执行脚本

js之父Brendan Eich接到任务发明一种名为Mocha(咖啡配抹茶)的脚本语言,它需要看起来像java。js发布后,Unicode发布UTF-8,这就导致js不能完整兼容UTF-81996年微软模仿JS发明了Jscript。
在IE5.5微软推出JS发请求。
2004年Gmail利用这个功能做了一个网页上的程序,这让JS的地位大大提高。

这时就出现了前端(以js为生)

制约JS发展的问题

  • 大量全局变量
  • 缺少标准库

出现了ECMAScript 5,Es4胎死腹中
Es5做了个小升级,具体谷歌

rails社区(主要使用ruby)发明了coffeeScript,非常好用,ES6就迫在眉睫。

JS集大家之所长。原创之处不优秀,优秀之处非原创

兼容性

阅读全文 »
0%