【JavaScript】DOM选择器和jQuery

很难受,第二次的jQuery

调用:

<head>
    <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    ...
</head>

核心语法

$(selector).action()
$是重要的jQuery符号,实际上,jquery把所有的功能都封装在一个全局变量jQuery中,而$就是一个合法的变量名,是jQuery的别名(jQuery(selector).action()):

window.jQuery; // jQuery(selector, context)
//注意这里的对象是window,在某些场合,jQuery的操作对象不一定是一个你可以筛到的标签,也可能是整个窗体,这种概念在js中应该有。
window.$; // jQuery(selector, context)

$ === jQuery; // true

typeof($); // 'function'

$; // jQuery(selector, context)
jQuery.noConflict();
//解除别名$
$; // undefined
jQuery; // jQuery(selector, context)

选择器

CSS选择器(基础!)

http://www.cnblogs.com/yuanchenqi/articles/6856399.html

基本选择器:

  • 标签选择器:
    p {color:gray};
  • id选择器:
    #info {font-size:30px}
  • class选择器:
    info {background:#ff0}
  • 统配选择器:
    * {margin:0;padding:0}

组合选择器:

DOM选择器

因为jq的选择器其实和DOM选择器几乎差不多,但是在选择语法上有很好的优化,所以我觉得只要理解了DOM其实对正确运用jq选择器有很大的帮助,顺便补一波DOM没有写的笔记。

选择DOM

始终记住DOM是一个树形结构。操作一个DOM节点实际上就是这么几个操作:

  • 更新:更新该DOM节点的内容,相当于更新了该DOM节点表示的HTML的内容;

  • 遍历:遍历该DOM节点下的子节点,以便进行进一步操作;

  • 添加:在该DOM节点下新增一个子节点,相当于动态增加了一个HTML节点;

  • 删除:将该节点从HTML中删除,相当于删掉了该DOM节点的内容以及它包含的所有子节点。

既然要进行操作,那么一定要先拿到一个节点对象,我们可能不一定能直接拿到我们想要操作的节点,所以可以先找到父节点然后缩小范围,再进行选择。
比较基础的几种方式:

  • document.getElementById()
  • document.getElementsByTagName()
  • CSS选择器document.getElementsByClassName()

范例练习:

<body>
<div id="test-div">
<div class="c-red">
    <p id="test-p">JavaScript</p>
    <p>Java</p>
  </div>
  <div class="c-red c-green">
    <p>Python</p>
    <p>Ruby</p>
    <p>Swift</p>
  </div>
  <div class="c-green">
    <p>Scheme</p>
    <p>Haskell</p>
  </div>
</div>
</body>


//----------------------------------
//----------脚本部分-----------------

<script>
    var js=document.getElementById('test-p');//通过ID直接获取


    var arr=document.getElementsByClassName('c-red c-green')[0].getElementsByTagName('p');
//    console.log(arr);
//前一部分通过class获得的是一个<div>标签,但是因为是通过elements获得的,所以他是被包裹在一个数组里面的。所以要通过[0]把他取出来,这时候他就是一个单纯的<div class="c-red c-green">。但是我们需要的是这里面的三个<p>标签的集合。这里比较容易出现误区,让我们觉得这个<div>就已经是正确答案了,其实还是不对的,我们需要的是一个数组,而不是一个标签。所以需要再次通过tag筛选出需要的<p>标签。
//综上,整句话的意思就是,在整个document里面找到class为“c-red c-green”的元素数组,并且取出里面的第一个(其实也是唯一一个)元素,再从这个元素中,筛出标签为<p>的元素集合。
    var haskell=document.getElementsByClassName('c-green')[1].lastElementChild;
    console.log(haskell);
//这题我用的方法比较蠢,是在观察整个文档结构之后自己用索引位置获取出来的。用到了children方法,并且按照索引获取了最后一个children。
//翻译过来 就是:在整个document中通过类名为“c-green”获取想要的父级元素集合,其中第二个是我们想要的目标父级元素,再从父级元素标签中获取他的最后一个子级标签。
//其实可以想一个更加准确的策略去获取这个标签:。。。。暂时想不到,这个文档结构本身有点松散。这也说明,在创建文档标签结构的时候,要准确有条理地对标签进行归类(.class)和定位(#id)


    if (!js || js.innerText !== 'JavaScript') {
    alert('选择JavaScript失败!');
} else if (!arr || arr.length !== 3 || !arr[0] || !arr[1] || !arr[2] || arr[0].innerText !== 'Python' || arr[1].innerText !== 'Ruby' || arr[2].innerText !== 'Swift') {
    alert('选择Python,Ruby,Swift失败!');
} else if (!haskell || haskell.innerText !== 'Haskell') {
    alert('选择Haskell失败!');
} else {
    alert('测试通过!');
}

</script>

更新DOM

  • 获取并且更新标签:innerHTML
    这个方式非常强大,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段修改DOM节点内部的子树。这种方法要注意,对字符进行编码!

  • 获取并且更新标签内容:innerText textContent
    两者的区别在于读取属性时,innerText不返回隐藏元素的文本,而textContent返回所有文本。另外注意IE<9不支持textContent

  • 更新修改标签的css style
    DOM节点的style属性对应所有的CSS,可以直接获取或设置。注意这里使用的格式:tagobj.style.css="value"的value是通过等号和引号传入的

范例:

var js=document.getElementById("test-js");
//获取对象
js.innerText="JavaScript";
//修改内部文本
js.style.color="#ff0000";
//修改css样式
js.style.fontWeight="bold";

插入DOM

我们获取了某个DOM节点,想在这个节点(可能是个空节点)中添加新的DOM。
如果他本身真的是个空节点,我们可以直接使用上面提过的innerHTML=<span></span>添加内容。

但是如果这个节点不是空节点呢?

  • 添加的节点本来就存在原文档树中

范例:

<p id="js">JavaScript</p>
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
</div>

<p id="js">JavaScript</p>添加到<div id="list">的最后一项:

var
    js = document.getElementById('js'),
    list = document.getElementById('list');
//这个声明变量的方式有点小帅,mark一下
list.appendChild(js);

运行js之后的结果:

<!-- HTML结构 -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
    <p id="js">JavaScript</p>
//可以发现之前在div外部的js标签进入了div内部,因为在原html文档树中已经有了这个标签。他就会从原先的位置删除,在添加到新的位置。
</div>
  • 创建一个新节点添加到文档树中:

var
list = document.getElementById('list'),
haskell = document.createElement('p');
haskell.id = 'haskell';
haskell.innerText = 'Haskell';
list.appendChild(haskell);
这样我们就动态添加了一个新的节点:

var
    list = document.getElementById('list'),
    haskell = document.createElement('p');
    //创建一个元素对象,标签为<p>
haskell.id = 'haskell';
//给这个创建的对象添加一个id属性
haskell.innerText = 'Haskell';
//给这个创建的对象添加一个内部文本
list.appendChild(haskell);
//把这个对象作为子节点添加到list对象中

这样我们就动态添加了一个新的节点:

<!-- HTML结构 -->
<div id="list">
    <p id="java">Java</p>
    <p id="python">Python</p>
    <p id="scheme">Scheme</p>
    <p id="haskell">Haskell</p>
</div>
  • 指定位置地添加节点:

使用parentElement.insertBefore(newElement, referenceElement);,子节点会插入到referenceElement之前。

使用insertBefore重点是要拿到一个“参考子节点”的引用。很多时候,需要循环一个父节点的所有子节点,可以通过迭代children属性实现:

var
    i, c,
    list = document.getElementById('list');
for (i = 0; i < list.children.length; i++) {
    c = list.children[i]; // 拿到第i个子节点
}

删除DOM

removeChild():获得要删除的元素,通过父元素调用删除

替换节点

somenode.replaceChild(newnode, 某个节点);

DOM 属性和事件

属性

上面我们已经提到了innerHTML,innerText等常用获取文本节点的方法。

其他节点属性:

parentElement           // 父节点标签元素
children                // 所有子标签
firstElementChild       // 第一个子标签元素
lastElementChild        // 最后一个子标签元素
nextElementtSibling     // 下一个兄弟标签元素
previousElementSibling  // 上一个兄弟标签元素

注意,原生js中没有办法找到所有的兄弟标签
但在jq中有一个jQuery.siblings() 可以用来查找兄弟节点,不分前后。

  1. attitude操作
  elementNode.setAttribute(name,value)

     elementNode.getAttribute(属性名)        <-------------->elementNode.属性名(DHTML)

     elementNode.removeAttribute(“属性名”);
  1. 适用通过value获取标签值的节点:
  2. input
  3. select(selectdIndex)
  4. textarea

注意这里的这个input比较常用,另外两个暂时没有用到所以没有查。但是在使用input标签中的radio类型(单选)的时候,并没有找到有内置的获取radio的value的方法。传翔给的方法如下:

//获取radio选中值
   function getRadioValue(radioName){
       var obj = document.getElementsByName(radioName);
       for(i=0; i<obj.length;i++){
           if(obj[i].checked){
               return obj[i].value;
           }
       }
       return "undefined";
   }
  1. class的相关操作
elementNode.className //获取目标的类名?
elementNode.classList.add //在目标的类列表中添加
elementNode.classList.remove //在目标的类列表中删除

jQuery选择器

回顾了DOM的选择器,再来看jQuery的选择器,可以说jQuery的核心就是选择器,它的基本语法:
$("#dom-id")

posted @ 2017-10-30 12:04  sc0T7_ly  阅读(351)  评论(0编辑  收藏  举报