JavaScript和ajax執行順序比較

一、JavaScript在HTML中的加載順序

1. 正常網頁加載流程

從上到下運行,先解析<head>標籤中的代碼

  • <head>標籤中會包含一些引用外部文件的代碼,從開始運行就會下載這些被引用的外部文件。當遇到<script>標籤時,瀏覽器暫停解析(不是暫停下載),將控制權交給JavaScript引擎(解釋器)。
      如果<script>標籤引用了外部腳本,就下載該腳本,否則就直接執行,執行完畢後將控制權交給瀏覽器渲染引擎。
  • <head>中代碼解析完畢,會開始解析<body>中的代碼。如果此時<head>中引用的外部文件沒有下載完,將會繼續下載。瀏覽器解析<body>代碼中的元素,會按照<head>中聲明一部分樣式去解析。
      如果此時遇到<body>標籤中的<script>,同樣會將控制權交給JavaScript引擎來解析JavaScript。解析完畢後將控制權交還給瀏覽器渲染引擎,當body中的代碼全部執行完畢並且整個頁面的css樣式加載完畢後,css會重新渲染整個頁面的html元素。
  • 如果在<body>加載完之前寫JavaScript 可能會造成JavaScript 找不到頁面元素。經常將<script>寫到head中,body中不會有大量的JS代碼,body中的html代碼結構會比較清晰。

2. 加載JavaScript過程

  • 瀏覽器加載JavaScript時有個特點,那就是載入之後立即就會執行(先編譯後執行),因爲JavaScript可能會影響DOM樹的結構,所以瀏覽器在執行完後才能繼續加載下面的HTML內容,即瀏覽器下載並執行JavaScript的過程會阻塞DOM樹的繼續建立;

  • JavaScript中$(function() {....})是jQuery 中的經典用法,即在頁面加載完成後才執行某個函數。如果函數中要操作DOM,在頁面加載完成後再執行會更安全,$(document).ready()裏的代碼也是在頁面內容都加載完才執行的;

  • 如果把代碼直接寫到<script>標籤裏,當頁面加載完這個script標籤就會執行裏邊的代碼;此時如果你標籤裏執行的代碼調用了當前還沒加載過來的代碼或者DOM,就會報錯。當然如果你把script標籤放到頁面最後面那麼就沒問題了,此時和ready效果一樣,不過不建議這麼寫。

3. Window onload和Document ready的區別

window onload是整個頁面(包括資源文件)加載完成,document ready是整個DOM結構樹解析渲染完成,比如你有個特別大的圖片,圖片還沒有加載出來 document 可能已經 ready 了,但圖片加載完了 window 才 onload。

  • 即Window onload 是 dom樹 + 資源文件,加載完成之後才執行;
  • Document ready是 dom樹 結構繪製完畢就執行。

4. $(...)document.getElementBy...的區別?

答: $(#id) 得到的是jQuery 對象,是一個對dom 進行包裝的對象,如html() 是jQuery 對象的方法。
document.getElementById(…) 是dom 對象,可以看作javascript 自帶的對象。

$("#...").htm(); 	等價於 document.getElementById("...").innerHTML
$("#...").html("更改span內容");      等價於 document.getElementById("...").innerHTML="更改span內容“;

一個是JS對象,一個是jQuery對象,可互相轉換:

var jsObj = $("#xx")[0];
jsObj = $("#xx").get(0);
var jsObj1 = document.getElementById("xx");
var $jqueryObj = $(jsObj);

二、ajax在js文件中的執行順序

$(function(){
	
	$.ajax({  
		url: "index.aspx/login",
		data: "{}",
		type : 'post',
		dataType : "json",
	    async:true,   		               //異步請求
        //alert("3.第三步執行"),     不行這裏不能寫函數操作或者其他
	      
		success: function(result){  
	    	if(result!=null){
		    	getsuccess();
			}
			alert("3.success成功返回結果再執行裏面的操作,所以是第4步");
		}
    });
	alert("1.因爲ajax設置了異步請求,這一步先執行");
	alert("2.順序執行第二步");
});

問:點擊頁面上一個按鈕,觸發電機事件函數,函數中有多個ajax(沒有嵌套),其中一個請求會不會等待另一個請求執行完畢之後再執行?

答:這兩個異步請求會同時發送,至於執行的快與慢,要看響應的數據量的大小及後臺邏輯的複雜程度。從異步請求的執行原理來看,我們知道當一個異步請求發送時,瀏覽器不會處於鎖死、等待的狀態,從一個異步請求發送到獲取響應結果的期間,瀏覽器還可以進行其它的操作,這就意味着多個異步請求的執行時並行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章