1. 程式人生 > >JS的覆蓋特性來解決檔案衝突問題,css的載入問題

JS的覆蓋特性來解決檔案衝突問題,css的載入問題

隨著專案規模的增大,協作開發也越來越長見,協作開發時間久了就會遇到一個噁心的檔案衝突問題。
假設一個HTML檔案引用了兩個外部JS檔案,而這兩個外部JS檔案你沒有修改的許可權,你只有HTML檔案的修改許可權,

兩個外部JS檔案都定義了window.onload事件。程式碼假設如下:

<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>

a.js的檔案內容:
window.onload=function(){
alert("這是a.js的");
}

b.js的檔案內容:
window.onload=function(){
alert("這是b.js的");
}

這樣的話,在a.js定義的window.onload事件會被b.js定義的window.onload事件覆蓋掉。
如果我們想a.js和b.js中的window.onload都能正常執行,該怎麼辦呢???
我們知道JS有這樣的特性:後面定義的同名變數會覆蓋掉前面定義的同名變數的值而不報錯,還有可以自定義變數 其值為系統函式的引用。
得到的變數跟系統函式的功能一樣。
好了,我們就利用JS的這個特性,有的人認為這是JS設計的Bug,至少在這個時候這個特性還是有點用處的。

我們新改的程式碼如下

<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" >
var aa=window.onload;//得到已經定義的window.onload事件處理程式的控制代碼或者說引用 這裡面儲存了a.js定義的window.onload事件的邏輯操作。
window.onload=null;//把window.onload的事件處理程式登出,這樣系統就不會再執行window.onload函數了。
</script>
<script type="text/javascript" src="b.js"></script>
<script type="text/javascript" >
var bb=window.onload;//得到已經定義的window.onload事件處理程式的控制代碼或者說引用 這裡面儲存了b.js定義的window.onload事件的邏輯操作。
window.onload=null;//把window.onload的事件處理程式登出,這樣系統就不會再執行window.onload函數了。
</script>
window.onload=function(){
aa();bb();//重新註冊window.onload事件,執行的程式碼邏輯為a.js和b.js中定義的程式碼操作。
}

CSS檔案樣式衝突也可以使用這種方法解決。
假設你的HTML載入了a.css b.css。 b.css中的某一個樣式規則覆蓋了a.css中的樣式。而你只有修改a.css的許可權,沒有修改b.css的許可權
而且css檔案載入順序必須是先a.css然後才b.css .這時候該怎麼辦呢??
不要慌!這時候你可以按照上面JS檔案衝突的思路解決這個問題。
因為CSS也有這樣的特性:後面定義的規則覆蓋前面定義的同名規則。
這時候你只需要在b.css後面新建一個style 裡面寫上你想要覆蓋的CSS規則 裡面寫新的樣式規則即可。

在樣式定義有衝突時的優先順序如何分配
具體步驟: 


<style> 
div{color:black} 
#demo{color:red} 
.demo{color:blue} 
.demo1{color:yellow !important} 
.demo2{color:gray} 
</style> 
<div>color:black</div> 
<div class="demo">color:blue</div> 
<div class="demo demo2">color:gray</div> 
<div id="demo" class="demo">color:red</div> 
<div id="demo" class="demo" style="color:green"> 
color:green</div> 
<div id="demo" class="demo1" style="color:green"> 
color:yellow</div> 


可以看出,以類選擇符方式定義的樣式的優先順序最低,其實是型別選擇符的,再就是ID選擇符,然後到直接在物件上定義的,加了! important宣告的優先順序最高。 
提示:如果還有連結外部的CSS,它的優先順序是最低的。

CSS樣式的優先順序遵循的是就近原則,理論上的是離物件越近,優先級別越高,但需要注意的是用! important宣告的優先順序最高,同一方式定義的CSS則以最後定義的為準。