|
31 | 31 | * [04-06](https://github.com/TYRMars/JSlearn#04-06) `BOM知识点` |
32 | 32 | #### 05 |
33 | 33 | * [05-01](https://github.com/TYRMars/JSlearn#05-01) `事件-知识点` |
| 34 | +* [05-02](https://github.com/TYRMars/JSlearn#05-02) `Ajax-XMLHttpRequest` |
34 | 35 |
|
35 | 36 | --- |
36 | 37 |
|
@@ -1265,6 +1266,130 @@ function bindEvent(elem,type,selector,fn) { |
1265 | 1266 | }) |
1266 | 1267 | } |
1267 | 1268 | ``` |
| 1269 | + |
| 1270 | +## 05-02 |
| 1271 | +### Ajax-XMLHttpRequest |
| 1272 | +* 手动编写一个ajax,不依赖第三方库 |
| 1273 | +* 跨域的几种实现方式 |
| 1274 | +#### 知识点 |
| 1275 | +##### XMLHttpRequest |
| 1276 | + |
| 1277 | +```JavaScript |
| 1278 | +var xhr = new XMLHttpRequest(); |
| 1279 | +xhr.open("GET","/api",false) |
| 1280 | +xhr.onreadystatechange = function () { |
| 1281 | + //这里的函数异步执行,可参考之前JS基础的异步模块 |
| 1282 | + if(xhr.readyState == 4){ |
| 1283 | + if (xhr.status == 200) { |
| 1284 | + alert(xhr.responseText) |
| 1285 | + } |
| 1286 | + } |
| 1287 | +} |
| 1288 | +xhr.send(null); |
| 1289 | +``` |
| 1290 | + |
| 1291 | + * IE低版本使用ActiveXObject,和W3C标准不一样 |
| 1292 | + * IE低版本使用量已经非常少,很多网站早已不支持IE低版本 |
| 1293 | + * 建议对IE低版本的兼容性:了解即可,无需深究 |
| 1294 | + |
| 1295 | +##### 状态码 |
| 1296 | +```JavaScript |
| 1297 | +xhr.onreadystatechange = function () { |
| 1298 | + //这里的函数异步执行,可参考之前JS基础的异步模块 |
| 1299 | + if(xhr.readyState == 4){ |
| 1300 | + if (xhr.status == 200) { |
| 1301 | + alert(xhr.responseText) |
| 1302 | + } |
| 1303 | + } |
| 1304 | +} |
| 1305 | +``` |
| 1306 | +* readyState |
| 1307 | + * 0-(未初始化)还没有调用send()方法 |
| 1308 | + * 1-(载入)已调用send()方法,正在发送请求 |
| 1309 | + * 2-(载入完成)send()方法执行完成,已经接收到全部响应内容 |
| 1310 | + * 3-(交互)正在解析响应内容 |
| 1311 | + * 4-(完成)响应内容解析完成,可以在客户端调用 |
| 1312 | +* status |
| 1313 | + * 2XX-表示成功处理请求。如200 |
| 1314 | + * 3XX-需要重定向,浏览器直接跳转 |
| 1315 | + * 4XX-客户端请求错误,如404 |
| 1316 | + * 5XX-服务端错误 |
| 1317 | +##### 跨域 |
| 1318 | +* 什么时跨域 |
| 1319 | + * 浏览器有同源策略,不允许ajax访问其他域接口 |
| 1320 | + * http://www.yourname.com/page1.html |
| 1321 | + * http://m.imooc.com/course/ajaxcourserecom?cid=459 |
| 1322 | + * 跨域条件:协议、域名、端口、有一个不同就算跨域 |
| 1323 | + * 但是有三个标签允许跨域加载资源 |
| 1324 | + * `<img src=XXX>` |
| 1325 | + * `<link href=XXXX>` |
| 1326 | + * `<script src=XXX>` |
| 1327 | + * 三个标签的场景 |
| 1328 | + * <img>用于打点统计,统计网站可能是其他域 |
| 1329 | + * <link><script>可以使用CDN,CDN的也是其他域 |
| 1330 | + * <script>可以用于JSONP |
| 1331 | + * 跨域注意事项 |
| 1332 | + * 所有的跨域请求都必须经过信息提供方允许 |
| 1333 | + * 如果未经允许即可获得,那是浏览器同源策略出现漏洞 |
| 1334 | +* JSONP |
| 1335 | + * 加载 http://coding.m.imooc.com/classindex.html |
| 1336 | + * 不一定服务器端真正有一个`classindex.html`文件 |
| 1337 | + * 服务器可以根据请求,动态生成一个文件,返回 |
| 1338 | + * 同理与<script src="http://coding.m.imooc.com/api.js"> |
| 1339 | + |
| 1340 | + * 假如你的网站要跨域访问慕课网的一个接口 |
| 1341 | + * 给你一个地址http://coding.m.imooc.com/api.js |
| 1342 | + * 返回内容格式如callback({x:100,y:200})(可动态生成) |
| 1343 | +```html |
| 1344 | +<script> |
| 1345 | +window.callback = function (data) { |
| 1346 | + //这是我们跨域的到信息 |
| 1347 | + console.log(data); |
| 1348 | +} |
| 1349 | +</script> |
| 1350 | +<script src="http://coding.m.imooc.com/api.js"></script> |
| 1351 | +<!-- 以上将返回 callback({x:100,y:200}) --> |
| 1352 | +``` |
| 1353 | +* 服务器端设置http header |
| 1354 | + * 另外一个解决跨域的简洁方法,需要服务器来做 |
| 1355 | + * 但是作为交互方,我们必须知道这个方法 |
| 1356 | + * 是将来解决跨域问题的一个趋势 |
| 1357 | +```JavaScript |
| 1358 | +//注意:不同后端语言的写法可能不一样 |
| 1359 | +
|
| 1360 | +//第二个参数填写允许跨域的域名称,不建议直接写 “*” |
| 1361 | +response.setHeader("Access-Control-Allow-Origin","http://a.com, http://b.com"); |
| 1362 | +response.setHeader("Access-Control-Allow-Header","X-Requested-With"); |
| 1363 | +response.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); |
| 1364 | +
|
| 1365 | +//接收跨域的cookie |
| 1366 | +response.setHeader("Access-Control-Allow-Credentials","true"); |
| 1367 | +``` |
| 1368 | + |
| 1369 | +## 05-03 |
| 1370 | +### 存储 |
| 1371 | +* 请描述一下`cookie`,`sessionStorage`和`localStorage`的区别? |
| 1372 | +#### cookie |
| 1373 | +* 本身用于客户端和服务端通信 |
| 1374 | +* 但是它有本地存储的功能,于是就被`借用` |
| 1375 | +* 使用document.cookie = ... 获取和修改即可 |
| 1376 | +##### cookie用于存储的缺点 |
| 1377 | +* 存储量小,只有4kb |
| 1378 | +* 所有http请求都带着,会影响获取资源的效率 |
| 1379 | +* API简单,需要封装才能用document.cookie = ... |
| 1380 | +#### localStorage和sessionStorage |
| 1381 | +* HTML5专门为存储设计,最大容量5M |
| 1382 | +* API简答易用: |
| 1383 | +* localStorage.setItem(key,value);localStorage.getItem(key); |
| 1384 | +* sessionStorage关闭浏览器会清理 |
| 1385 | +* iOS safari 隐藏模式下,localStorage.getItem会报错 |
| 1386 | +* 建议统一使用try-catch封装 |
| 1387 | +#### cookie sessionStorage localStorage 的区别 |
| 1388 | +* 容量 |
| 1389 | +* 是否会携带到ajax中 |
| 1390 | +* API易用性 |
| 1391 | + |
| 1392 | + |
1268 | 1393 | --- |
1269 | 1394 |
|
1270 | 1395 | ### JSDemo JS小程序 |
|
0 commit comments