零JS筆記 | 記憶點二

取值,只會取第一位、賦值,則是全部改變


filter:過濾;not:排除

注意:filter与has的区别,filter是针对当前操作元素,has是针对当关操作元素里面的东西;包含的意思

    //$('.box').filter('[title=one]')
    //取值时:当集合,只会取到第一位
    console.log($('li').html());
    //赋值时,则是全部改变
    $('li').html('aaa')
    //filter not,相反
    $('div').filter('.box').css('background','red')
    $('div').not('.box').css('background','red')
    //has 包含元素
    $('div').has('span').css('background','red')

next()與prev():緊跟相鄰元素【必要條件】,如果帶參數,也必須是緊跟相鄰元素,如果操作下一個選擇類名,必須使用nextALl()/prevAll()

注意:index():當前元素在所有兄弟節點的位置,不帶參數時與標籤或類id等無關

<h1></h1>
<h5></h5>
<h3 id='h'></h3>
<h2></h2>

$('#h').index() //2

width(): width

innerWidth():width+padding

outerWidth():width+padding+border

outerWidth(true):width+padding+border+margin


offsetLeft獲取不到隱藏的值 ;如果div.style.display = 'none'

$('div').get(0).offsetWidth  //0 
$('div').outerWidth() // 100,可獲取到隱藏元素

insertBefore/insertAfter; appendTo,prependTo動詞

$('span').insertBefore('div') //操作span在div前面
$('span').insertAfter('div') //操作span在div後面

before ,after, append ,preend,名詞

$('span').before('div') //span的前面必須是div
$('span').after('div') //span的後面必須是div

offset()獲取到屏幕的距離,注意與offsetleft的區別(offsetleft到有定位父級的元素,如果獲取到屏幕的距離 需)

    function getPos(obj){
        var pos = {left: 0, top:0};
        while (obj) {
            pos.left +=obj.offsetLeft;
            pos.top +=obj.offsetTop;
            obj = obj.offsetParent
        }
        return pos;
    }

position(),當使用position()時,相當於被操作元素加個定位,注意本身被操作元素的margin值不影響的,即到有定位的父級

    console.log($('div').position().left);
    //到有定位的父級的left值,把當前元素轉換為定位的形式,所以margin是不影響的,因為定位元素的left及top值

parent():獲取父級(不管是否有定位)

offsetParent():獲取有定位的父級<br />對應 offsetNode</p>

jq寫drag

    $(function () {
        var disX = 0;
        var disY = 0;
        $('div').mousedown(function (e) {
            disX = e.pageX - $(this).offset().left;
            disY = e.pageY - $(this).offset().top;
            $(document).mousemove(function (e) {
                $('div').css({'left': e.pageX - disX});
                $('div').css({'top': e.pageY - disY});
            })
            $(document).mouseup(function () {
                $(document).off()
            })
        })
        return false;
    })

fadeTo(時間,透明度)

get(),jq轉原生:$('#div1').get(0).innerHTML;get()如果不加參數,相當於轉成一組集合;

for(var i=0;i<$('li').length;i++){
    $('li').get(i).style.background = 'red'
}

更簡單的,加上[i]則自動轉為原生

for(var i=0;i<$('li').length;i++){
        $('li')[i].style.background = 'red' 
    }

text(),當選擇為一組元素集合時;會獲取到所有的內容,而html()只會獲取到集合中的第一個;

remove(),刪除的元素返回值即被刪元素;所以 var _div = $('div').remove()


detach()跟remove()一樣,但會保留事件;


parents():获取当前元素的所有祖先节点,参数就是筛选功能

closest():获取最近的祖先节点,包括自身,必须写参数

Until()截止的意思:
nextUntil('h2'),当走到h2包括h2自身都不会走下去;

类似有:parentsUntil()、nextUntil()、prevUntil()

clone()

$('div').clone().appendTo( $('body') )

wrap():包装方法

$('span').wrap('<b></b>')

//<b><span></span></b>
//<b><span></span></b>
$('span').wrapAll('<b></b>')

//<b><span></span><span></span></b>

wrapInner内部包装

$('span').wrapInner('<b></b>')

//<span><b></b></span><span><b></b></span>

unwrap():删除包装、删除父级;不包括body

<span></span>
<div><span></span></div>

====>>
$('span').unwrap()
//结果:把span的父级删除
<span></span>
<span></span>

add():添加组合:使用两个不同标签或类的组合在一起可一次性设置相同的属性,如背景

//使用span 及div 的背景色都为yellow;
    var elem = $('div')
    var elem2 = elem.add('span')
    elem.css('color','red')
    elem2.css('background','yellow') //div及span

slice():截取一组元素的前几位;

$('li').slice(1,4).css('background','red')
    //截止起始到终止的元素,不包括终止元素,即截取前3个;

serialize():数据串连:序列化

<form>
    <input type="text" name="a" id="" value="1"/>
    <input type="text" name="b" id="" value="2"/>
    <input type="text" name="c" id="" value="3"/>
</form>

console.log($('form').serialize());
//string: a=1&b=2&c=3

数组形式:serializeArray()

 console.log($('form').serializeArray());

 [ { name="a",  value="1"},  { name="b",  value="2"},  { name="c",  value="3"}]

animate({},时间,运动形式,回调)

    //先走宽再走高;
    $(this).animate({width: 300}, 1000).animate({height: 300}, 2000)

stop():默认只会阻止当前运动;

stop(true):阻止后续运动;
stop(true,true):可以立即停止到指定的目标点;
finish():立即停止到所有目标点上;

    //先走宽再走高;
    $(this).animate({width: 300}, 1000).delay(1000).animate({height: 300}, 2000)

事件委托,注意顺序区别,on要先写动作'click',再写被点击元素,delegate则相反,顺序写反不能生效


取消分别为off(),undelegate()

$('ul').on('click','li',function(){   //on(动作,元素,函数)
    this.style.background = 'red'
})
//或
$('ul').delegate('li','click',function(){ //delegate(元素,动作,函数)
    this.style.background = 'red'
})

trigger()主动触发; 当然主要用在自定义事件上;

$('box').trigger('click');

$('div').on('show',function(){
    alert(1)
})
$('div').trigger('show')

ev.data /ev.target / ev.type

//ev.data点击时传参;ev.data == json整体 
$('#div1').on('click', {name: 'hello'}, function (ev) {
    alert(ev.data.name)
})

//ev.target当前操作事件源;
$('#div1').on('click', function (ev) {
    ev.target.style.background = 'red'   //当前操作变红;
})
//ev.type
$('#div1').on('click', function (ev) {
    alert(ev.type)  //click
})


$.下的常用方法;工具方法


$.(),$().html(),$().val()等,只能给JQ对象用


$.xxx..不带括号;不仅可给JQ用,也可给原生用,工具方法;

$.type

var a = 'hello'
console.log(typeof a); //原生: string
console.log($.type(a)); //JQ: string  比原生可判断更多类型;
console.log($.type(new Date)); //data
console.log($.type({})); //obj
console.log($.type([])); //array
console.log($.type(null)); //null

$.trim(str),去前后空格;

$.inArray(),类似于indexOf

var arr = ['a','b','c','d']
console.log($.inArray('b', arr));  //1,b的位置第二位,如果找不到则返回-1

$.proxy():改变this指向;$.proxy(函数名,要改的this指向位置)()最后再调用,否则不会运行;

function show(){
    alert(this)
}
//  show()  //window

$.proxy(show,document)()

//传参的情况;
function show(n1,n2){
    alert(n1)
    alert(n2)
    alert(this)
}
//    show()  //window
$.proxy(show,document)(3,4)
//$.proxy(show,document,3,4)()
//$.proxy(show,document,3)(4) 
传参的位置都改;

//比如: 
$(document).click(show)  //默认是document

//更改为window
$(document).click($.proxy(show,window))

//事件的传参只能写在里面,写在外面则直接执行了(不需要点击执行,不是要的效果)

$(document).click($.proxy(show,window,3,4))

$.noConflict():防止冲突

    var mm = $.noConflict();
    var $ = 10;  //被10占用时
    mm(function () {
        
    })

$.parseJSON():把字符串解析成JSON类型

var str  = '{"name":"hello"}'
console.log($.parseJSON(str));

//所以:$.parseJSON(str).name即可找到'hello'

$.makeArray():把类数组转成真正的数组

//比如:
    var _div = document.getElementsByTagName('div')  //类数组
    _div.push();
//虽然是集合,但并不是真正的数组,所以不能push

  $.makeArray(_div).push('a')

$.ajax({})

$.ajax({
    type:'POST',
    url:'xxx.php',
    dataType:'json',
    success: function (data) {
        alert(data);
    },
    error:function(){
        alert(2)
    }
})

$.get(url,{},成功的回调)


$.post(url,{},成功的回调)


$.getJSON(url,{},成功的回调),支持JSONP形式:指定?callback=?; jsonp需要一个函数名;

$.getJSON('xxx.php?callback=show',function(){
});
show()

插件的使用


$.extend()://工具方法下的形式;

$.fn.extend()// 扩展到jq对象下的形式</p>
$.extend({
    leftTrim: function (str) {
        return str.replace(/^\s+/,'')
    },
    rightTrim:function(){},
    aaa:function(){alert(1)},
    bbb:function(){}
})

//调用
$.leftTrim(str)
$.aaa() //1
$.fn.extend({
    drag:function(){
        var disX = 0;
        var disY = 0;
        var _this = this;
        this.mousedown(function(e){
            disX = e.pageX - $(this).offset().left;
            disY = e.pageY - $(this).offset().top;
            $(document).mousemove(function(e){
                _this.css('left', e.pageX - disX);
                _this.css('top', e.pageY - disY);
            })
            $(document).mouseup(function(){
                $(this).off()
            })
            return false
        })
    },
    aaa:function(){
        alert(2)
    }
})

//调用:$('#div1').drag()
//$().aaa(); //2



超简单版vquery


$()类似于函数调用,即$是函数名;

1、$('div')===> function $(vArg){ } //vArg表示不定类型的参数;


2、$().css(),函数调用函数? ===》类似于创建面面对像:var arr = [] ; arr.push();<br />对像.函数(),所以,要使用$()是一个对象;

function $(vArg){
    return object;
}

使用对象必须创建构造函数,所以架子是:

function Vquery(vArg){
var this.elements = [] //存的是$()里的东西
    
}

Vquery.prototype.css = function(){};
Vquery.prototype.html = function(){};

function $(vArg){
    return new Vquery(vArg);
}
//必须传参才能使用,重点是返回对象;

未作容错


function bindEvent(obj, events, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(events, function (e) {
            //fn() -- > false
            //不写return false ===> undefined
            //undefined == false == >返回false
            if (fn() == false) {
                e.preventDefault();
                e.cancelBubble = true; //冒泡
            }
        }, false)
    }
    else {
        obj.attachEvent('on' + events, function () {  //IE下
            if (fn() == false) {
                window.event.cancelBubble = true; //IE下阻止冒泡
                return false;//IE下阻止默认事件
            }
        })
    }
}
function getByClass(_parent, sClass) {
    var arr = [];
    var elems = _parent.getElementsByTagName('*')
    for (var i = 0; i < elems.length; i++) {
        if (elems[i].className == sClass) {
            arr.push(elems[i])
        }
    }
    return arr;
}
function getStyle(obj, attr) {
    return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj, false)[attr];
}
function toArray(elems) {
    var arr = []
    for (var i = 0; i < elems.length; i++) {
        arr.push(elems[i])
    }
    return arr;
}
function Vquery(vArg) {
    this.elements = []
    switch (typeof vArg) {
        case 'function':
            bindEvent(window, 'load', vArg);
            break;
        case 'string':

            switch (vArg.charAt(0)) {
                case '#':
                    this.elements.push(document.getElementById(vArg.substring(1)));
                    break;
                case '.':
                    this.elements = getByClass(document, vArg.substring(1));
                    break;
                default :
                    this.elements = toArray(document.getElementsByTagName(vArg)) //类数组 ,所以类型改变了,to为了保持this.elements的类型;
                    break;
            }
            break;
        case 'object' ://vArg.constructor == Array //注意不加引号
            if (Object.prototype.toString.call(vArg) == '[object Array]') {

                this.elements = vArg;
            } //如果得到的object是数组,则再push变成复合数组[[]],所以需要处理;
            else {
                this.elements.push(vArg);
            }
            break;
    }
}

Vquery.prototype.html = function (str) {
    if (str) {
        for (var i = 0; i < this.elements.length; i++) {
            this.elements[i].innerHTML = str;
        }
    }
    else {
        return this.elements[0].innerHTML;
    }
    return this;
}
Vquery.prototype.click = function (fn) {
    for (var i = 0; i < this.elements.length; i++) {
        bindEvent(this.elements[i], 'click', fn)
    }
    //this.on('click',fn)
    return this;
}
Vquery.prototype.mouseover = function (fn) {
    for (var i = 0; i < this.elements.length; i++) {
        bindEvent(this.elements[i], 'mouseover', fn)
    }
    //this.on('mouseover',fn)
    return this;
}
Vquery.prototype.on = function (event, fn) {
    for (var i = 0; i < this.elements.length; i++) {
        bindEvent(this.elements[i], event, fn)
    }
    return this;
}
Vquery.prototype.hide = function () {
    for (var i = 0; i < this.elements.length; i++) {
        this.elements[i].style.display = 'none'
    }
    return this;
}
Vquery.prototype.show = function () {
    for (var i = 0; i < this.elements.length; i++) {
        this.elements[i].style.display = 'block'
    }
    return this;
}
Vquery.prototype.hover = function (fnIn, fnOut) {
    this.on('mouseover', fnIn);
    this.on('mouseout', fnOut)
    return this;
}
Vquery.prototype.css = function (attr, value) {
    if (arguments.length == 2) {  //设置

        for (var i = 0; i < this.elements.length; i++) {
            this.elements[i].style[attr] = value;
        }
    }
    else if (arguments.length == 1) {  //获取
        if (typeof attr == 'object') {   //注意理解此处
            for (var j in attr) {
                for (var i = 0; i < this.elements.length; i++) {
                    this.elements[i].style[j] = attr[j];
                }
            }
        }
        else {
            return getStyle(this.elements[0], attr)
        }
    }
    return this;
}
Vquery.prototype.attr = function (attr, value) {
    if (arguments.length == 2) {  //设置
        for (var i = 0; i < this.elements.length; i++) {
            this.elements[i].setAttribute(attr, value);
        }
    }
    else if (arguments.length == 1) {  //获取
        return this.elements[0].getAttribute(attr);

    }
}
Vquery.prototype.eq = function (num) {
    //return this.elements[num];  //this.elements获取到的都是原生的;所以
    return $(this.elements[num])   //转换对象;
}
Vquery.prototype.index = function () {
    var elems = this.elements[0].parentNode.children; //先找当前选中的父节点,再找子节点可得出同辈所有;
    for (var i = 0; i < elems.length; i++) {
        if (elems[i] == this.elements[0]) {
            return i;
        }
    }
}
Vquery.prototype.siblings = function () {
    var arr = []
    var elems = this.elements[0].parentNode.children; //先找当前选中的父节点,再找子节点可得出同辈所有;
    for (var i = 0; i < elems.length; i++) {
        if (!(elems[i] == this.elements[0])) {
            arr.push(elems[i])
        }
    }
    return $(arr)
}

Vquery.prototype.find = function (sel) {
    var arr = [];
    if (sel.charAt(0) == '.') { //.class
        //这里的this.elements存的是$()里面的东西
        for (var i = 0; i < this.elements.length; i++) { //循环每一个ul里
            arr = arr.concat(getByClass(this.elements[i], sel.substring(1)));
            //每一个ul -->  this.elements下可能会有多个li,
            //比如,第一次找个2个,第2次找到3个,所以需使用数组concat方法
            //注意此次不能使用push,因为 getByClass方法得到的即为数组;
            //2,也不能简单 =  因为比如第2次得到3个会覆盖第一次得到的2个,
            //所以,使用arr.concat
        }
    }
    else { //tag
        for (var i = 0; i < this.elements.length; i++) {
            arr = arr.concat(toArray(this.elements[i].getElementsByTagName(sel))) //类数组转
        }
    }
    return $(arr); //同样是原生的,所以需要使用 $(arr)
}

function $(vArg) {
    return new Vquery(vArg) //返回对象
}

$.trim = function (str) {
    return str.replace(/^\s+|\s+$/g,'')
}
$.proxy = function(){}
$.makeArray = function(){}
$.inArray = function(){}


$.extend = function(json){
    for(var attr in json){
        $[attr] = json[attr]
    }
}
$.fn = {}
$.fn.extend = function(json){
    for(var attr in json){
        Vquery.prototype[attr] = json[attr]
    }
}

插件扩展


工具写法:$.extend(); JQ对象写法:$.fn.extend()

      $.extend({

            aaa:function(){
                alert(1)
            },
            bbb:function() {
                alert(2)
            }

        })
        $.aaa() //1
        $.bbb() //2


//必须扩展到Vquery的原型下;
        $.fn.extend({

            aaa:function(){
                alert(4)
                return this;
            },
            bbb:function() {
                alert(5)
                return this;
            }

        })
         //4
        $().bbb().aaa() //5

零JQ筆記 | 記憶點一

1、jq先引入,base後引入,則$歸base所有,所以可定義一個來使用jquery

var $fn = jQuery; 
$(function(){
  alert($fn('#box'))
})

//或直接 
alert(jQuery('#box'))

2、jq後引入,則$歸jq,所以jq提供一個方法來剔除本身的$

jQuery.noConflict(); 
var $fn = jQuery
alert($fn('#box'))



選擇器


jq獲取id時,無論頁面上有多少個都只返回1個;

$('.box>p') ===  $('.box').children('p')  //即只看子選擇,孫子後失明
$('.box+p') === $('.box').next('p')
$('.box~p') === $('.box').nextAll('p')
find()/next()/nextAll()/children() 1、如果不傳參,相當於find('*'),影響性能,建議傳參 2、性能高於高級選擇器 $('.box').find('p'),性能最好 $('p','.box'),轉成1,慢5%-10% $('.box')children('p'),慢50% $('.box>p')慢70% $('.box p')慢77% $('p',$('.box'))慢23% var box = $('.box'); var p=box.find('p');性能會提升 如jq有提供獨立的方法,優先推薦使用

pervUntil / nextUntil

$('.box').pervUntil('p').css() 
$('.box').nextUntil('p').css() //與.box同級,一直向下搜索,遇到p以前的所有元素都被css選中

a[title|=num] 具有這個屬性,或開頭屬性匹配後面一個 - 號的DOM
a[title!=num] 不等於這個屬性
a[title~=num] 具有這個屬性,且以空格分割的屬性
aabc 選取class=box,且存在bbb這個屬性

:not(.box)選取class不是box
:first :last需要指明哪個元素是父元素
:has(.box)選取有class為box
:parent選取有子元素或文本的元素

.has(.box)可提高性能
.parentsUntil('div'),遇到div父元素停止

:hidden
:visible

$('li:first-child')獲取每個父元素的第一個子元素

其他方法 :

.is(s/o/e/f)
.hasClass()
$('li').slice(0,2),選取從start到end位置的元素

$('div').contents() 獲取某個元素下面所有節點,包文本,如是iframe,則可查找文本內容

$('div').filter('.box')選擇div下面的.box元素

當然 ,filter也支持fn操作

$('div').filter(function(){
return ......
})



DOM操作


attr()裏的function(){}可不傳參,或只傳一個index,表示當前元素的索引0開始,
html(),text(),val(),is(),filter(),都可以使用使用fn返回,如集合,則可以傳index來獲取索引;
如:

$('#ul1 li').attr('class', function (index) {
    return 'pro'+index

})
removeAttr('title'),无法传递index 及 value
var boxColor = $('.box').css(['width','height','color'])
for(var i in boxColor){
  alert(i+'boxColor[i]')
}

特别留意:标签与class同名时:index相加,即两个对象要获得一一匹配,则需要传参数过滤类型:如:

<h5>hhhhhhhhhhhhhhh</h5>
<div class='h5'>dididididididididid</div>
<h5>hhhhhhhhhhhhhhh</h5>
<div class='h5'>dididididididididid</div>
        var _sh5 = $('*').find('h5');
        var _sch5 = $('*').find('.h5');
        _sh5.on('click',function(){
                _sch5.eq($(this).index('h5')).stop().slideToggle();
        });


$.each操作原生數組 :

var arr = [1,2,3] //原生数组
var arrN = []
$.each(arr, function () {
   arrN.push(this+'1') //this指每个值
})
console.log(arrN);  [11,21,31]

$(function () {
    $('li').each(function (i, e) {
    console.log(i+':' + e.innerHTML);  
//注意,e代表DOM 元素,所以是js的方法innerHTML,不能使用html()
    })
})

var count = 0;
$('box').click(function () {
    $(this).toggleClass('red',count++%3==0)  
//传参数,返回布尔,点2次切换,相当于频率参数
})

特殊方法:

$('li').css('width', function (i, v) { //i表示索引,v表示当前dom所对应的属性值
    return (parseInt(v)-50)+'px'
})


$('.box').width() //不包

$('.box').innerwidth() //包内边距

$('.box').outerWidth() // padding+border

$('.box').outerWidth(true) //padding+border+margin

$('.box').offset().left //相对视口
$('.box').position().left //相对父元素
$(window).scrollTop() //滚动条位置



DOM节点

$('.box').append(function (i, html) {  //html表示.box未插入前原有的内容,不包括.box标签
    console.log(html);
    return '<strong>节点</strong>'
})

$('.box').prepend(function (i, html) {
    console.log(html);
    return '<strong>节点</strong>'
})

$('.box').wrapInner(function () {    //向box里的内容用<b></b>包起来
    return '<b>bbb</b>'
})

wrap() wrapAll(),前面把每个元素当成一个独立体,后者作为整体包住

$("button").click(function(){  //删除每个p的父级元素;
  $("p").unwrap();
});

.remove('.box'),移除指定.box
.datach()保留事件;
.empty()

节点被替换后所有事件都消失
$('.box').replaceWith('<strong></strong>') === $('').replaceAll($('.box')) 返回结果不同,[链式],返回都是所操作的元素,即第一个元素;
另:reference = element.replaceChild(newChild,oldChild)



表單


如果是表单元素都必须含有name属性

:image所有图像按钮
:file所有文件按钮
:hidden所有不可见字段
$(':input')

:enabled 所有可见
:disabled 所有不可用
:checked 单选和复选
:selected 下拉



基础事件


注意:bind在1.7版本後推薦使用整合on

$('input').bind('mouseout mouseover',function(){  //移入移出分别执行一次
  $('div).html(function(i,v){
    return v+ '1'
  })
})

$('input').bind({
  'mouseout':function(){
    alert('out')
  },
  'mouseover':function(){
    alert('over')
  }
})

select()文本选定时触发,
change()文本改变时触发
submit(),在定要在form作用内才能触发;
mouseover mouseenter 穿过子节点是否触发
unload()新版不支持 ie支持 ,chrome不支持,一般用于清理工作;


keydown keyup返回键码,keypress返回字符编码;事件对像的keycode
keypress 返回的是字符编码,使用charCode

$('#i2').keyup(function (e) {
    console.log(e.keyCode);  //65 键码 
})

$('#i2').keypress(function (e) { //97 字符编码
    console.log(e.charCode);
})


hover == mouseenter mouseleaver
focus blur 必须是当前元素触发
focusin focusout 穿過子元素也會觸發,相當於mouseover mouseenter的區別;

//1.7後刪除的toggle切换功能,替換實現; 
var flag = 1
$('.box').on('click',function(){
  if(flag==1){
    $(this).css('color','#000')
    flag =2;
  }
  if(flag==2){
    $(this).css('color','#cd0000')
    flag =1;
  }
})



事件對像


<style>
.jq-tb{

width:100%;border-collapse: collapse

}
.jq-tb td{border:1px solid #ccc;padding:5px;}
.jq-tb tr>td:first-child{min-width: 100px;

text-align: center;}

</style>

e.type 獲取事件的類型,如click;
e.target 綁定DOM元素,所以如改變是innerHTML
e.data 添加額外數據,可以是num,str,arr,obj
$('p').on('click',123, function (e) {
    console.log(e.data);  //123
})

</td>

</tr>
<tr>
    <td>e.relatedTarget</td>
    <td>获取移入到box之前的那个dom元素
$('.box').mouseover(function(e){
  alert(e.relatedTarget)
})

</td>

</tr>
<tr>
    <td>e.currentTarget</td>
    <td>绑定的DOM元素,相当于this,区别与e.target
$('.box').click(function(e){
  e.currentTarget //
})

</td>
</tr>

<tr>
    <td>e.e.pageX/Y</td>
    <td>页面原点,一拉动滚动条,则肯定比clientX大</td>
</tr>
<tr>
    <td>e.screenX/Y</td>
    <td>相对于屏幕的位置</td>
</tr>
<tr>
    <td>e.clientX/Y</td>
    <td>可視區xy,與滾動條無關 </td>
</tr>
<tr>
    <td>e.result</td>
    <td>同一元素绑定事件上一个的return返回值;</td>
</tr>
<tr>
    <td>e.timeStamp</td>
    <td>时间戳</td>
</tr>
<tr>
    <td>e.which</td>
    <td>1、如果使用鼠標,則左1中2右3;<br />2、使用按鍵觸發,則返回keyCode</td>
</tr>
<tr>
    <td>e.altKey/e.shifeKey/e.ctrlKey/e.metaKey</td>
    <td>是否按下,true false</td>
</tr>

方法:

e.preventDefault() 取消默認行為
e.isDefaultPrevented() 是否調用e.preventDefault()方法
e.stopPropagation() 取消冒泡
e.isPropagationStopped() 是否調用e.stopPropagation()方法
e.stopImmediatePropagation() 取消事件冒泡,并取消事件的后续处理函数
$('.box').click(function (e) {
    e.stopImmediatePropagation()  //调用取消冒泡,
})
$('.box').click(function (e) {
alert(123)                        //并且这里也不会执行
})

</td>
</tr>
<tr>

<td>e.isImmediatePropagationStopped()</td>

<td>判断是否调用了...方法 </td>
</tr>
</table>



高級事件


模拟点击

//注意与bind获取额外数据的区别:
$('#inp').click(function () {
    alert(123)
}).trigger('click')   //.click() 简写

//trigger额外数据只有一条时可省[],多条不能省略,第二条之后无法识别

$('#inp').click(function (e,data1,data2,data3) {
    alert(data1+data2+data3[1])
}).trigger('click',['123','abc',['j','k','l']])


$('p').on('click',123, function (e) {
    console.log(e.data);  //123
})

自定义事义事件,主要给trigger使用,本身自已无法执行

$('#inp').bind('mye', function () {
    alert('自定义可件')
}).trigger('mye')

triggerHandler() 相比 trigger; 有四點不同


1、触发事件但不会执行事件的默认行为;
即相当于模拟:

$('form').submit(function (e) {
    e.preventDefault()
}).trigger('submit')

2、如是$('多个input').只会执行匹配到的第一个,而trigger会执行所有匹配到的

3、返加值,trigger为jq对象,所以可以连写

alert($('#inp').bind('mye', function () {
    alert('自定义可件')
}).trigger('mye')).css('color','red')

而triggerHandler返回值为return值或undefined; 所以无法连写

4、trigger会冒泡,triggerHandler不冒泡

$('input').bind('click.a', function () {
    alert('abc')
})

$('input').bind('click.x', function () {
alert('xyz')
})

$('input').bind('mouseover.a', function () {
alert('abc')
})

$('input').unbind('.a') //即可移除click.a mouseover.a
//当然,对于trigger,trigger('.a')也一样执行两个


事件委託
live(),可以动态绑定,因为live事件是document事件;而点击btn其它是冒泡到document上,并且点击document时需要验证e.type e.target才能触发 ;

(1.4.3jq已淘汰:冒泡传得太长,且不支持连写调用)

$('.btn').live('click', function () {
    $(this).clone().appendTo('#b')
})

//相对的,取消为
$('.btn').die('click')

live的替换方法'父元素'.delegate(‘动作’,‘点击元素’,函数) ; 1.7版本已淘汰,整合到on

$('#b').delegate('click', '.btn',function () {
    $(this).clone().appendTo('#b')
})
//相对的,取消为
$('.btn').undelegate('click')

推荐使用整合:on('动作','点击元素',function)

$('#b').on('click.a','.btn', function () {
    $(this).clone().appendTo('#b')
})

$('#b').off('click.a')

//one只執行一次即取消
$('#b').one('click.a','.btn', function () {
    $(this).clone().appendTo('#b')
})



jq中返回的this是原生的,所以可以這麼寫

var _box = $('.box')
_box.click(function(){
    alert(this.innerHTML);
})
//alert($('input').val()); //获取
//$('input').val('7777'); //针对多个input的value值进行设置
alert($('input').val()); // 针对集合进行获取操作,只获取第一个

[=]
1
[$=]
[*=]

$('li').slice(1,4).css('background','red') //選中的是2,3,4;slice(1,2)什麼都選不中,slice(1,2),選中的是2

closest():找指定的一个最近的祖先元素(包括自身)(该函数必须加参数);它只能选择到一个唯一的元素

// 【指定的节点 == 前面部份 $('ul')  元素 == 被操作部分】

//append():把元素添加到指定的节点的里面的最后
var $li = $('<li>hello</li>');
// $('ul').append($li);

//prepend():把元素添加到指定的节点的里面的最前面  
// $('ul').prepend($li);

//before():把元素添加到指定的节点的前面
// $('ul').before($li);

//after():把元素添加到指定的节点的后面
$('ul').after($li);

appendTo()、prependTo()、insertBefore()、insertAfter(),指定節點與被操作部分對換,即指定要操作的節點放前,目標節點放後;
index():索引值,代表的就是当前元素在所有兄弟节点中排第几。如果不添加参数,索引值与标签类型是无关的。


  1. =
© 2025 J.chongj.chong@qq.com 模板由cho制作.