25.jquery DOM&事件

问答

1.说说库和框架的区别?

类库(Class Library):类库就是一些类的集合,只要我们将一些可以复用的类集中放到一个Library中,我们就可以称其为一个类库。
类库解决的是代码或者是模块级别的复用或者对复杂度的封装问题,例如将一个解决复杂问题的功能模块封装成一个函数,提供一个简单的接口。
类库它是一种工具,它提供了很多封装好的方法,用与不用取决于我们自身,即使用了也不会影响我们的代码结构。
类库有:jQuery等

框架(framework):框架的第一含义是一个骨架,它封装了某领域内处理流程的控制逻辑,你只需要对它填充具体的业务逻辑。框架的目标性非常强,它专注于解决某一特定领域的问题,并为这一特定领域提供通用的解决方案。
这里框架是起主导作用的,由它来根据具体的应用逻辑来调用你的代码。框架中也包含了很多元素,但是这些元素之间关系的紧密程度要远远大于类库中元素之间的关系。框架中的所有元素都为了实现一个共同的目标而相互协作。
框架有:react.js, angular.js, vue.js,backbone.js, Bootstrap等
业务代码、库、框架的关系可以参考下图:

Paste_Image.png

区别:
①从结构上说,框架内部是紧密的,而类库内部则是相对松散的。
②框架封装了处理流程的控制逻辑,而类库几乎不涉及任何处理流程和控制逻辑。
由于框架对处理流程的控制逻辑进行了封装,才使得框架成为一个应用的骨架。框架中的处理流程和控制逻辑需要经过精心的设计,因为所有使用了该框架的应用程序都会复用该设计。
③框架具有IOC(控制反转)能力,而类库没有。
IOC,即俗称的好莱坞模式(Don’t call us, we will call you)。
对于类库中的元素来说,通常都是由我们的应用来调用它;而框架具有这种能力即在适当的时候调用我们应用中的逻辑。这种能力是通过框架扩展点(或称为“插槽”)来做到的即具体的应用通过扩展点注入自己的逻辑,而在适当的时候,框架会调用这个扩展点中已注册的逻辑。实际上,.NET中的事件(event)发布、预定机制就是IOC的一个代表性例子。
④框架专注于特定领域,而类库却是通用的。
框架作用于一个特定领域的解决方案的完整表达,而类库几乎不针对任何特定领域。
⑤框架通常建立在众多类库的基础之上,而类库一般不会依赖于某框架。
参考

2.jquery 能做什么?

Jquery是一个javaScript的函数库。
①简化常见的js任务
②dom操作
③ajax
④绑定事件
⑤实现动画和特效

3.jquery 对象和 DOM 原生对象有什么区别?如何转化?

jquery对象是通过jquery选择器选择的对象,得到的是类数组对象,有自己的独有的属性和方法;DOM原生对象是通过JS选择器获得的对象,有自己的属性和方法。二者不能够混用,否则会报错。
DOM对象 转化为jquery对象: 用( )包裹DOM对象,如(DOM对象)

var btn=document.getElementById('btn');   //dom对象
$btn=$(btn);  //jquery对象

jquery对象转化为DOM对象:jQuery对象是一个类似数组的对象,可以使用它的下标,如[index]或者get[index]方法转换为DOM对象

var $test=$('#test')  //jquery对象
var test1=$test[index]  //dom对象
var test2=$test.get[index]  //dom对象
var test3=$test.eq(index)  //jquery对象

注意:用$选中的元素,无论一个还是多个,所得的都是类数组的对象。如果用eq(index)会得到jQuery对象,而用[index]会得到原生DOM对象。

4.jquery中如何绑定事件?bind、unbind、delegate、live、on、off都有什么作用?推荐使用哪种?使用on绑定事件使用事件代理的写法?

jQuery绑定事件的方法有.bind()、.live()、.delegate()和.on()。下面同上一一对应的 .unbind()、.die()、.undelegate()和.off()是解除绑定的方法;其中的bind,live及die,在jQuery 1.7版本中,官方已废除了。
参考
bind、unbind、delegate、live 都在对应的在各个版本中弃用或者有局限性,而 on 和 off 兼容了上面绑定的所有方法,推荐使用on和off方法绑定和解除绑定
参考
①bind:对匹配到已经存在的元素绑定事件,可以绑定的多个事件以及处理方法,但是对新增加的元素不能绑定事件

//绑定单个事件
$(selector).bind(event,data,function)  

//绑定多个事件
$(selector).bind({   
    click: function() {
        // do something on click
    },
    mouseenter: function() {
        // do something on mouseenter
    }
});

//绑定多个事件类型
$('selecotr').bind('event1 event2', function() {
     //do something on mouseenter
});

②unbind:用来解除bind方法绑定的事件。

$('#p').unbind('click') 

③delegate:为所有匹配选择器(selector参数)的元素绑定一个或多个事件处理函数,基于一个指定的根元素的子集,匹配的元素包括那些目前已经匹配到的元素,也包括那些今后可能匹配到的元素。(也就是可以指定事件代理的父元素,并且后来添加的元素也绑定了事件)

$(selector).delegate(childSelector,event,data,function)

$('#container').delegate('a', 'click', function() { alert("That tickles!") });

解释:JQuery扫描文档查找(‘#container’),并使用click事件和’a’这一CSS选择器作为参数把alert函数绑定到(‘#container’)上。任何时候只要有事件冒泡到$(‘#container’)上,它就查看该事件是否是click事件,以及该事件的目标元素是否与CCS选择器相匹配。如果两种检查的结果都为真的话,它就执行函数。

④live:相当于自动使用了事件代理,默认事件冒泡到 document 节点。不仅能对能对已有的元素绑定事件,还能对未来插入的元素绑定事件

$('a').live('click', function() { });
//相当于$(document).delegate('a', 'click', function() { });

解释:JQuery把函数绑定到$(document)元素上,并使用’click’和’a’作为参数。任何时候只要有事件冒泡到document节点上,它就查看该事件是否是一个click事件,以及该事件的目标元素与’a’这一CSS选择器是否匹配,如果都是的话,则执行函数。

⑤on:在选定的元素上绑定一个或多个事件处理函数。从jQuery1.7开始,.on()方法提供了事件处理的所有功能。所以,为了统一和方便,推荐使用.on()方法作为绑定事件的方法

$(".ct").on("click","a",function(){
       console.log($(this).text());
})

⑥off:用来移除用.on()方法绑定的事件。

移除所有段落上的事件:
$("p").off()

移除所有段落上的代理事件:
$("p").off( "click", "**" )

通过传入的第三个参数,仅移除先前绑定的事件处理函数:
var foo = function () {
    // code to handle some kind of event
};

// ... now foo will be called when paragraphs are clicked ...
$("body").on("click", "p", foo);

// ... foo will no longer be called.
$("body").off("click", "p", foo);

通过指定名字空间,解除绑定表单上所有的代理事件:
var validate = function () {
    // code to validate form entries
};

// delegate events under the ".validator" namespace
$("form").on("click.validator", "button", validate);
$("form").on("keypress.validator", "input[type='text']", validate);

// remove event handlers in the ".validator" namespace
$("form").off(".validator");

5.jquery 如何展示/隐藏元素?

隐藏展示有

$(selector).hide(speed,callback);
$(selector).show(speed,callback);
$(selector).toggle(speed,callback);

①可选的 speed 参数规定隐藏/显示的速度,可以取以下值:"slow"、"fast" 或毫秒。
②可选的 callback 参数是隐藏或显示完成后所执行的函数。
③本质上是修改dom.style.display属性

//展示p1
$("#btn1").on('click', function(e){
     $(".p1").show();
});

//隐藏p1
$("#btn2").on('click', function(){ 
    $(".p1").hide();
});

//隐藏p1,持续时间1s之后再执行回调
$("#btn3").on('click', function(){ 
    $(".p1").hide(1000, function(){ 
        $(".p2").hide(2000, function(){ 
            $(".p3").hide(3000); 
        }); 
    });
});

$("#btn4").on('click', function(){ 
     $(".p1").show(1000, function(){ 
         $(".p2").show(2000, function(){ 
            $(".p3").show(3000); 
         }); 
    });
});

//状态切换
$("#btn5").on('click', function(){ 
     $(".p1").toggle();
});

6.jquery 动画如何使用?

jQuery animate() 方法用于创建自定义动画。
语法:$(selector).animate({params},speed,callback);
①{params}必需的,包含样式属性及值的对象。例如:{width:'100px',height:'80px'}
②speed可选的,动画的时长。例如:slow/fast/毫秒数 。
③callback可选的,回调函数,在动画执行完毕后执行。
注意:只有数字值才能创建动画(比如 margin:30px)。字符串值无法创建动画(比如 background-color:red),写了之后会没有任何效果。
举例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    div{
        background:yellow;
        width: 300px;
        height: 300px;
        position:relative;
    }
</style>
</head>
<body>
    <div></div>
    <button class="btn">点我动画</button> 

    <script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script>
    <script>
        $('.btn').on('click',function(){
            $('div').finish();//连续点击只执行一次

            $('div').animate({width:"200px",height:"200px"})
                    .animate({left:"200px"})
                    .animate({top:"200px"});

            $('div').animate({left:"0px"});
            $('div').animate({top:'0px'});
            $('div').animate({width:"300px",height:"300px"});
        })
        
    </script>   
</body>
</html>

demo

7.如何设置和获取元素内部 HTML 内容?如何设置和获取元素内部文本?

  • .html()方法可以获取元素内部的html内容(包含html标签);如果在html()方法内加参数,可以设置元素内部html内容。如果参数内含有html标签,会被解析。
$('div').html();    //获取内容
$('div').html('<p>测试</p>')  //设置内容
  • .text()方法可以获取元素内部的文本内容(丢弃html标签);如果在text()方法内加参数,可以设置元素内部的文本内容。如果内容含有html标签,则会被转义成字符串,而不会被浏览器解析,适合用来处理用户输入。
$('div).text();  //获取文本
$('div').text('我是文本')  //设置文本

举例:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Examples</title>
<meta name="description" content="">
<meta name="keywords" content="">
<link href="" rel="stylesheet">
<style>
    *{
        margin:0;
        padding: 0;
    }
</style>

</head>
<body>
    <h1 id="header">我是<span>头部</span></h1>    
    <p id="footer">我是<strong>尾部</strong></p>
    <button class="btn1">获取“我是头部”的html内容</button>
    <button class="btn2">获取“我是头部”的文本内容</button>
    <button class="btn3">设置“我是头部”的html内容</button>
    <button class="btn4">设置“我是头部”的文本内容</button>

   <script src="http://apps.bdimg.com/libs/jquery/1.9.0/jquery.js"></script>

    <script>
        $(".btn1").on("click",function(){
            console.log($("#header").html())
        });

         $(".btn2").on("click",function(){
             console.log($("#header").text())
         });

         $(".btn3").on("click",function(){
             $("#header").html('我是<em>内容</em>')
         });

         $(".btn4").on("click",function(){
             $("#header").text('我是<em>内容</em>')
         });

    </script>
</body>
</html>

demo

8.如何设置和获取表单用户输入或者选择的内容?如何设置和获取元素属性?

  • .val()方法可以获取表单用户输入或者选择的内容;在val()方法内加参数,可以设置表单内部输入或者选择的内容。
$('input').val();   // 获取值
$('input').val();   //设置值
  • attr()方法可以获取元素的属性;在attr()方法内加参数,可以设置元素的属性。
$('img').attr('src'); // 获取属性
$('img').attr('src', newSrc); // 设置属性

demo

代码

1.代码运行结果
1.1范例
源码

2.代码运行结果
2.1范例
源码
问题: 点奢侈品2的时候页面跳到了顶部,可能是什么原因?如何解决?
答:查看源代码我们可以发现,<a>标签的<href=“#”>会使得当“奢侈品2”被点击时,页面跳转到了顶部。
因为默认#是#top会自动回到顶部,因此不要使用#作为占位符。如果href="",不设置占位符就相当于刷新整个页面,所以必须设置占位符。
解决方法:
1、href让其等于两个或四个“#”;(这种方式最安全);
2.设置为<href=“#!”>,因为没有任何元素的id值会为”!”,因此这样设置的话,就不会发生任何事情;
3.设置为<href=“javascript:void(0)”>,这样使用了javascript的伪协议,void(0)
的返回值是undefined,也相当于什么都不会发生。
4.当<a>被点击时,设置preventDefault()

3.代码运行结果
3.1范例
源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 1. 说说库和框架的区别? 库(library):我们可以简单的认为它就是一个工具箱,里面有可以直接拿来使用的方法...
    小木子2016阅读 203评论 0 1
  • 问答 1、说说库和框架的区别? 库Library ( 简写 Lib ),库是将代码集合成的一个产品,供程序员调用。...
    咸吧阅读 172评论 0 1
  • 原文链接 http://blog.poetries.top/2016/10/20/review-jQuery 关注...
    程序员poetry阅读 16,641评论 18 503
  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,358评论 0 44
  • 高中时,曾自诩野马 我想其闯劲与天马 并无天壤之别 信马由缰,无拘无束中奔放 绝尘而去于广袤天地 不用扬鞭自奋蹄 ...
    碧海青天2017阅读 231评论 0 1