DOM
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口,定义了访问和操作 HTML 文档的标准。
事例参考的 HTML 结构
<div class="my-select">
<button id="selectBtn">选择</button>
<ul class="select-list">
<li>
<input id="countryInput" type="text" name="country" placeholder="请输入">
<button id="addCountry">确定</button>
</li>
<li class="select-item" data-value="中国">中国</li>
<li class="select-item" data-value="美国">美国</li>
<li class="select-item" data-value="英国">英国</li>
<li class="select-item" data-value="德国">德国</li>
</ul>
</div>
获取元素
- document.getElementById [原生]
- document.getElementsByClassName [原生]
var selectBtn = document.getElementById('selectBtn');
var selectItems = document.getElementsByClassName('select-item');
- querySelector ( 兼容IE8以上浏览器 ) [原生,通过选择器获取]
var selectBtn = document.querySelector('#selectBtn');
var selectItems = document.querySelectorAll('.select-item');
注意:querySelector 只返回一个元素,如果参数为class选择器元素,同样返回一个元素。
- $(seletor) ( JQuery2.x 开始兼容IE9 以上浏览器,使用前请先引入 JQuery ) [jQuery]
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
var selectBtn = $('#selectBtn');
var selectItems = $('.select-item');
获取元素常用的几种方法,获取到元素可以在控制台console打印一下,会发现通过 class 类获取的元素为数组形式。
获取元素的父级元素
- parentNode
var selectBtn = document.querySelector('#selectBtn'); // 获取按钮元素
var mySelect = selectBtn.parentNode; // 按钮元素的父级元素,就是 my-select 元素
- jQuery
var selectBtn = $('#selectBtn');
var mySelect = selectBtn.parent();
获取元素中的子元素
- children
var mySelect = document.getElementsByClassName('my-select')[0]; // 获取my-select 元素
var selectChildren = mySelect.children; // 获取 my-select 下的子元素,包含一个 button 元素 和 ul 元素。
- children()
var selectList = $('.my-select');
var selectChildren = selectList.children(); // 获取 my-select 下的子元素,包含一个 button 元素 和 ul 元素
var selectList = selectList.children('.select-list'); // 获取 my-select 下,class 为 select-list 的子元素
- find()
var selectList = $('.my-select');
var selectItems = selectList.find('.select-item'); // 获取my-select 下,class 为 select-item 的元素
jQuery 中 find() 和 children() 的区别在于,children 匹配的是子元素,而 find 匹配的不仅仅是子元素,还包括子元素里面的子孙元素。
获取元素的相关元素
原生方法
- childElementCount 返回子元素的个数
- firstElementChild 返回第一个子元素
- lastElementChild 返回最后一个子元素
- previousElementSiblimg 返回前一个同辈元素
- nextElementSiblimg 返回后一个同辈元素
jQuery方法
- first()
- last()
- prev()
- next()
获取元素属性
- getAttribute [原生]
var firstItem = document.getElementsByClassName('select-item')[0];
var value = firstItem.getAttribute('data-value');
console.log(value); // 中国
getElementsByClassName 获取的是一个类的元素组合,可以同数组第0项的方式获取组合中第一个元素。然后通过元素的 getAttribute 方法获取其 data-value 和 data-id 属性。
如果该元素为 input 元素,其 value 属性需要过其元素中 value 属性获取。例如:我们在输入框输入"测试",然后通过运行以下代码
var inputElement = document.getElementById('countryInput');
var value = inputElement.value;
console.log(value); // 测试
- attr [jQuery]
var firstItem = $('.select-item').eq(0);
var value = firstItem.attr('data-value');
console.log(value); // 中国
在 jQuery 同样 $('.select-item') 获取到的也是一个类元素组合,如果通过第 0 项的方式获取,则我们会获取到一个原生的对象。如果想继续使用 jQuery 方法,可以通过其 eq(n) 方法来获取第 n 项,返回 n 项的 jQuery 元素对象,继续使用其 attr() 方法来获取属性值。
如果获取的属性值以 data- 前缀开头,例如事例中的 data-value ,可以使用 data() 方法来获取其里面的属性值。例如:
var firstItem = $('.select-item').eq(0);
var value = firstItem.data('value');
console.log(value); // 中国
在表单元素中,jQuery 可以通过 val() 方法获取其 value 值。同理在输入框输入"测试",然后通过运行以下代码:
var inputElement = $('#countryInput');
var value = inputElement.val();
console.log(value); // 测试
获取元素位置及大小
- 原生
let elem = document.getElementById('elem');
let offsetTop = elem.offsetTop;
let offsetLeft = elem.offsetLeft;
let offsetHeight = elem.offsetHeight;
let offsetWidth = elem.offsetWidth;
// offsetWidth 为元素的宽度,包含 border + padding + content;
// offsetHeight 为元素的高度,包含 border + padding + content;
// offsetTop 为元素相对于有定位的父元素的上偏移量,会一直找到根节点;
// offsetLeft 为元素相对于有定位的父元素的左偏移量,会一直找到根节点;
let clientHeight = elem.clientHeight;
let clientWidth = elem.clientWidth;
// clientHeight 为元素内容的高度,包含 padding + content;
// clientWidth 为元素内容的宽度,包含 padding + content;
let scrollWidth = elem.scrollWidth;
let scrollHeight = elem.scrollHeight;
let scrollLeft = elem.scrollLeft;
let scrollTop = elem.scrollTop;
// scrollWidth 为元素的视口宽度;
// scrollHeight 为元素的视口高度;
// scrollLeft 为元素的元素视图横向滚动的距离;
// scrollTop 为元素的元素视图纵向滚动的距离;
let rect = elem.getBoundingClientRect();
let rectTop = rect.top;
let rectBottom = rect.bottom;
let rectLeft = rect.left;
let rectRight = rect.right;
let rectWidth = rect.width;
let rectHeight = rect.height;
// rectTop 为元素上边距离浏览器顶部的距离
// rectBottom 为元素下边距离浏览器顶部的距离
// rectLeft 为元素左边距离浏览器左侧的位置
// rectRight 为元素右边距离浏览器左侧的位置
// rectWidth 为元素的宽度,包含 border + padding + content;
// rectHeight 为元素的高度,包含 border + padding + content;
- jQuery
$('#elem').height(); // 元素内容的高度,仅包含 content
$('#elem').width(); // 元素内容的宽度,仅包含 content
$('#elem').offset().top; // 元素距离浏览器视图顶部的距离
$('#elem').offset().left; // 元素距离浏览器视图左部的距离
$('#elem').position().top; // 元素相对于有定位的父元素的上偏移量,会一直找到根节点;
$('#elem').position().left; // 为元素相对于有定位的父元素的左偏移量,会一直找到根节点;
$('#elem').scrollLeft(); // 为元素的元素视图横向滚动的距离;
$('#elem').scrollTop(); // 为元素的元素视图纵向滚动的距离;
设置元素属性
- setAttribute [原生]
var firstItem = document.getElementsByClassName('select-item')[0];
var value = firstItem.setAttribute('data-test','test');
给第一个item 元素,设置一个名为 data-test 的属性,其值为 test。
var inputElement = document.getElementById('countryInput');
inputElement.value = "通过登录号直接赋值";
通过等于号可以直接给表单元素的value赋值
- attr [jQuery]
var firstItem = $('.select-item').eq(0);
firstItem.attr('data-test','test2');
同样通过 attr 方法,如果含有第二个参数时候,代表赋值行为。
var inputElement = $('#countryInput');
inputElement.val("jQuery 表单赋值");
在 val 方法中,如果 val() 里面没有传参数代表获取,如果传参数 val('something') 代表赋值。
获取元素文本
- innerHTML [原生]
var text = document.querySelector('#selectBtn').innerHTML;
console.log(text) // 选择
- text [jQuery]
var text = $('#selectBtn').text();
console.log(text) // 选择
设置元素文本
- innerHTML [原生]
document.querySelector('#selectBtn').innerHTML = "选择HTML";
- text [jQuery]
$('#selectBtn').text("选择JQuery");
创建元素
- createElement [原生]
var newItem = document.createElement('li'); // 创建一个li标签的元素
newItem.setAttribute('class','select-item'); // 为元素设置class属性
newItem.setAttribute('data-value','韩国'); // 为元素设置data-value属性
newItem.innerText = '韩国'; // 为元素设置文字
console.log(newItem);
- $(element) [jQuery]
var eleStr = '<li class="select-item" data-value="韩国">韩国</li>';
var newItem = $(eleStr);
console.log(newItem)
拷贝元素
- cloneNode [原生]
var firstItem = document.getElementsByClassName('select-item')[0];
var cloneItem = firstItem.cloneNode();
console.log(cloneItem)
- clone [jQuery]
var firstItem = $('.select-item').eq(0);
var cloneItem = firstItem.clone();
console.log(cloneItem)
插入元素
- appendChild [原生]
- prepend [原生]
// 创建一个元素
var newItem = document.createElement('li');
newItem.setAttribute('class','select-item');
newItem.setAttribute('data-value','韩国');
newItem.innerText = '韩国';
// 获取插入元素的父元素
var selectList = document.getElementsByClassName('select-list')[0];
// 把创建元素在某元素内底部插入
selectList.appendChild(newItem);
// 把克隆元素在某元素内前部插入
var cloneItem = newItem.cloneNode();
cloneItem.setAttribute('data-value','日本');
cloneItem.innerText = '日本';
selectList.prepend(cloneItem);
- append [jQuery]
- prepend [jQuery]
// 创建一个元素
var eleStr = '<li class="select-item" data-value="韩国">韩国</li>';
var newItem = $(eleStr);
var selectList = $('.select-list');
// 把创建元素在某元素内底部插入
selectList.append(newItem);
// 把克隆元素在某元素内前部插入
var cloneItem = newItem.clone();
cloneItem.data('value','日本');
cloneItem.text('日本');
selectList.prepend(cloneItem);
删除元素
- removeChild [原生]
var firstItem = document.getElementsByClassName('select-item')[0];
firstItem.parentNode.removeChild(firstItem)
removeChild 是父元素移除子元素的方法,我们获取到子元素的时候,通过其 parentNode 获取到他的父元素,再调用方法把自身移除。
- remove [jQuery]
var firstItem = $('.select-item').eq(0);
firstItem.remove();
JQuery 对象中通过 remove 方法直接移除。