一:類名操作
完成幾個 DOM 元素類名操作的工具方法:
addClass(dom, name):給 dom 元素添加類名 name
removeClass(dom, name):把 dom 元素的類名 name 刪除
hasClass(dom, name):判斷 dom 元素是否有類名 name
~~~
const addClass = (dom, name) => {
dom.classList.add(name);
}
const removeClass = (dom, name) => {
dom.classList.remove(name);
}
const hasClass = (dom, name) => {
return dom.classList.contains(name)
}
~~~
二:循環調節列表
頁面上有這么一個列表:
<ul id='adjustable-list'>
<li>
<span>1</span>
<button class='up'>UP</button>
<button class='down'>DOWN</button>
</li>
<li>
<span>2</span>
<button class='up'>UP</button>
<button class='down'>DOWN</button>
</li>
<li>
<span>3</span>
<button class='up'>UP</button>
<button class='down'>DOWN</button>
</li>
...
</ul>
點擊 UP 按鈕會使得該 li 元素在列表中上升一個位置,點擊 DOWN 按鈕會使得該 li 元素下降一個位置。點擊最后的元素的 DOWN 按鈕會使得元素回到第一個位置,點擊第一個元素的 UP 按鈕會使其回到最后的位置。
頁面上已經存在該列表,你只需要完成 initAdjustableList() 函數,給元素添加事件。
答案:
~~~
const initAdjustableList = () => {
const $ul = $('#adjustable-list')
$ul.on('click', 'li .up', null, function () {
const $li = $(this).parent('li')
const index = $li.index()
move(index, -1)
})
$ul.on('click', 'li .down', null, function () {
const $li = $(this).parent('li')
const index = $li.index()
move(index, 1)
})
const move = (index, move) => {
const newIndex = index + move
const $moveItem = $ul.find('li').eq(index)
// throw {message: $ul.find('li').get().length}
if (newIndex < 0) {
$ul.append($moveItem)
} else if (newIndex >= $ul.find('li').get().length) {
$ul.prepend($moveItem)
} else {
const $targetItem = $ul.find('li').eq(newIndex)
// throw {message: 'fuck' + newIndex + index + move}
// $moveItem.detach()
if (move === 1) {
$targetItem.after($moveItem)
} else {
$targetItem.before($moveItem)
}
}
}
}
~~~
三: DOM標簽統計
完成 getPageTags 函數,判斷你的代碼所執行的頁面用到了哪些標簽。
例如,如果頁面中:
<html>
<head></head>
<body></body>
<script>...</script>
</html>
那么 getPageTags() 則返回數組 ['html', 'head' 'body', 'script'](順序不重要)。
答案:
~~~
const getPageTags = () => [...new Set([...document.getElementsByTagName('*')].map((value) => {return value.nodeName;}))]
~~~
四:獲取子元素屬性
完成 getChildAttributes 函數,它接受一個 DOM 元素作為參數和一個屬性名作為參數,你需要返回這個 DOM 的 直接 子元素的特定屬性列表。例如:
<ul id='list'>
<li data-name="Jerry" class="item"><span>1</span></li>
<li data-name="Lucy" class="item"><span>2</span></li>
<li data-name="Tomy"><span>3</span></li>
</ul>
getChildAttributes(el, 'data-name') // => ['Jerry', 'Lucy', 'Tomy']
getChildAttributes(el, 'class') // => ['item', 'item', null]
只需要完成 getChildAttributes 的編寫。
答案:
~~~
const getChildAttributes = (el, attr) => {
const attrs = []
const children = el.children
for (let i = 0, len = children.length; i < len; i++) {
const node = children[i]
attrs.push(node.getAttribute(attr))
}
return attrs
}
~~~
- 前端入門
- 前端入職須知
- 正確看待前端
- 前端自我定位
- pc與手機頁面差別
- 前端書單
- 前端技術棧
- 前端資源導航
- 前端切圖
- 插件
- 組件、控件和插件的區別
- 技術文檔
- layui
- layer彈框在實際項目中的一些應用
- 前端面試題
- bat面試題庫
- 中小公司的leader
- 項目相關
- 職業規劃如何
- 前端經典筆試題
- javascript基礎(一)
- JavaScript基礎二
- JavaScript基礎面試題(三)
- JavaScript基礎面試題(四)
- JavaScript基礎面試題(五)
- JavaScript基礎面試題(六)
- JavaScript基礎面試題(七)
- JavaScript基礎面試題(八)
- JavaScript基礎面試題(九)
- JavaScript基礎面試題(十)
- dom經典面試題
- 正則表達式
- 史上最難面試題
- 簡單算法
- 前端idea
- vsc快速上手指南
- 微信開發者工具
- sublime的使用
- hbuilder入門
- 前端那些事
- 前端的注釋該怎么寫
- 前端架構師是怎么煉成的
- 細數前端的那些技術大牛
- 前端leader的那些事
- ps
- 圖片類型及其區別
- 基本概念及其常用工具
- ps操作技巧
- ps站點資源導航
- ui站點導航
- html
- css
- js
- 插件庫
- git教程
- web
- web兼容思想
- ui框架
- 小程序
- 微信專題
- 支付寶專題