【前端狂虐系列】近期前端開發小結

作爲一個寫後臺Java比較多的人,最近有開發前端的需求:切換聊天對象,聊天界面的內容也要隨之切換。。目前初具成效,然而也是心酸。。。。。。。。用這個小筆記來記錄下一些印象比較深刻的點吧,以供參考~

 

1. top.或parent.

如果一個頁面B是被A頁面所包圍,並且B頁面有自己的js,如果A頁面的js想獲取B頁面的dom元素,需要使用

top.$("你的選擇器")或parent.$("你的選擇器")去獲得。但需注意,A頁面的js無法直接調用B頁面的js函數

——常見於一個iframe嵌入父頁面中

父頁面想要獲取子頁面如iframe裏面的元素:$(window.frames[0].document.getElementById("元素id"))

iframe想獲取所在父頁面的js的全局變量,可用parent.js變量名獲取

 

2.情景需求是切換右側的聊天對象,左側的聊天面板的顯示也隨着切換(類似QQ聊天窗口)

默認左側會有一個聊天窗口的div,當選中右側聊天對象時,就clone出一個div,並且修改其id屬性,顯示當前div並隱藏其他div:

var currMsg = top.$("#record").val();

if((!$("#" + msg))) {

$contentDiv = top.$("#message").clone();

$contentDiv.attr("id", msg);

top.$(".dialogue-record").append($contentDiv);

};

top.$("#"+msg+"").siblings().hide();

top.$("#"+msg+"").show();

 

1)其中$("#message")是默認存在的聊天窗口div。currMsg用來獲取當前選中的聊天對象的id, if(!$("#" + msg))目的在於控制無限制的clone並append。

 

2)siblings用於獲取兄弟節點(當然不包含自己),也可以用$("父元素的選擇器").not("你的選擇器")來排除,只不過性能上不是很理想

3)clone是用於複製一個jquery對象,後續可以通過attr去修改屬性;注意addClass

 

3.addClass無效?

我給一個div增加一個onclick屬性,如:onclick = "switch(this)", this可以獲取到當前onclick的dom對象。然後在switch裏用addClass方法去增加樣式,這樣是生效的。

但是當你其他地方也想觸發switch方法,並且不是通過onclick去觸發的,如果你想當然的通過獲取到目標dom對象的html字符串如

var e = "<div>...</div>"然後當作參數傳遞給switch,發現addClass並不會生效!原因是switch方法的參數是隻能獲取到onclick事件的上下文(在對哪個dom對象onclick),

所以你把目標dom對象的html字符串傳遞過去是無效的,解決辦法是加一個屬性(id, data-name等)在dom對象上:

var e = '<div class="serviceInfo-list" name="on" data-username="'+msg.userName+'" onclick="switch(\''+msg.userName+'\')">'; (注意這裏對單引號的轉義。。)

用該屬性值去代替this傳遞參數,然後在switch方法裏通過選擇器來獲取即可~

var $target = $("div[data-username='" + msg + "']")

注:addClass和removeClass的操作只適合已經被append到dom上的元素~

 

4.js函數沒有重載

當js函數同名,但參數聲明不一樣時,根據加載順序會覆蓋之前同名的函數,如:

test("hello", "morning");

 

function test(a) {

console.log("a:" + a);

}

 

function test(a, b) {

console.log("a:" + a + ", b:" + b);

}

結果:a:hello, b:morning

說明在調用test函數時,以test(a, b)爲準~

 

而這樣:

test("hello", "morning");

 

function test(a, b) {

console.log("a:" + a + ", b:" + b);

}

 

function test(a) {

console.log("a:" + a);

}

結果:a:hello

說明在調用test函數時,以test(a)爲準~

 

對於情形二,可能不會有test(a),但是定義一個參數較多的js函數,而調用這個js函數的時候,有的地方只傳遞部分參數(這種情況之前沒怎麼遇到,但是是存在的),

有的地方傳遞全部參數,需注意參數的對應是按順序來的。。

 

5.json結構的數據

類似Java的map,當之前沒有這個key時,相當於新增一個鍵值對;當之前存在這個key時,相當於修改這個鍵值對的value。

 

6.循環過多頁面卡死

避免在循環中過多使用全局變量,注意全局變量的管理(類似Java的全局變量和局部變量,js的局部變量的“生命週期”是代碼段,而全局變量是一直存在直到你刷新/關閉頁面的)

 

7.刪除json的某個鍵值對

直接用delete json.key(非面向對象型語法)

 

8.用jquery選擇器判斷html元素是否存在

用jquery的選擇器if ($("你的選擇器"))是無法判斷的,因爲即使元素不存在,$("你的選擇器")是一定會返回值的,要用$("你的選擇器")==0來判斷(爲0表示不存在,不爲0表示存在~)

<div id="test"></div>

 js:

$(function() {
	console.log($("#test2"));
	console.log($("#test2").length);
	
	console.log($("#test"));
	console.log($("#test").length);
});

 id爲test2的dom是不存在的,打印結果:

init {context: document, selector: "#test2"}

0

test.jsp:13 [div#test, context: document, selector: "#test"]

1

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