一:类名操作
完成几个 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框架
- 小程序
- 微信专题
- 支付宝专题