一. JS 的面向对象

JS没有类,其类就用function来代替如下所示:

 function Cat(name, color){
this.name=name;
this.color=color;
}

这就相当于是构造函数,可以生成对象:

 // 声明Cat对象
var cat1 = new Cat("jack", "yellow");
var cat2 = new Cat("tom","black"); // 用法和其他语言的对象一样
alert(cat1.name); // jack
alert(cat1.color); // yellow

但是js的构造函数里面所有的东西都是储存在对象上面的,所以如果在里面定义func就很浪费内存,因为func都是一样的,别的语言都是放到类的内存里的,如下这样的 eat 的方法就是浪费:

 function Cat(name,color){
    this.name = name;
    this.color = color;
    this.type = "catamount";
    this.eat = function(){
alert("Eat mouse");
    };
  }

所以js的每个构造函数都有一个prototype属性,这个对象的所有属性和方法,都会被构造函数的实例继承,存储到了类里。这样就做到了类似类属性,和方法的效果;示例如下:

 function Cat(name,color){
  this.name = name;
  this.color = color;
}
Cat.prototype.type = "catamount";
Cat.prototype.eat = function(){
alert("Eat mouse")
};

二. 用JS移动和复制元素

我们知道用JS可以通过appendChild之类的方法动态地在元素里添加新元素,但是如果这个新元素,本身就是通过DOM获取到的其他元素,那么这个过程就是一个移动的过程,也就是说会从原本的位置去除,放到这个新的位置,示例如下:

     <h2 id="h1">1111</h2>
<div id="container">
<div>1</div>
<div>2</div>
</div>

原HTML页面显示结果:

加入如下JS:

     <script>
var h1 = document.getElementById('h1');
var ct = document.getElementById('container');
ct.appendChild(h1);
</script>

显示结果:

所以如果是想要选择一个元素,并将之复制到另外一个位置的话需要使用coleNode方法:

     <script>
var h1 = document.getElementById('h1');
var ct = document.getElementById('container');
//ct.appendChild(h1);
var h2 = h1.cloneNode(true);
ct.appendChild(h2);
</script>

注意如果是普通的声明一个新变量并赋值,那并不会生成一个新的元素;此外cloneNode中的true效果是会clone整个tag内部所有的内容,不加的话只会clonetag。

三. JQUERY给动态生成的元素绑定事件

我们常常会面对需要动态给页面增添HTML元素的场景,而如果我们想要对这些元素进行操作的话,和普通的元素上会有区别。因为js代码是自上而下读取代码进行解释的,所以一段操作元素的代码(比如使用选择器选中元素并修改其属性)在某个元素生成的代码执行前,那么这段操作是无法起效的。

比如我有下述一个table元素,其中只包含了一个tr元素:

     <table width="600" id="row_table">
<tr class="row">
<td><input type="text"/></td>
<td><input type="text"/></td>
<td>
<select class="sel">
<option value ="s1">s1</option>
<option value ="s2">s2</option>
</select>
</td>
</tr>
</table>

然后我会通过代码动态,给一个按钮加入新增tr元素的功能:

 single_row = '<tr class="row"><td><input type="text"/></td><td><input type="text"/></td><td><select class="sel"><option value ="s1">s1</option><option value ="s2">s2</option></select></td></tr>'
$("#add").click(function(){
$("#row_table").append(single_row);
})

如果想要为select元素添加一个change事件:

     $(".sel").change(function(){
multi_select($(this));
})

会发现只有原本那个在HTML里面就有的元素才被操作了,所有后续新加的tr元素内的select都没有被操作到。

为解决这种问题有几种方法,第一种方法是使用JQUERY的on方法(jquery1.9版本以上,老的版本可以用live啥的方法貌似),选择器选中会动态动态添加子元素的父元素,然后再通过选择其内部的子元素,加上事件及对应操作函数,示例如下:

 $("table").on("change", ".sel", function(){
multi_select($(this));
})

第二种方法思路更加简单,就是在动态添加元素的时候,在元素的HTML标签中直接加入事件的tag和方法就好了:

 <select class="sel" onchange="multi_select();">

第三种方法其实和上面类似,就是用js生成元素而不是直接添加HTML,然后在生成元素的时候,直接用JS使用bind方法绑定事件就好了。就不演示了。

四. 事件绑定函数的入参

使用click, change等等方法给元素绑定事件,其中一个入参为事件触发后的处理函数,这个函数其实是有一个入参的:

  $("#reverse").click(function(event){
console.log(event);
}

我们打印看一下,会发现这是一个Event,会记录一些事件相关的信息,比如是鼠标事件啦,是点击啦啥的,和绑定的事件、元素相关:

再比如这个keydown事件,我们看一下event:

 $(window).keydown(function(event){
console.log(event);
})

有一个重要的属性keyCode,这就是按下的键盘按键的一个编号;我给window添加了监控键盘按下的事件,并获取keyCode就能随时知道键盘是不是按了某个键,然后就可以进一步做些组合操作啥的。

五. $.each和$.map的用法与区别

在使用Jquery的过程中,我注意到了$.each和$.map两个函数,一开始有些迷惑它们之间的区别,因为看起来好像都是遍历对象/数组做操作。这里记录一下自己学习的使用方法,已经区别。

先来看一些each的使用实例:

1. 使用each遍历一个对象,然后打印其入参:

 li={a:1,b:2}
$.each(li, function(x,y){
console.log(x,y)
})

我们可以知道第一个入参是对象的属性名,第二个入参是属性值。

2. 使用each遍历一个数组,打印其入参:

 list = [11,22,33,44];
$.each(list, function(i, v){
console.log(i, v)
})

课件第一个入参是索引,第二个入参是值。

3. 再让我们在each的方法里面加入return看看:

结果返回的是each的第一个参数;同时综合以上几个例子,我们可以发现,each方法会自动返回一个对象(无论你加不加return,无论return什么东西),这个对象都是我们交给each去处理的第一个参数,一个对象或序列。也就是说each调用的方法,其return的内容被忽略了,外部是获取不到的。

4. 还有一个特殊的用法,即在调用的方法中return false。

结果就是return false会中断each的遍历!

我这里摘录了对each的官方描述,对以上的行为都做了说明,看起来非常精彩:

然后再来看map的一些使用实例:

1. map遍历一个对象,输出入参:

可见map入参获取到的顺序和each是相反的,其第一个入参是值,第二个才是属性名称。返回值是一个空数组,而each是原对象。

2. 遍历一个序列:

map入参获取到的顺序也和each是相反的,其第一个入参是值,第二个才是索引。此外返回值是一个空数组,而each是原数组。

3. 遍历对象,分别reutrn第一个和第二个入参:

这回我们的返回值不再是空数组了,当然还是一个数组。其内容就是我们每次遍历调用函数内部return出来的值。

综合上面几个例子,我们可以知道map返回值都是数组,其每个元素就是每次遍历调用函数内部return出来的值,这个行为和python中的内建函数map非常相似。

不过map也有些需要注意的地方(对我来说主要是和python的map表现不同的需要理解和记住的地方...)!!!!

1. 在map调用的函数中返回null,并不是在结果数组中加入一个null,而是相当于不返回,或者认为去掉了一个元素,示例如下:

2. 在map调用的函数中返回数组,其最终的结果数组并不是每个元素都是函数中返回的数组(也就是不是数组套数组),而是将每次返回的数组里的每个元素都依次加入到最终结果的数组中,也就是说结果数组看起来被扩张了(类似python的extend的感觉,而不是append),示例如下:

这里可以看到原数组里的值和索引都被加入到最终的结果数组里了。

最后同样摘录官网的描述!

JS与Jquery学习笔记(二)的更多相关文章

  1. 纯JS实现KeyboardNav(学习笔记)二

    纯JS实现KeyboardNav(学习笔记)二 这篇博客只是自己的学习笔记,供日后复习所用,没有经过精心排版,也没有按逻辑编写 这篇主要是添加css,优化js编写逻辑和代码排版 GitHub项目源码 ...

  2. jquery学习笔记(二):DOM元素操作

    内容来自[汇智网]jquery学习课程 2.1 元素属性操作 1.获取元素的属性 语法:attr(name) 参数name表示属性的名称 2.设置元素的属性 单个属性设置语法:attr(key,val ...

  3. jQuery学习笔记(二)jQuery中DOM操作

    目录 DOM操作分类 jQuery中的各种DOM操作 查找节点 创建节点 删除节点 复制节点 替换节点 包裹节点 属性操作 样式操作 对HTML.文本和值的操作 遍历节点 CSS-DOM操作 小结 本 ...

  4. jquery 学习笔记二 隐藏与显示

    css找到元素后是添加样式,而jquery找到元素后是添加形为. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  5. JS与Jquery学习笔记(一)

    一. Javascript的作用域,大坑! 1. JS作用域奇怪表现之一:预编译 在其他的语言里我们如果使用一个变量在声明其之前,是会报错的,但是在js里面却不一定,比如: function f1() ...

  6. jQuery学习笔记二

    事件监听者是DOM的一部分,任何页面都可以增加事件监听者.浏览器利用事件监听者监视页面上做了什么,然后告诉Javascript解释器是否需要采取行动.如:$('#showMessage').click ...

  7. Js、jquery学习笔记

    end() 方法 重新定位到上次操作的元素,一般与siblings()一起使用,操作其兄弟元素.如:$(this).addClass("highlight").children(& ...

  8. jQuery学习笔记(一)jQuery选择器

    目录 jQuery选择器的优点 基本选择器 层次选择器 过滤选择器 表单选择器 第一次写博客,希望自己能够长期坚持,以写博客的方式作为总结与复习. 最近一段时间开始学习jQuery,通过写一个jQue ...

  9. jQuery 学习笔记

    jQuery 学习笔记   一.jQuery概述    宗旨: Write Less, Do More.    基础知识:        1.符号$代替document.getElementById( ...

随机推荐

  1. [转载]Matlab之静态文本多行输出

    转载文章,原文链接:Matlab中的静态文本框中显示多行内容 有时候,我们在GUI中利用静态文本框显示程序的结果,但是结果很长,一行未必可以显示的开,而静态文本框不像edit或listbox那样通过滚 ...

  2. C++ 中数串互转、进制转换的类

    /******************************************************************** created: 2014/03/16 22:56 file ...

  3. Xcode8不能使用快捷键“command+/”注释代码的解决方法

    sudo /usr/libexec/xpccachectl 打开终端,输入该命令(如果电脑有密码的话,会有提示让输入密码) 接下来重启电脑. command + option + / 还可以多行注释

  4. flash拖动条移出flash无法拖动

    原因:flash拖动条的拖动事件被嵌入flash的div的鼠标事件给截获了!

  5. SQLSERVER进程CPU使用率100%

    解决SQLSERVER2008 CPU使用率99%: 1.dbcc checkdb 重建索引 2.檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , ...

  6. UIImagePickerControllerDelegate---ActionSheet---获得设备型号

    <pre name="code" class="java">//IOS主要用的是UIImagePickerControllerDelegate这个事 ...

  7. 激活windows10 LTSB 2016

    激活windows10 LTSB 2016 slmgr /ipk DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ slmgr /skms kms.firadio.net slmgr /at ...

  8. h5整理--详解css的相对定位和绝对定位

    浏览器默认状态下position的属性默认值是static也就是没有定位,元素出现在正常的文档流中,这个时候给元素设置的left,right.bottom.top这些偏移属性是没有效果的,不会生效: ...

  9. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  10. ASI 与 AFN

    HTTP终结者.功能十分强大. 基于底层的CFNetwork框架,运行效率很高. 可惜