
在没有jQuery之前,DOM的操作相对来说有点麻烦,尤其是DOM节点的搜索。目前我们已经学习了jQuery的选择器,接下带大家一块学习jQuery的DOM操作,jQuery对DOM操作的封装让我们前端开发工作非常简便、简洁、兼容性好。比如:属性操作统一化:直接attr方法既可以设置属性也可以读取属性。
在DOM时代,我们可以通过DOM.getAttribute('attNamn')获取DOM的属性节点。可以通过DOM.setAttribute('title','22');设置属性内容。
jQuery的包装对象(jQuery.fn原型对象)提供了attr�(name, value)方法可以读取和设置属性内容。
attr(attrName)方法接受一个字符串参数,就是属性的名称,返回值是属性值,如果dom元素没有此属性则返回undefined。
<p k="3">3</p>
<p k="4">4</p>
<input type="checkbox" checked name="ckb" id="ckb1">
<input type="checkbox" name="ckb" id="ckb2">
<script>
  $(function(){
    // 读取第一个p标签的属性k的值
    console.log($('p:first').attr('k'));     // 3
    // 读取第一个p标签的id属性值,不存在此属性返回undefined
    console.log($('p:first').attr('id'));    // undefined
    // 特殊的单独的属性:checked、selected、multiple、readOnly、autofocus 返回属性名字
    console.log($('#ckb1').attr('checked')); // chekced
    console.log($('#ckb2').attr('checked')); // undefined !!!不是false
    // 应对attr获取checked属性为undefined的问题,jQuery新增的prop方法
    // 仅仅用于checked、selected、multiple、readOnly、autofocus 等属性
    console.log($('#ckb2').prop('checked')); // false
  });
</script>设置属性还是用attr()方法,此方法有多个重载,可以穿两个参数属性名和属性值,也可以传键值对对象,甚至可以传一个方法进行处理。
attr(name,value)简单设置属性的方法,接受两个字符串参数,第一个是属性名,第二个是属性值。// 设置p1标签的类为box
$('#p1').attr('class','box');
// 为所有图像设置src属性。
$("img").attr("src", "test.jpg");// 默认隐式迭代attr(Object)键值对形式的设置对象参数// 为所有图像设置src和alt属性。
$("img").attr({ src: "test.jpg", alt: "Test Image" });// 默认隐式迭代attr(key, func)函数方式处理设置参数func回调函数:一个参数为当前元素的索引值,第二个参数为原先的属性值。函数的返回值作为新的属性值。
//把src属性的值设置为title属性的值
$("img").attr("title", function(index, oldAttr) {
  return this.src;
});
// 将p标签的k属性值加上  当前标签的索引和-
$('p').attr('k', function(index, attr){
  return index + '-'  + attr;
});<input type="checkbox" name="ckb" id="ckb2">
<script>
  $(function(){
    $('#ckb2').attr('checked', 'checked');
    console.log($('#ckb2').attr('checked')); // checked
    console.log($('#ckb2').prop('checked')); // true
    $('#ckb2').attr('disabled', 'disabled');
    console.log($('#ckb2').attr('disabled')); // disabled
    console.log($('#ckb2').prop('disabled')); // true
    // prop方法设置 和 读取的属性值都是boolean类型
    $('#ckb2').prop('disabled', false);
    $('#ckb2').prop('checked', true);
  });
</script>jQuery为映射DOM自身的固有属性添加了prop方法,用法跟attr方法用法一致。但是prop方法在处理单个属性的获取和设置时非常方便,比如:disabled、checked、selected、multiple、readOnly、autofocus等。
prop 和 attr区别:
// attr设置样式类
$('p').attr('class', 'box'); // 默认隐式迭代
// DOM中样式类是className不是 class关键字
$('p').prop('className', 'box');// 默认隐式迭代以下是官方建议attr(),prop()的使用:【√推荐,○不推荐】
| Attribute/Property | .attr() | .prop() | 
|---|---|---|
| accesskey | √ | ○ | 
| align | √ | ○ | 
| async | √ | √ | 
| autofocus | √ | √ | 
| checked | √ | √ | 
| class | √ | ○ | 
| contenteditable | √ | ○ | 
| draggable | √ | ○ | 
| href | √ | ○ | 
| id | √ | ○ | 
| label | √ | ○ | 
| location | √ | √ | 
| multiple | √ | √ | 
| readOnly | √ | √ | 
| rel | √ | ○ | 
| selected | √ | √ | 
| src | √ | ○ | 
| tabindex | √ | ○ | 
| title | √ | ○ | 
| type | √ | ○ | 
| width | √ | ○ | 
移除属性非常简单直接用下面代码
$("img").removeAttr("src");html()DOM时代设置标签内部的html内容是使用DOM对象的 innerHTML属性。
jQuery包装对象封装了html()方法用于读取和设置,而且实现了默认隐式迭代机制。
语法:html([val|fn])
html()<div class="box">
  <a href="https://chuanke.baidu.com/s5508922.html">老马学校</a>
</div>
<script>
  $(function(){
    $('.box').html(); // 获取box样式类里面的html文本
    //返回: <a href="https://chuanke.baidu.com/s5508922.html">老马学校</a>
  });
</script>html(str)$('#box').html('<p>你好</p>');
// 等价于DOM的innerHTML属性设置值
$('#box')[0].innerHTML = '<p>你好</p>';html(func)func(index,html)接收两个参数,index为元素在集合中的索引位置,html为原先的HTML值.返回值作为新的innerHTML的内容。
$("p").html(function (n, oldHTML) {
  return oldHTML + n;
});text()DOM时代获取和读取标签的文本有兼容问题,ie需要用innerText而ff等浏览器需要用textContext属性.jQuery做好了兼容的处理,直接调用text()方法就行了。
text()$('p').text();text(str)$("p").text("Hello world!");text(func)func(index, text)此函数返回一个字符串。接受两个参数,index为元素在集合中的索引位置,text为原先的text值.
$("p").text(function(n){
  return "这个 p 元素的 index 是:" + n;
});val()在 jQuery 1.2 中,可以返回任意元素的值了。包括select。如果多选,将返回一个数组,其包含所选的值。此方法对象
$("input").val();
 $("input").val("hello world!");
 $('input:text.items').val(function() {
  return this.value + ' ' + this.className;
});前面讲的attr()和prop()方法都可以直接设置样式类属性。
$('p').attr('class', 'box');
$('p').prop('className', 'box');addClass语法: addClass(class|fn)
为每个匹配的元素添加指定的类名, 返回值是jQuery包装对象。
$("p").addClass("selected");
// 添加多个样式类
$("p").addClass("selected1 selected2");<!-- 给li加上不同的class -->
<ul>
  <li>Hello</li>
  <li>Hello</li>
  <li>Hello</li>
</ul>
<script>
  // jQuery 代码:
  $('ul li').addClass(function() {
    return 'item-' + $(this).index();
  });
</script>
<!-- 结果 -->
<!-- 
<ul>
  <li class="item-0">Hello</li>
  <li class="item-1">Hello</li>
  <li class="item-2">Hello</li>
</ul> 
-->remvoeClass语法:removeClass([class|fn])
从所有匹配的元素中删除全部或者指定的类。 返回值是jQuery包装对象。
removeClass(str)// 从匹配的元素中删除 'selected' 类
$("p").removeClass("selected");
// 删除匹配元素的所有类
$("p").removeClass();removeClass(func)func(index, oldClass)此函数必须返回一个或多个空格分隔的class名。接受两个参数,index参数为对象在这个集合中的索引值,class参数为这个对象原先的class属性值。
// 删除最后一个元素上与前面重复的class
$('li:last').removeClass(function(index, oldClass) {
    return $(this).prev().attr('class');
});toggleClass语法 toggleClass(class|fn[,sw])
如果存在(不存在)就删除(添加)一个类。
参数:
// 如果p标签有selected样式就移除掉,如果没有就添加上。
$("p").toggleClass("selected");1:要切换的CSS类名. 2:用于决定元素是否包含class的布尔值。
var i = 9;
$(this).toggleClass("highlight", i > 3);参数:function(index, class) 用来返回在匹配的元素集合中的每个元素上用来切换的样式类名的一个函数。接收元素的索引位置和元素旧的样式类作为参数。
// 根据父元素来设置class属性
$('div.foo').toggleClass(function(index, class) {
  if ($(this).parent().is('.bar') {
    return 'happy';
  } else {
    return 'sad';
  }
});hasClass语法格式:hasClass(str),返回值Boolean类型,返回是否拥有某个样式类。
$('#md').hasClass('box'); // true or falsecsscss(str)在DOM中我们可以使用DOM对象的style属性来设置或者读取样式的值。jQuery中封装了css()方法来帮助我们读取或者设置样式值。
<p id="md">hi jQuery</p>
<script>
  $('#md').css('color'); // 获取md标签的 color样式值。
</script>css(key,val)将所有段落字体设为红色
$("p").css("color","red");css(obj)$("p").css({ "color": "#ff0011", "background": "blue" });css(prop, func)
   // div 点击后逐渐增加div的大小
  $("div").click(function() {
    $(this).css({
      width: function(index, value) {
        return parseFloat(value) * 1.2;
      },
      height: function(index, value) {
        return parseFloat(value) * 1.2;
      }
    });
  });下一节预告: