年輕人你不講武德,耗子尾汁~~~

總結就是為了形成自己的js知識網,提升自己,加油!
開始干
51、談性能優化問題
- 代碼層面:避免使用css運算式,避免使用高級選擇器,通配選擇器,
- 快取利用:快取Ajax,使用CDN,使用外部js和css檔案以便快取,添加Expires頭,服務端配置Etag,減少DNS查找等
- 請求數量:合并樣式和腳本,使用css圖片精靈,初始首屏之外的圖片資源按需加載,靜態資源延遲加載,
- 請求帶寬:壓縮檔案,開啟GZIP,代碼層面的優化
- 用hash-table來優化查找,少用全域變數
- 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能
- 用setTimeout來避免頁面失去回應
- 快取DOM節點查找的結果
- 避免使用CSS Expression
- 避免全域查詢
- 避免使用with(with會創建自己的作用域,會增加作用域鏈長度)
- 多個變數宣告合并
- 避免圖片和iFrame等的空Src,空Src會重新加載當前頁面,影響速度和效率
- 盡量避免寫在HTML標簽中寫Style屬性
51、解釋jsonp的原理,以及為什么不是真正的ajax
動態創建script標簽,回呼函式;Ajax是頁面無重繪請求資料操作
52、javascript的本地物件,內置物件和宿主物件
- 本地物件為array obj regexp等可以new實體化
- 內置物件為gload Math 等不可以實體化的
- 宿主為瀏覽器自帶的document,window 等
53、document load 和document ready的區別
Document.onload 是在結構和樣式加載完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)
54、==和===的不同
前者會自動轉換型別 值判斷數值 不判斷型別
let a = 12;
let b = '12'
console.log(a==b) //true
后者先比較數值后比較資料型別都一樣時才一樣
let a = 12;
let b = '12'
console.log(a===b) //false
55、javascript的同源策略
一段腳本只能讀取來自于同一來源的視窗和檔案的屬性,這里的同一來源指的是主機名、協議和埠號的組合
56、Ajax你以前用過么?簡單介紹一下
AJAX = 異步 JavaScript 和 XML, xmlhttprequest
AJAX 是一種用于創建快速動態網頁的技術,通過在后臺與服務器進行少量資料交換,AJAX 可以使網頁實作異步更新,這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新,傳統的網頁(不使用AJAX)如果需要更新內容,必需多載整個網頁面,有很多使用 AJAX 的應用程式案例:新浪微博、Google 地圖、開心網等等,
57、 Ajax可以做異步請求么?
可以,Ajax請求默認是異步的.如果想同步把async設定為false就可以了默認是true,如果是jquery $.ajax({ url: some.php, async: false, success : function(){ } }); 如果是原生的js xmlHttp.open(“POST”,url,false),
58、一網站如果有大量的人登陸訪問,那么會產生很多的session,如果你是程式員你該怎么辦,
session默認保存在記憶體中,記憶體資源寶貴,session資料量大導致記憶體利用率高,以下方案解決session記憶體存盤問題:
(1)可以設定session超時時間,達到超時時間session自動清空
<session-config>
<session-timeout>20</session-timeout>
</session-config>
(2)將session中的資料序列化到硬碟中;
不使用session,使用cookie(此方法存在安全性問題)
59、Ajax如何實作異步定時5秒重繪?
setInterval(function() {
$("#content").load(location.href+" #content>*","");
}, 5000);
60、如何實作瀏覽器內多個標簽頁之間的通信?
呼叫localstorge、cookies等本地存盤方式,
方法一:
localstorge在一個標簽頁里被添加、修改或洗掉時,都會觸發一個storage事件,通過在另一個標簽頁里監聽storage事件,即可得到localstorge存盤的值,實作不同標簽頁之間的通信,
標簽頁1:
1.<input id="name">
2.<input type="button" id="btn" value="提交">
3.<script type="text/javascript">
4. $(function(){
5. $("#btn").click(function(){
6. var name=$("#name").val();
7. localStorage.setItem("name", name);
8. });
9. });
10.</script>
標簽頁2:
[html] view plain copy
1.<script type="text/javascript">
2. $(function(){
3. window.addEventListener("storage", function(event){
4. console.log(event.key + "=" + event.newValue);
5. });
6. });
7.</script>
方法二:
使用cookie+setInterval,將要傳遞的資訊存盤在cookie中,每隔一定時間讀取cookie資訊,即可隨時獲取要傳遞的資訊,
標簽頁1:
1.<input id="name">
2.<input type="button" id="btn" value="提交">
3.<script type="text/javascript">
4. $(function(){
5. $("#btn").click(function(){
6. var name=$("#name").val();
7. document.cookie="name="+name;
8. });
9. });
10.</script>
標簽頁2:
[html] view plain copy
1.<script type="text/javascript">
2. $(function(){
3. function getCookie(key) {
4. return JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[key];
5. }
6. setInterval(function(){
7. console.log("name=" + getCookie("name"));
8. }, 10000);
9. });
10.</script>
61、頁面可見性(Page Visibility)API 可以有哪些用途?
頁面可見性: 就是對于用戶來說,頁面是顯示還是隱藏, 所謂顯示的頁面,就是我們正在看的頁面;隱藏的頁面,就是我們沒有看的頁面, 因為,我們一次可以打開好多標簽頁面來回切換著,始終只有一個頁面在我們眼前,其他頁面就是隱藏的,還有一種就是…,(把瀏覽器最小化,所有的頁面就都不可見了),
API 很簡單,document.hidden 就回傳一個布林值,如果是true, 表示頁面可見,false 則表示,頁面隱藏, 不同頁面之間來回切換,觸發visibilitychange事件, 還有一個document.visibilityState, 表示頁面所處的狀態,取值:visible, hidden 等四個,
document.addEventListener("visibilitychange", function(){
if(document.hidden){
document.title ="hidden";
}else {
document.title = "visibile";
}
})
我們打開這個頁面,然后再打開另一個頁面,來回點擊這兩個頁面,當我們看到這個頁面時,標題顯示visiable ,當我們看另一個頁面時,標題顯示hidden;
影片,視頻,音頻都可以在頁面顯示時打開,在頁面隱藏時關閉,
62、JavaScript原型,原型鏈 ?
- js原型?
js每宣告一個function,都有prototype原型,prototype原型是函式的一個默認屬性,在函式的創建程序中由js編譯器自動添加,
也就是說:當生產一個function物件的時候,就有一個原型prototype,
舉個栗子:
是不是還看到了一個_proto_的屬性?!騷年,你的眼睛不錯~待會在解釋prototype和_proto_的基友關系!
prototype的屬性值是一個物件,是屬性的集合,是屬性的集合,是屬性的集合,
Js原型鏈是實作繼承的主要方法,其基本思想是:利用原型讓一個參考型別繼承另一個應用型別的屬性和方法,
簡單回顧一下建構式、原型和實體的關系:每個建構式都有一個原型物件,原型物件都包含一個指向建構式的指標,而實體都包含一個指向原型物件的內部指標,
首先,我覺得有必要先解釋一下prototype 和_proto_之間的關系,
每一個基本物件都有自己的_proto_屬性,而每一個函式物件都有自己的prototype原型(函式物件也屬于基本物件,所以也有_proto_),每當去定義一個prototype的時候,就相當于把該實體的__proto__指向一個結構體,那么這個被指向結構體就稱為該實體的原型, 我們還是來看圖吧~比較清晰:
var foo = {
x: 10,
y: 20
};
決議:當你定義一個函式物件的時候,其內部就有這樣一個鏈表關系,宣告foo物件,自帶了_proto_的屬性,而這個屬性指向了prototype,從而實作物件的擴展(例如繼承等操作),
63、Javascript創建物件的幾種方式?
javascript是一種基于prototype的面向物件語言 ,與java有非常大的區別,無法通過類來創建物件,那么,既然是面象物件的,如何來創建物件呢?
一、通過”字面量“方式創建,
方法:將成員資訊寫到{}中,并賦值給一個變數,此時這個變數就是一個物件,
例如:
var person = (name:'dongjc', work:function() {console.log('write coding')});
如果{}中為空,則將創建一個空物件:
var person = {} //創建空物件
演示代碼:
<script>
var person = {
name: "dongjc",
age: 32,
Introduce: function () {
alert("My name is " + this.name + ".I'm " + this.age)
}
};
person.Introduce();
</script>
我們還可以給物件豐富成員資訊,
物件.成員名稱 = 值;
物件[成員名稱] = 值;
也可以獲取物件的成員資訊,
物件.成員名稱;
物件[成員名稱];
<script type="text/javascript">
var person = {
name: "dongjc",
age: 32,
Introduce: function () { alert("My name is " + this.name + ".I'm " + this.age); }
};
person.worker = 'coding'; //豐富成員資訊
</script>
二、通過”建構式“方式創建,
方法:
var obj = new 函式名();
這與通過類創建物件有本質的區別,通過該方法創建物件時,會自動執行該函式,這點類似于php通過創建對像時,會自動呼叫建構式,因此該方法稱為通過"建構式“方式創建物件,
<script type="text/javascript"> function Person() {
this.name = "dongjc"; //通過this關鍵字設定默認成員
var worker = 'coding'; //沒有this關鍵字,物件創建后,該變數為非成員
this.age = 32;
this.Introduce = function () { alert("My name is " + this.name + ".I'm " + this.age); }; alert("My name is " + this.name + ".I'm " + this.age);
}; var person = new Person();
person.Introduce();
</script>
此代碼一共會兩次跳出對話框,原因在于創建物件是自動執行了該函式,
注意:this關鍵字的使用,這里的this與php中話法意思類似,指呼叫該函式的物件,這里指的是person,
三、通過object方式創建,
方法:先通過object構造器new一個物件,再往里豐富成員資訊,
var obj = new Object();
實體代碼:
<script type="text/javascript">
var person = new Object();
person.name = "dongjc";
person.age = 32;
person.Introduce = function () {
alert("My name is " + this.name + ".I'm " + this.age);
};
person.Introduce();
</script>
64、Javascript作用鏈域?
JavaScript中所有的量都是存在于某一個作用域中的
除了全域作用域, 每一個作用域都是存在於某個作用域中的
在試圖訪問一個變數時JS引擎會從當前作用域開始向上查找直到Global全域作用域停止
例如
var A;//全域作用域
function B()
{
var C;//C位于B函式的作用域
function D()
{
var E;//E位于D函式的作用域
alert(A)
}
}
當alert(A)時, JS引擎沿著D的作用域, B的作用域, 全域作用域的順序進行查找.
這三個作用域組成的有序集合就成為作用域鏈
至于為什么叫鏈, 你可以理解和鏈表有相似之處, 深層的作用域會能夠訪問到上層作用域, 就如同鏈表中兩個連續節點能夠單向訪問一樣
65、什么是window物件? 什么是document物件?
簡單來說,document是window的一個物件屬性,
Window 物件表示瀏覽器中打開的視窗,
如果檔案包含框架(frame 或 iframe 標簽),瀏覽器會為 HTML 檔案創建一個 window 物件,并為每個框架創建一個額外的 window 物件,
所有的全域函式和物件都屬于Window 物件的屬性和方法,
document 對 Document 物件的只讀參考,
[window物件]
它是一個頂層物件,而不是另一個物件的屬性,即瀏覽器的視窗,
屬性
defaultStatus 預設的狀態條訊息
document 當前顯示的檔案(該屬性本身也是一個物件)
frame 視窗里的一個框架((FRAME>)(該屬性本身也是一個物件)
frames array 列舉視窗的框架物件的陣列,按照這些物件在檔案中出現的順序列出(該屬性本身也是一個物件)
history 視窗的歷史串列(該屬性本身也是一個物件)
length 視窗內的框架數
location 視窗所顯示檔案的完整(絕對)URL(該屬性本身也是一個物件)不要把它與如document.location混淆,后者是當前顯示檔案的URL,用戶可以改變window.location(用另一個檔案取代當前檔案),但卻不能改變document.location (因為這是當前顯示檔案的位置)
name 視窗打開時,賦予該視窗的名字
opener 代表使用window.open打開當前視窗的腳本所在的視窗(這是Netscape Navigator 3.0beta 3所引入的一個新屬性)
parent 包含當前框架的視窗的同義詞,frame和window物件的一個屬性
self 當前視窗或框架的同義詞
status 狀態條中的訊息
top 包含當前框架的最頂層瀏覽器視窗的同義詞
window 當前視窗或框架的同義詞,與self相同
方法
alert() 打開一個Alert訊息框
clearTimeout() 用來終止setTimeout方法的作業
close() 關閉視窗
confirm() 打開一個Confirm訊息框,用戶可以選擇OK或Cancel,如果用戶單擊OK,該方法回傳true,單擊Cancel回傳false
blur() 把焦點從指定視窗移開(這是Netscape Navigator 3.0 beta 3引入的新方法)
focus() 把指定的視窗帶到前臺(另一個新方法)
open() 打開一個新視窗
prompt() 打開一個Prompt對話框,用戶可向該框鍵入文本,并把鍵入的文本回傳到腳本
setTimeout() 等待一段指定的毫秒數時間,然后運行指令事件處理程式事件處理程式
Onload() 頁面載入時觸發
Onunload() 頁面關閉時觸發
[document 物件]
該物件是window和frames物件的一個屬性,是顯示于視窗或框架內的一個檔案,
屬性
alinkColor 活動鏈接的顏色(ALINK)
anchor 一個HTMI錨點,使用<A NAME=>標記創建(該屬性本身也是一個物件)
anchors array 列出檔案錨點物件的陣列(<A NAME=>)(該屬性本身也是一個物件)
bgColor 檔案的背景顏色(BGCOLOR)
cookie 存盤于cookie.txt檔案內的一段資訊,它是該檔案物件的一個屬性
fgColor 檔案的文本顏色(標記里的TEXT特性)
form 檔案中的一個表單()(該屬性本身也是一個物件)
forms anay 按照其出現在檔案中的順序列出表單物件的一個陣列(該屬性本身也是一個物件)
lastModified 檔案最后的修改日期
linkColor 檔案的鏈接的顏色,即標記中的LINK特性(鏈接到用戶沒有觀察到的檔案)
link 檔案中的一個<A HREF=>標記(該屬性本身也是一個物件)
links array 檔案中link物件的一個陣列,按照它們出現在檔案中的順序排列(該屬性本身也是一個物件)
location 當前顯示檔案的URL,用戶不能改變document.location(因為這是當前顯示檔案的位置),但是,可以改變 window.location (用其它檔案取代當前檔案)window.location本身也是一個物件,而document.location不是物件
referrer 包含鏈接的檔案的URL,用戶單擊該鏈接可到達當前檔案
title 檔案的標題((TITLE>)
vlinkColor 指向用戶已觀察過的檔案的鏈接文本顏色,即標記的VLINK特性
方法
clear 清除指定檔案的內容
close 關閉檔案流
open 打開檔案流
write 把文本寫入檔案
writeln 把文本寫入檔案,并以換行符結尾
區別:
1、window 指表單,document指頁面,document是window的一個子物件,
2、用戶不能改變 document.location(因為這是當前顯示檔案的位置),但是,可以改變window.location (用其它檔案取代當前檔案)window.location本身也是一個物件,而document.location不是物件
66、寫一個通用的事件偵聽器函式
1. markyun.Event = {
2. // 頁面加載完成后
3. readyEvent : function(fn) {
4. if (fn==null) {
5. fn=document;
6. }
7. var oldonload = window.onload;
8. if (typeof window.onload != 'function') {
9. window.onload = fn;
10. } else {
11. window.onload = function() {
12. oldonload();
13. fn();
14. };
15. }
16. },
17. // 視能力分別使用dom0||dom2||IE方式 來系結事件
18. // 引數: 操作的元素,事件名稱 ,事件處理程式
19. addEvent : function(element, type, handler) {
20. if (element.addEventListener) {
21. //事件型別、需要執行的函式、是否捕捉
22. element.addEventListener(type, handler, false);
23. } else if (element.attachEvent) {
24. element.attachEvent('on' + type, function() {
25. handler.call(element);
26. });
27. } else {
28. element['on' + type] = handler;
29. }
30. },
31. // 移除事件
32. removeEvent : function(element, type, handler) {
33. if (element.removeEnentListener) {
34. element.removeEnentListener(type, handler, false);
35. } else if (element.datachEvent) {
36. element.detachEvent('on' + type, handler);
37. } else {
38. element['on' + type] = null;
39. }
40. },
41. // 阻止事件 (主要是事件冒泡,因為IE不支持事件捕獲)
42. stopPropagation : function(ev) {
43. if (ev.stopPropagation) {
44. ev.stopPropagation();
45. } else {
46. ev.cancelBubble = true;
47. }
48. },
49. // 取消事件的默認行為
50. preventDefault : function(event) {
51. if (event.preventDefault) {
52. event.preventDefault();
53. } else {
54. event.returnValue = false;
55. }
56. },
57. // 獲取事件目標
58. getTarget : function(event) {
59. return event.target || event.srcElement;
60. },
61. // 獲取event物件的參考,取到事件的所有資訊,確保隨時能使用event;
62. getEvent : function(e) {
63. var ev = e || window.event;
64. if (!ev) {
65. var c = this.getEvent.caller;
66. while (c) {
67. ev = c.arguments[0];
68. if (ev && Event == ev.constructor) {
69. break;
70. }
71. c = c.caller;
72. }
73. }
74. return ev;
75. }
76. };
67、[“1”, “2”, “3”].map(parseInt) 答案是多少?
[1,NaN,NaN]
68、關于事件,IE與火狐的事件機制有什么區別? 如何阻止冒泡?
我們在網頁中的某個操作(有的操作對應多個事件),例如:當我們點擊一個按鈕就會產生一個事件,是可以被 JavaScript 偵測到的行為,
事件處理機制:IE是事件冒泡、火狐是 事件捕獲;
ie:event.cancelBubble = true 或者 return false
火狐: event.stopPropagation() 或者 return false
69、什么是閉包(closure),為什么要用它?
閉包是指有權訪問另一個函式作用域中變數的函式,創建閉包的最常見的方式就是在一個函式內創建另一個函式,通過另一個函式訪問這個函式的區域變數,利用閉包可以突破作用鏈域,將函式內部的變數和方法傳遞到外部,
閉包的特性:
(1)函式內再嵌套函式
(2)內部函式可以參考外層的引數和變數
(3)引數和變數不會被垃圾回識訓制回收
HTML:
<!-- li節點的onclick事件都能正確的彈出當前被點擊的li索引 -->
<ul id="testUL">
<li> index = 0</li>
<li> index = 1</li>
<li> index = 2</li>
<li> index = 3</li>
</ul>
JS:
<script type="text/javascript">
var nodes = document.getElementsByTagName("li");
for(i = 0;i<nodes.length;i+= 1){
nodes[i].onclick = (function(i){
return function() {
console.log(i);
} //不用閉包的話,值每次都是4 })(i);
}
</script>
然后我們看看下面的一段代碼,這是對閉包作用的非常直白的描述:
function say667() {// Local variable that ends up within closure
var num = 666;
var sayAlert = function() {
alert(num);
}
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()//執行結果應該彈出的667
執行say667()后,say667()閉包內部變數會存在,而閉包內部函式的內部變數不會存在
使得Javascript的垃圾回識訓制GC不會識訓say667()所占用的資源
因為say667()的內部函式的執行需要依賴say667()中的變數
70、javascript 代碼中的"use strict";是什么意思 ? 使用它區別是什么?
除了正常運行模式,ECMAscript 5添加了第二種運行模式:“嚴格模式”(strict mode),
顧名思義,這種模式使得Javascript在更嚴格的條件下運行,
為什么用嚴格模式
- 消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
- 消除代碼運行的一些不安全之處,保證代碼運行的安全;
- 提高編譯器效率,增加運行速度;
- 為未來新版本的Javascript做好鋪墊,
"嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向,包括IE 10在內的主流瀏覽器,都已經支持它,許多大專案已經開始全面擁抱它,
另一方面,同樣的代碼,在"嚴格模式"中,可能會有不一樣的運行結果;一些在"正常模式"下可以運行的陳述句,在"嚴格模式"下將不能運行,掌握這些內容,有助于更細致深入地理解Javascript,讓你變成一個更好的程式員,
進入標志
"use strict";
如何呼叫
(1)針對單個腳本
<script>
"use strict";
console.log("這是嚴格模式,");
</script>
(2)針對單個函式
function strict(){
"use strict";
return "這是嚴格模式,";
}
function notStrict() {
return "這是正常模式,";
}
語法與行為改變
嚴格模式對Javascript的語法和行為,都做了一些改變,
5.1 全域變數顯式宣告
在正常模式中,如果一個變數沒有宣告就賦值,默認是全域變數,嚴格模式禁止這種用法,全域變數必須顯式宣告,
"use strict";
v = 1; // 報錯,v未宣告
for(i = 0; i < 2; i++) { // 報錯,i未宣告
}
因此,嚴格模式下,變數都必須先用var命令宣告,然后再使用, 禁止this關鍵字指向全域物件
function f(){
return !this;
}
// 回傳false,因為"this"指向全域物件,"!this"就是false
function f(){
"use strict";
return !this;
}
// 回傳true,因為嚴格模式下,this的值為undefined,所以"!this"為true,
//因此,使用建構式時,如果忘了加new,this不再指向全域物件,而是報錯,
function f(){
"use strict";
this.a = 1;
};
f();// 報錯,this未定義
禁止洗掉變數
嚴格模式下無法洗掉變數,只有configurable設定為true的物件屬性,才能被洗掉,
"use strict";
var x;
delete x; // 語法錯誤
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 洗掉成功
物件不能有重名的屬性
正常模式下,如果物件有多個重名屬性,最后賦值的那個屬性會覆寫前面的值,嚴格模式下,這屬于語法錯誤,
"use strict";
var o = {
p: 1,
p: 2
}; // 語法錯誤
函式不能有重名的引數
正常模式下,如果函式有多個重名的引數,可以用arguments[i]讀取,嚴格模式下,這屬于語法錯誤,
"use strict";
function f(a, a, b) { // 語法錯誤
return ;
}
71、如何判斷一個物件是否屬于某個類?
javascript中檢測物件的型別的運算子有:typeof、constructor、instanceof,
typeof:typeof是一個一元運算子,回傳結果是一個說明運算元型別的字串,如:“number”,“string”,“boolean”,“object”,“function”,“undefined”(可用于判斷變數是否存在), 但 typeof 的能力有限,其對于Date、RegExp、Array型別回傳的都是"object",所以它只在區別物件和原始型別的時候才有用,要區一種物件型別和另一種物件型別,必須使用其他的方法,
instanceof 運算子:instanceof 運算子要求其左邊的運算元是一個物件,右邊的運算元是物件類的名字或建構式,如果 object 是 class 或建構式的實體,則 instanceof 運算子回傳 true,如果 object 不是指定類或函式的實體,或者 object 為 null,則回傳 false,instanceof方法可以判斷變數是否是陣列型別,但是只限同一全域環境之內,在一個頁面有多個iframe的情況下,instanceof失效,
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car);
// expected output: true
console.log(auto instanceof Object);
// expected output: true
constructor 屬性: JavaScript中,每個物件都有一個constructor屬性,它參考了初始化該物件的建構式,常用于判斷未知物件的型別,如給定一個求知的值 通過typeof運算子來判斷它是原始的值還是物件,如果是物件,就可以使用constructor屬性來判斷其型別,
<script type="text/javascript">
var test=new Array();
if (test.constructor==Array)
{
document.write("This is an Array");
}
if (test.constructor==Boolean)
{
document.write("This is a Boolean");
}
if (test.constructor==Date)
{
document.write("This is a Date");
}
if (test.constructor==String)
{
document.write("This is a String");
}
/輸出
This is an Array
</script>
Object.prototype.toString.call():該方法是目前為止發現的判斷一個物件型別的最好的辦法,
72、Javascript中,有一個函式,執行時物件查找時,永遠不會去查找原型,這個函式是?
hasOwnProperty
74、js延遲加載的方式有哪些?
js的延遲加載有助與提高頁面的加載速度,以下是延遲加載的幾種方法:
(1)使用setTimeout延遲方法的加載時間
延遲加載js代碼,給網頁加載留出更多時間
<script type="text/javascript" >
function A(){
$.post("/lord/login",{name:username,pwd:password},function(){
alert("Hello");
});
}
$(function (){
setTimeout('A()', 1000); //延遲1秒
})</script>
(2)讓js最后加載
例如引入外部js腳本檔案時,如果放入html的head中,則頁面加載前該js腳本就會被加載入頁面,而放入body中,則會按照頁面從上倒下的加載順序來運行javascript的代碼~~~ 所以我們可以把js外部引入的檔案放到頁面底部,來讓js最后引入,從而加快頁面加載速度
(3)上述方法2也會偶爾讓你收到Google頁面速度測驗工具的“延遲加載javascript”警告,所以這里的解決方案將是來自Google幫助頁面的推薦方案,
//這些代碼應被放置在</body>標簽前(接近HTML檔案底部)
<script type="text/javascript">
function downloadJSAtOnload() {
var element = document.createElement("script");
element.src = "defer.js";
document.body.appendChild(element);
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
這段代碼意思是等到整個檔案加載完后,再加載外部檔案“defer.js”,
使用此段代碼的步驟:
1).復制上面代碼
2).粘貼代碼到HTML的標簽前 (靠近HTML檔案底部)
3).修改“defer.js”為你的外部JS檔案名
4).確保你檔案路徑是正確的,例如:如果你僅輸入“defer.js”,那么“defer.js”檔案一定與HTML檔案在同一檔案夾下,
注意:這段代碼直到檔案加載完才會加載指定的外部js檔案,因此,不應該把那些頁面正常加載需要依賴的javascript代碼放在這里,而應該將JavaScript代碼分成兩組,一組是因頁面需要而立即加載的javascript代碼,另外一組是在頁面加載后進行操作的javascript代碼(例如添加click事件或其他東西),這些需等到頁面加載后再執行的JavaScript代碼,應放在一個外部檔案,然后再引進來,
75、同步和異步的區別?
同步:
同步的思想是:所有的操作都做完,才回傳給用戶,這樣用戶在線等待的時間太長,給用戶一種卡死了的感覺(就是系統遷移中,點擊了遷移,界面就不動了,但是程式還在執行,卡死了的感覺),這種情況下,用戶不能關閉界面,如果關閉了,即遷移程式就中斷了,
異步:
將用戶請求放入訊息佇列,并反饋給用戶,系統遷移程式已經啟動,你可以關閉瀏覽器了,然后程式再慢慢地去寫入資料庫去,這就是異步,但是用戶沒有卡死的感覺,會告訴你,你的請求系統已經回應了,你可以關閉界面了,
同步,是所有的操作都做完,才回傳給用戶結果,即寫完資料庫之后,在相應用戶,用戶體驗不好,
異步,不用等所有操作等做完,就相應用戶請求,即先相應用戶請求,然后慢慢去寫資料庫,用戶體驗較好,
異步操作例子:
為了避免短時間大量的資料庫操作,就使用快取機制,也就是訊息佇列,先將資料放入訊息佇列,然后再慢慢寫入資料庫,
引入訊息佇列機制,雖然可以保證用戶請求的快速回應,但是并沒有使得我資料遷移的時間變短(即80萬條資料寫入mysql需要1個小時,用了redis之后,還是需要1個小時,只是保證用戶的請求的快速回應,用戶輸入完http url請求之后,就可以把瀏覽器關閉了,干別的去了,如果不用redis,瀏覽器不能關閉),
同步就沒有任何價值了嗎?
銀行的轉賬功能, 哈哈哈哈哈 不轉完你放得下心嗎?
后續還在陸續更新~~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/225363.html
標籤:其他
上一篇:Javascripe問題
