jQuery学习小结1-CSS操作+事件

一、DOM对象和jQuery 对象互换

1、jQuery对象

就是通过jQuery包装DOM对象后产生的对象。jQuery对象是jQuery独有的,其可以使用jQuery里的方法。比如:

$("#test").html() 意思是指:获取ID为test的元素内的html代码。其中html()是jQuery里的方法这段代码等同于用DOM实现代码:document.getElementById("id").innerHTML;

  • 虽然jQuery对象是包装DOM对象后产生的,但是jQuery无法使用DOM对象的任何方法,同理DOM对象也不能使用jQuery里的方法. 乱使用会报错。比如:$("#test").innerHTML、document.getElementById("id").html()之类的写法都是错误的
  • 还有一个要注意的是:用#id作为选择符取得的是jQuery对象与document.getElementById("id")得到的DOM对象,这两者并不等价

2、jQuery对象转成DOM对象

两种转换方式将一个jQuery对象转换成DOM对象: [index]和.get(index);

(1)  jQuery对象是一个数据对象,可以通过[index]的方法,来得到相应的DOM对象。

(2)  jQuery本身提供,通过.get(index)方法,得到相应的DOM对象

3、DOM对象转成jQuery对象:

对于已经是一个DOM对象,只需要用$()把DOM对象包装起来,就可以获得一个jQuery对象了。$(DOM对象),转换后,就可以任意使用jQuery的方法了

var $v=$("#v"); //jQuery对象
var v=$v.get(0); //DOM对象
alert(v.checked) //检测这个checkbox是否被选中
  • 需要再强调注意的是:DOM对象才能使用DOM中的方法,jQuery对象是不可以用DOM中的方法。
  • 只有jquery对象才能使用jquery定义的方法。注意dom对象和jquery对象是有区别的,调用方法时要注意
  • 由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。 如:
         $("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]
    这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法

二、多个库之间的冲突

1.jQuery在其他库之前导入,可直接使用jQuery,无需调用jQuery.noConflict()函数

<script type="text/javascript" src="./jquery-1.4.2.js"></script>  
    <script type="text/javascript" src="./prototype-1.6.1.js"></script>

2.jQuery在其他库之后导入,有两种方法:

“$”的所有权就归Base 库所有,创建一个“$$”符给jQuery 使用。

var $$ = jQuery;              //创建一个$$的jQuery 对象
$(function () {                  //这是Base 的$
    alert($('#box').ge(0));      //这是Base 的$
    alert($$('#box').width());   //这是jQuery 的$$
});

jQuery 提供了一个方法——noConflict:

jQuery.noConflict();   //将$符所有权剔除
 var $$ = jQuery;    //自定义一个快捷给jQuery
$(function () {
    alert($('#box').ge(0));
    alert($$('#box').width());
});
jQuery.noConflict();    //将变量$的控制权移交给prototype.js  
    jQuery(function(){     //使用jQuery  
        jQuery("p").click(function(){  
            alert(jQuery(this).text());  
        });  
    });  
    $("pp").style.display='none';  //使用prototype  
    $j = jQuery.noConflict();  //自定义一个快捷给jQuery,将变量$的控制权移交给prototype.js  
    $j(function(){  //使用jQuery,利用自定义快捷$j  
        $j("p").click(function(){  
            alert($j(this).text());  
        });  
    });  
    $("pp").style.display='none';  //使用prototype
jQuery.noConflict();  //将变量$的控制权移交给prototype.js        
(function($){        //定义匿名函数并设置形参为$  
        $(function(){   
//匿名函数内部$均为jQuery  
            $("p").click(function(){alert($(this).text());});  
        });  
})(jQuery);  
$(“pp”).style.display='none';  //使用prototype   
jQuery.noConflict();            //将变量$的控制权移交给prototype.js  
jQuery(function($){            //使用jQuery加载页面函数  
    $(function(){                //内部继续使用$均为jQuery          
         $("p").click(function(){alert($(this).text());});      
    });  
});  
 $("pp").style.display='none';  //使用prototype

三、元素样式操作

1、遍历

在CSS 获取上,我们也可以获取多个CSS 样式,而获取到的是一个对象数组,如果用传统方式进行解析需要使用for in 遍历。

var box = $('div').css(['color', 'height', 'width']);      //得到多个CSS 样式的数组对象
for (var i in box) { //逐个遍历出来
    alert(i + ':' + box[i]);
}

jQuery 提供了一个遍历工具专门来处理这种对象数组,$.each()方法,这个方法可以轻松的遍历对象数组。

$.each(box, function (attr, value) { //遍历JavaScript 原生态的对象数组
    alert(attr + ':' + value);
});

使用$.each()可以遍历原生的JavaScript 对象数组,如果是jQuery 对象的数组怎么使用.each()方法呢?

$('div').each(function (index, element) { //index 为索引,element 为元素DOM
    alert(index + ':' + element);
});

2、传递参数

如果想设置某个元素的CSS 样式的值,但这个值需要计算我们可以传递一个匿名函数。

$('div').css('width', function (index, value) {   //index 为索引,value为css值
    return (parseInt(value) - 500) + 'px';
});

3、切换样式

.toggleClass()方法的第二个参数可以传入一个布尔值

  • true 表示执行切换到class 类
  • false表示执行回默认class 类(默认的是空class),运用这个特性,我们可以设置切换的频率
    var count = 0;
    $('div').click(function () { //每点击两次切换一次red
        $(this).toggleClass('red', count++ % 3 == 0);
    });

默认的CSS 类切换只能是无样式和指定样式之间的切换,如果想实现样式1 和样式2之间的切换还必须自己写一些逻辑。

$('div').click(function () {
    $(this).toggleClass('red size'); //一开始切换到样式2
    if ($(this).hasClass('red')) { //判断样式2 存在后
        $(this).removeClass('blue'); //删除样式1
    } else {
        $(this).toggleClass('blue'); //添加样式1,这里也可以addClass
    }
});

上面的方法较为繁琐,.toggleClass()方法提供了传递匿名函数的方式,来设置你所需要切换的规则。

$('div').click(function () {
    $(this).toggleClass(
    function () {             //传递匿名函数,返回要切换的样式 
      return $(this).hasClass('red') ? 'blue' : 'red size';
    });
});

上面虽然一句话实现了这个功能,但还是有一些小缺陷,因为原来的class 类没有被删除,只不过被替代了而已。所以,需要改写一下。

$('div').click(function () {
    $(this).toggleClass(function () {
    if ($(this).hasClass('red')) {    // 更加局部化
        $(this).removeClass('red');
        return 'green';
    } else {
        $(this).removeClass('green');
        return 'red';
    }
    });
});

对于.toggleClass()传入匿名函数的方法,还可以传递index 索引、class 类两个参数以及频率布尔值,可以得到当前的索引、class 类名和频率布尔值。

var count = 0;
$('div').click(function () {
    $(this).toggleClass(function(index, className, switchBool) {
        alert(index + ':' + className + ':' + switchBool);        //得到当前值
        return $(this).hasClass('red') ? 'blue' : 'red size';
    },count++ % 3 == 0);                                         //增加第二个频率参数
});

四、基础事件

1、绑定事件

bind(type, [data], fn)

  • type 表示一个或多个类型的事件名字符串
  • [data]是可选的,作为event.data 属性值传递一个额外的数据,这个数据是一个字符串、一个数字、一个数组或一个对象
  • fn 表示绑定到指定元素的处理函数
//1. 使用点击事件
$('input').bind('click', function () {      //1.1 点击按钮后执行匿名函数
    alert('点击!');
});
//普通处理函数
$('input').bind('click', fn);               //1.2 执行普通函数式无须圆括号
function fn() {
    alert('点击!');
}
//2. 可以同时绑定多个事件
$('input').bind('mouseout mouseover', function () { //移入和移出分别执行一次
    $('div').html(function (index, value) {
        return value + '1';
    });
});
//3. 通过对象键值对绑定多个参数
$('input').bind({ //传递一个对象
     'mouseout' : function () { //事件名的引号可以省略
         alert('移出');
    },
    'mouseover' : function () {
         alert('移入');
    }
});
//4. 使用unbind 删除绑定的事件
$('input').unbind();    //删除所有当前元素的事件
//5. 使用unbind 参数删除指定类型事件
$('input').unbind('click'); //删除当前元素的click 事件
//6. 使用unbind 参数删除指定处理函数的事件
function fn1() { alert('点击1');}
function fn2() {alert('点击2');}
$('input').bind('click', fn1);
$('input').bind('click', fn2);
$('input').unbind('click', fn1); //只删除fn1 处理函数的事件

2. 简写事件

为了使开发者更加方便的绑定事件,jQuery 封装了常用的事件以便节约更多的代码。我们称它为简写事件

说明:

  • .mouseover()和.mouseout()表示鼠标移入和移出的时候触发,.mouseenter()和.mouseleave()表示鼠标穿过和穿出的时候触发,.mouseenter()和.mouseleave()这组穿过子元素不会触发,而.mouseover()和.mouseout()则会触发
  • .keydown()、.keyup()返回的是键码,而.keypress()返回的是字符编码
  • .focus()和.blur()分别表示光标激活和丢失,事件触发时机是当前元素。而.focusin()和.focusout()也表示光标激活和丢失,但事件触发时机可以是子元素。

3、复合事件

jQuery 提供了许多最常用的事件效果,组合一些功能实现了一些复合事件,比如切换功
能、智能加载等。

3.1 hover

//背景移入移出切换效果
$('div').hover(function () {
    $(this).css('background', 'black'); //mouseenter 效果
}, function () {
    $(this).css('background', 'red'); //mouseleave 效果,可省略
});

3.2 .toggle()这个方法比较特殊,这个方法有两层含义,第一层含义就是已经被1.8 版废用、1.9 版删除掉的用法,也就是点击切换复合事件的用法。第二层函数将会在动画那章讲解到。既然废弃掉了,就不应该使用。被删除的原因是:以减少混乱和提高潜在的模块化程度。

但你又非常想用这个方法,并且不想自己编写类似的功能,可以下载jquery-migrate.js文件,来向下兼容已被删除掉的方法。

我们也可以自己实现这个功能。

var flag = 1; //计数器
$('div').click(function () {
if (flag == 1) { //第一次点击
    $(this).css('background', 'black');
    flag = 2;
} else if (flag == 2) { //第二次点击
    $(this).css('background', 'blue');
    flag = 3
    } else if (flag == 3) { //第三次点击
    $(this).css('background', 'red');
    flag = 1
    }
});

五、事件对象

5.1 事件对象

JavaScript 在事件处理函数中默认传递了event 对象,也就是事件对象。但由于浏览器的兼容性,开发者总是会做兼容方面的处理。jQuery 在封装的时候,解决了这些问题,并且还创建了一些非常好用的属性和方法。

//通过处理函数传递事件对象
$('input').bind('click', function (e) {  //接受事件对象参数
    alert(e);
});

//通过event.type 属性获取触发事件名
$('input').click(function (e) {
    alert(e.type);
});
//通过event.target 获取绑定的DOM 元素
$('input').click(function (e) {
    alert(e.target);
});
//通过event.data 获取额外数据,可以是数字、字符串、数组、对象
$('input').bind('click', 123, function () { //传递data 数据
    alert(e.data); //获取数字数据
});
//  注意:如果字符串就传递:'123'、如果是数组就传递:[123,'abc'],如果是对象就传递:
{user : 'Lee', age : 100}。数组的调用方式是:e.data[1],对象的调用方式是:e.data.user。
//event.data 获取额外数据,对于封装的简写事件也可以使用
$('input').click({user : 'Lee', age : 100},function (e) {
    alert(e.data.user);
});
注意:键值对的键可以加上引号,也可以不加;在调用的时候也可以使用数组的方式:
    alert(e.data['user']);
//获取移入到div 之前的那个DOM 元素
$('div').mouseover(function (e) {
    alert(e.relatedTarget);
});
//获取移出div 之后到达最近的那个DOM 元素
$('div').mouseout(function (e) {
    alert(e.relatedTarget);
});
//获取绑定的那个DOM 元素,相当于this,区别与event.target
$('div').click(function (e) {
    alert(e.currentTarget);
});
各个参数说明案例

说明: event.target 得到的是触发元素的DOM,event.currentTarget 得到的是监听元素的DOM。而this也是得到监听元素的DOM

  • 触发元素: 点击哪个就是哪个
  • 监听元素: 绑定哪个就是哪个

5.2 冒泡和默认行为

  • 阻止冒泡:event.stopPropagation();     这个方法设置到需要触发的事件上时,所有上层的冒泡行为都将被取消。
  • 阻止默认行为:event.preventDefault() ;比如:右击文本框输入区域,会弹出系统菜单、点击超链接会跳转到指定页面、点击提交按钮会提交数据。
    //禁止提交表单跳转
    $('form').submit(function (e) {
        e.preventDefault();
    });
  • 同时阻止默认行为且禁止冒泡行为 return false

六、高级事件+事件委托

 1、事件委托

在下面两种情况下推荐使用事件委托的绑定方式,否则推荐使用普通绑定

  • 在DOM 中很多元素绑定相同事件时——绑定父元素,即多个子元素绑定到一个父元素
  • 在DOM 中尚不存在即将生成的元素绑定事件时——动态绑定
<div style="width:200px;height:200px;background:green;" id="box">
    <input type="button" class="button" value="按钮" />
</div>
<javascripy>
$('#box').on('click', '.button', function () {
   $(this).clone().appendTo('#box');   //动态绑定,生成的新button同样绑定给父元素box,具有点击行为
});
</javascripy>

2. on、off和one

jQuery1.7 以后推出了.on()和.off()方法彻底摒弃了.bind()、.unbind()、.delegate()和.undelegate()

//替代.bind()方式
$('.button').on('click', function () {
    alert('替代.bind()');
});
//替代.bind()方式,并使用额外数据和事件对象
$('.button').on('click', {user : 'Lee'}, function (e) {
    alert('替代.bind()' + e.data.user);
});
//替代.bind()方式,并绑定多个事件
$('.button').on('mouseover mouseout', function () {
    alert('替代.bind()移入移出!');
});
//替代.bind()方式,以对象模式绑定多个事件
$('.button').on({
  mouseover : function () {
    alert('替代.bind()移入!');
},
  mouseout : function () {
    alert('替代.bind()移出!');
}
});
//替代.bind()方式,阻止默认行为并取消冒泡
$('form').on('submit', function () {
    return false;
});
//或
$('form').on('submit', false);
//替代.bind()方式,阻止默认
$('form').on('submit', function
    e.preventDefault();
});
//替代.bind()方式,取消冒泡
$('form').on('submit', function
    e.stopPropagation();
});
//替代.unbind()方式,移除事
$('.button').off('click');
$('.button').off('click', fn);
$('.button').off('click.abc');
//替代.live()和.delegate(),事件委托
$('#box').on('click', '.button', function () {
  $(this).clone().appendTo('#box');
});
//替代.die()和.undelegate(),取消事件委托
$('#box').off('click', '.button');

 不管是.bind()还是.on(),绑定事件后都不是自动移除事件的,需要通过.unbind()和.off()来手工移除。jQuery 提供了.one()方法,绑定元素执行完毕后自动移除事件,可以方法仅触发一次的事件。

//类似于.bind()只触发一次
$('.button').one('click', function () {
  alert('one 仅触发一次!');
});
//类似于.delegate()只触发一次
$('#box).one('click', 'click', function () {
  alert('one 仅触发一次!');
});

六、命名空间

有时想对事件进行移除。但对于同名同元素绑定的事件移除往往比较麻烦,这个时候,可以使用事件的命名空间解决。

$('input').bind('click.abc', function () {
  alert('abc');
});
$('input').bind('click.xyz', function () {
  alert('xyz');
});
$('input').unbind('click.abc'); //移除click 实践中命名空间为abc 的

 

 

 

转载于:https://www.cnblogs.com/JoannaQ/p/3653314.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值