題目1: jQuery 中, $(document).ready()是什么意思杈笔?
定義和用法:
當 DOM(文檔對象模型) 已經加載,并且頁面(包括圖像)已經完全呈現(xiàn)時,會發(fā)生 ready 事件逗旁。
由于該事件在文檔就緒后發(fā)生,因此把所有其他的 jQuery 事件和函數(shù)置于該事件中是非常好的做法舆瘪。
ready() 函數(shù)規(guī)定當 ready 事件發(fā)生時執(zhí)行的代碼片效。
ready() 函數(shù)僅能用于當前文檔,因此無需選擇器英古。
允許使用以下三種語法:
$(document).ready(function)
$().ready(function)
$(function)
jQuery中$(document).ready與Javascript中window.onload區(qū)別:
window.onload
:
window.onload在頁面的DOM加載完成淀衣,所有的圖片、子frame等所有的元素都加載完成的時候才會觸發(fā)召调。
$(document).ready()
:
$(document).ready方法發(fā)生在DOM樹構造完成膨桥,而不會等到其余的所有的元素都加載完成。其實說白了就是ready方法在onload之前發(fā)生唠叛,一般發(fā)生在DOM樹構造完成的時候只嚣。
具體一些,可以從以下幾方面對比$(document).ready和window.onload的區(qū)別:
1.執(zhí)行時間
window.onload
必須等到頁面內包括圖片的所有元素加載完畢后才能執(zhí)行艺沼。
$(document).ready
是DOM結構繪制完畢后就執(zhí)行册舞,不必等到圖片等資源加載完成后才執(zhí)行。
2.編寫個數(shù)不同
window.onload
不能同時編寫多個障般,如果有多個window.onload
方法调鲸,后面會覆蓋前面,并且只會執(zhí)行一個onload方法挽荡。
$(document).ready
可以同時編寫多個藐石,并且都可以得到執(zhí)行。
如下例:
window.onload = function(){
console.log("window.onload event1");
}
window.onload = function(){
console.log("window.onload event2");
}
$(document).ready(function(){
console.log("jquery ready event1");
})
$(document).ready(function(){
console.log("jquery ready event2");
})
執(zhí)行結果如下:
可以看出ready先于onload事件定拟。并且onload只能有一個贯钩,后面覆蓋前面,而ready恰好相反办素。
3.簡化寫法
window.onload沒有簡化寫法角雷。
$(document).ready(function(){})
可以簡寫成$(function(){});
在一些開發(fā)中,大多數(shù)時候性穿,第一行寫的是:
$(document).ready(function(){
//coding...
});
關于$(window).load:
$(window).load
與window.onload
其實沒什么大的區(qū)別
jquery API中提到$(window).load
方法是$(window).on('load',handler)
的shortcut,而且$(window).on('load',handler)
相當于window.onload
方法
$(window).load(function (){
// coding
});
//等價于 JavaScript 中的以下代碼
window.onload = function (){
// coding
}
如果真要說區(qū)別的
$(window).load(handler)
可以用多次使用勺三,并且handler都會依次執(zhí)行。但是window.onload就不行需曾,就像上面介紹的一樣,window.onload = handler
后面的hanlder會覆蓋之前的handler吗坚。
注意:由于在$(document).ready()方法內注冊的事件祈远,只要 DOM 就緒就會被執(zhí)行,因此可能此時元素的關聯(lián)文件未下載完商源。例如與圖片有關的 html 下載完畢车份,并且已經解析為 DOM 樹了,但很有可能圖片還沒有加載完畢牡彻,所以獲取圖片的高度和寬度這樣的屬性此時不一定有效扫沼。要解決這個問題,可以使用 jquery 中另一個關于頁面加載的方法 ---load() 方法庄吼。 Load() 方法會在元素的 onload 事件中綁定一個處理函數(shù)缎除。如果處理函數(shù)綁定給 window 對象,則會在所有內容 ( 包括窗口总寻、框架器罐、對象和圖像等 ) 加載完畢后觸發(fā),如果處理函數(shù)綁定在元素上渐行,則會在元素的內容加載完畢后觸發(fā)轰坊。
用原生JS實現(xiàn)jQuery的ready方法
那么,對于某些特殊需求祟印,不希望使用jQuery衰倦,但又想實現(xiàn)jQuery的ready方法。該如何用原生JS實現(xiàn)jQuery的ready方法呢旁理?下面是其中之一的做法:
function ready(fn){
if(document.addEventListener){
//標準瀏覽器
document.addEventListener('DOMContentLoaded',function(){
//注銷事件樊零,避免反復觸發(fā)
document.removeEventListener('DOMContentLoaded',arguments.callee,false);
//執(zhí)行函數(shù)
fn();
},false);
}else if(document.attachEvent){
//IE瀏覽器
document.attachEvent('onreadystatechange',function(){
if(document.readyState=='complete'){
document.detachEvent('onreadystatechange',arguments.callee);
//執(zhí)行函數(shù)
fn();
}
});
}
}
下面用一段代碼驗證ready函數(shù)的正確性:
window.onload = function(){
console.log("window.onload event");
}
ready(function(){
console.log('window ready event')
})
執(zhí)行效果如下:
題目2: $node.html()和$node.text()的區(qū)別?
相同點:
html()和text()都是讀寫兩用方法。-
區(qū)別:
- html()對jQuery對象的html進行操作孽文,相當于原生js的innerHTML驻襟;text()對jQuery對象的text進行操作,相當于原生js的innerText
- 沒有傳遞參數(shù)時芋哭,html()獲取的是第一個匹配元素的innerHTML沉衣;text()獲取的是所有匹配元素的innerText
- 傳遞了string參數(shù)時,html()修改所有匹配元素的innerHTML為參數(shù)值减牺,text()修改所有匹配元素的innerText為參數(shù)值
如例:
<body>
<ul>
<li><span>item1 </span></li>
<li><span>item2 </span></li>
<li><span>item3 </span></li>
</ul>
<script>
console.log($('li').html())//<span>item1 </span>
console.log($('li').text())//item1 item2 item3
console.log($('li').html('<span>insert span</span>'))//
console.log($('li').text('insert text'))//
</script>
</body>
下面代碼打印結果:
console.log($('li').html())//<span>item1 </span>
console.log($('li').text())//item1 item2 item3
下面代碼打印結果:
console.log($('li').html('<span>insert span</span>'))
console.log($('li').text('insert text'))
題目3: $.extend 的作用和用法?
定義
jQuery.extend() 函數(shù)用于將一個或多個對象的內容合并到目標對象豌习。相同屬性后面對象的值覆蓋前面對象的值,target將被修改并通過$.extend()返回拔疚。參數(shù) deep 為布爾值true/false肥隆,用來設置合并操作是否遞歸(深拷貝)。$.extend( [deep ], target, object1 [, objectN ] )
注意:
- 如果只為$.extend()指定了一個參數(shù)稚失,則意味著參數(shù)target被省略栋艳。此時,target就是jQuery對象本身句各。通過這種方式吸占,我們可以為全局對象jQuery添加新的函數(shù)晴叨。
- 如果多個對象具有相同的屬性,則后者會覆蓋前者的屬性值矾屯。
用法:
如果我們想保留原對象兼蕊,可通過傳遞一個空對象作為目標對象:
var object = $.extend({}, object1, object2); //將object1, object2合并到{}中
默認$.extend()
合并操作是淺復制,如果第一個對象的屬性本身是一個對象或數(shù)組件蚕,那么它將完全用第二個對象相同的key重寫一個屬性孙技。這些值不會被合并。如果將 true作為該函數(shù)的第一個參數(shù)骤坐,那么會在對象上進行遞歸的合并绪杏。語法:
$.extend( target [, object1 ] [, objectN ] )
如例:
<script>
var object1 = {
amy: 0,
tom: {
height: 180, user: {
age: 20
}
},
}
var object2 = {
jim: 100,
tom: {
weight: 100, user: {
age: 100
}
}
}
console.log($.extend(object1, object2))//淺復制下愈,將object2合并到object1中
console.log(object1)//object1為返回的最終結果
console.log(object2)//object2值不變
console.log($.extend(true, object1, object2))//深復制纽绍,將object2合并到object1中
</script>
打印結果:
console.log($.extend(object1, object2))
//淺復制,將object2合并到object1中,tom對象屬性完全被object2中的tom屬性取代
console.log(object1)//object1為返回合并后的最終結果
console.log(object2)//object2值不變
console.log($.extend(true, object1, object2))
//深復制势似,將object2合并到object1中
關于深復制和淺復制的區(qū)別參考:https://www.cnblogs.com/tracylin/p/5346314.html
題目4: jQuery 的鏈式調用是什么拌夏?
鏈式調用適用于異步編程,可避免線程阻塞履因,實現(xiàn)原理是在當前函數(shù)執(zhí)行完后return this障簿,即返回該函數(shù)的執(zhí)行環(huán)境,下一個函數(shù)就可以繼續(xù)在這個函數(shù)下運行了栅迄,結果就是多種方法在一個jQuery對象上一個接一個地調用
示例:
<body>
<p>hello world</p>
<h2>bybe world</h2>
<script>
$('p').on('mouseenter', function () {
$(this).css('background-color', 'red')
}).on('mouseleave', function () {
$(this).css('background-color', 'blue')
}).parents('body').find('h2').toggle(500)
</script>
</body>
執(zhí)行效果:
本例中站故,mouseenter和mouseleave是事件監(jiān)聽,只有事件觸發(fā)后才會執(zhí)行相應函數(shù)中的代碼毅舆,屬于異步執(zhí)行西篓,與以上所說的在同一jQuery上一個接一個地調用方法并不沖突。
結果就是無論如何js引擎都會先執(zhí)行
$('p').parents('body').find('h2').toggle(500)
切換h2的顯示狀態(tài)為隱藏憋活,再根據(jù)用戶是否觸發(fā)鼠標事件來計算結果岂津。
題目5: jQuery 中 data 函數(shù)的作用?
-
jquery data()的作用
data() 方法向被選元素附加數(shù)據(jù),或者從被選元素獲取數(shù)據(jù)悦即。
通過data()函數(shù)存取的數(shù)據(jù)都是臨時數(shù)據(jù)吮成,一旦頁面刷新,之前存放的數(shù)據(jù)都將不復存在辜梳。
該函數(shù)屬于jQuery對象(實例)粱甫。如果需要移除通過data()函數(shù)存放的數(shù)據(jù),請使用 removeData() 函數(shù)作瞄。
-
jquery data的使用方式
1魔种、獲取附加的data的值
$(selector).data(name)
參數(shù)說明
name
:可選。規(guī)定要取回的數(shù)據(jù)的名稱粉洼。
如果沒有規(guī)定名稱节预,則該方法將以對象的形式從元素中返回所有存儲的數(shù)據(jù)叶摄。
2、用name和value為對象附加數(shù)據(jù)
$(selector).data(name,value)
參數(shù)說明
selector
:為需要附加或者獲取數(shù)據(jù)的對象安拟。
name
:參數(shù)為數(shù)據(jù)的名稱蛤吓。
value
:參數(shù)為數(shù)據(jù)的值。
3糠赦、使用對象向元素附加數(shù)據(jù)
使用帶有名稱/值對的對象向被選元素添加數(shù)據(jù)会傲。
除了以提供 name 和 value 的方式進行賦值,我們還可以直接傳入另一個對象( “another” )作為參數(shù)拙泽。這種情況下淌山,“another” 的屬性名稱和屬性值將被視為多個鍵值對,從中提取的 “name” 和 “value” 都會被復制到目標對象的緩存中顾瞻。
$(selector).data(object)
參數(shù)說明
object
:必需泼疑。規(guī)定包含名稱/值對的對象。
示例:
$('body').data('name', 'haha')
$('body').data('hobby', { fav: 'music', love: 'chicken' })
$('body').data({ arr: [1, 2, 3, 4, 5] })
console.log($('body').data('name'))//haha
console.log($('body').data())
//{ name: "haha",hooby: { fav: "music", love: "chicken" },arr: [1,2,3,4,5] }
打印結果:
題目6:寫出以下功能對應的 jQuery 方法:
- 給元素 $node 添加 class active荷荤,給元素 $noed 刪除 class active
$node.addClass('active')
$node.removeClass('active')
- 展示元素$node, 隱藏元素$node
//方法1:
$node.show()
$node.hide()
//方法2:
$node.css('display','block')
$node.css('display','none')
//方法3:
//給node設置css屬性{display: none;},默認隱藏; 增加active屬性 node.active{display: block;}顯示
$node.addClass('active'); //顯示
$node.removeClass('active'); //隱藏
- 獲取元素$node 的 屬性: id退渗、src、title蕴纳, 修改以上屬性
//獲取屬性
$node.attr('id')
$node.attr('src')
$node.attr('title')
//修改屬性
$node.attr('id','newId')
$node.attr('src','newSrc')
$node.attr('title','newTitle')
- 給$node 添加自定義屬性data-src
$node.prop('data-src')
- 在$ct 內部最開頭添加元素$node
$ct.prepend($node)
//或
$node.prependTo($ct)
- 在$ct 內部最末尾添加元素$node
$ct.append($node)
//或者
$node.appenTo($ct)
- 刪除$node
$node.remove()
$ct.detach($node)
- 把$ct里內容清空
$ct.empty()
$ct.text('')
- 在$ct 里設置 html
<div class="btn"></div>
$ct.html('<div class="btn"></div>')
- 獲取会油、設置$node 的寬度、高度(分別不包括內邊距古毛、包括內邊距翻翩、包括邊框、包括外邊距)
獲取寬高:
//不包括內邊距
$node.width()
$node.height()
$node.css('width')
$node.css('height')
//包括內邊距
$node.innerWight()
$node.innerHeight()
//包括內邊距,包括邊框
$node.outerWidth() //不傳參數(shù)或參數(shù)為false
$node.outerHeight() //不傳參數(shù)或參數(shù)為false
//包括內邊距,邊框,外邊距
$node.outerWidth(true)
$node.outerHeight(true)
設置寬高:
//不包括內邊距
$node.width(100) //如果沒有規(guī)定長度單位稻薇,則使用默認的 px 單位
$node.height(100)
$node.css({width:'200px',height:'300px'})//設置元素的寬度和高度嫂冻,也可以不要引號和單位
//包括內邊距
$node.innerWidth(30)
$node.innerHeight(30)
//包括內邊距,包括邊框
$node.outerWidth(60)
$node.outerHeight(30)
//包括內邊距颖低,包括邊框絮吵,包括外邊距
$node.outerWidth(70,true)
$node.outerHeight(70,true)
- 獲取窗口滾動條垂直滾動距離
$(window).scrollTop()
- 獲取$node 到根節(jié)點水平、垂直偏移距離
$node.offset().left
$node.offset().top
- 修改$node 的樣式忱屑,字體顏色設置紅色蹬敲,字體大小設置14px
$node.css({
'color': 'red',
'font-size': '14px'
})
- 遍歷節(jié)點,把每個節(jié)點里面的文本內容重復一遍
$node.each(function(){
$(this).text($(this).text() + $(this).text())
})
- 從$ct 里查找 class 為 .item的子元素
$ct.find('.item')
$ct.children('.item')
- 獲取$ct 里面的所有孩子
$ct.children()
- 對于$node莺戒,向上找到 class 為'.ct'的父親伴嗡,再從該父親找到'.panel'的孩子
$node.parents('.ct').find('.panel')
- 獲取選擇元素的數(shù)量
$node.length
- 獲取當前元素在兄弟中的排行
node.index()
題目7:
- 用jQuery實現(xiàn)以下操作
- 當點擊$btn 時,讓 $btn 的背景色變?yōu)榧t色再變?yōu)樗{色
<body>
<button class="btn">按鈕</button>
<script>
var $btn = $('.btn')
$btn.on('click',function(){
$btn.css({
'background': 'red'
})
setTimeout(function(){
$btn.css({'background': 'blue'})
},500)
})
</script>
</body>
效果預覽:http://js.jirengu.com/maqihelosa/1/edit
- 當窗口滾動時从铲,獲取垂直滾動距離
<script>
$('.content').on('scroll',function(){
var num = $('.content').scrollTop()
$('span').text(num)
})
</script>
效果預覽:http://js.jirengu.com/bajivefije/1/edit
- 當鼠標放置到$div 上瘪校,把$div 背景色改為紅色,移出鼠標背景色變?yōu)榘咨?/li>
<script>
var $box = $('.box')
$box.on('mouseenter',function(){
$(this).css('background','red')
}).on('mouseleave',function(){
$(this).css('background','white')
})
</script>
效果預覽:http://js.jirengu.com/tayoxeyeye/1/edit
- 當鼠標激活 input 輸入框時讓輸入框邊框變?yōu)樗{色,當輸入框內容改變時把輸入框里的文字小寫變?yōu)榇髮戁逖铮斴斎肟蚴ソ裹c時去掉邊框藍色泣懊,控制臺展示輸入框里的文字
<script>
var $input = $('.ipt')
$input.focus(function(){
$(this).css('border-color','blue')
.on('keyup',function(){
$(this).val($(this).val().toUpperCase())
})
})
$input.blur(function(){
$(this).css('border-color','black')
console.log($(this).val())
})
</script>
效果預覽:http://js.jirengu.com/likesomeca/1/edit
- 當選擇 select 后,獲取用戶選擇的內容
//html
<select>
<option value="1">item 1</option>
<option value="2">item 2</option>
<option value="3">item 3</option>
<option value="4">item 4</option>
<option value="5">item 5</option>
</select>
<p>用戶選取的內容是:<span>item</span></p>
//js
$('select').on('change', function () {
$('span').text($('select>option:selected').text())
})
效果預覽:http://js.jirengu.com/budugazave/1/edit