javascript问题的一些小结
发布日期:2021-10-05 07:45:36 浏览次数:3 分类:技术文章

本文共 7045 字,大约阅读时间需要 23 分钟。

1.parent(),parents(),closest()

parent(selector)//只匹配元素的直接父元素,它可以带一个选择器作为参数,对于匹配符合某些条件的父元素非常有用:

$("span #mySpan").parent().css("background","#f90");

$("p").parent("div .large").css("background","#f90");//对所有的《pa>标记的父元素进行处理

parents(selector)//作用和parent()很像,但它不仅限于匹配元素上一层,也就是说,他能返回多个祖先元素

$("li   .nav").parents('li') //找到他的所有父元素

closest从本身意思上可以看出是:最靠近的。从本身开始,逐级向上级搜索匹配的元素,并返回最先匹配(最靠近该元素)的祖先元素。
 

从选择器匹配的元素------而不是父元素----开始遍历,。。。。。这意味着如果传入closest()的选择器匹配当前操作的元素,将返回自身

$("div     #div2").closest("div").css("background","oragent")//这样找到的就是div2这div本身。

2.position() 和offset()

都返回包含left,top这两个属性的对象,当对象不同

position()返回的是

含有position:relative的元素的最近的父元素或祖先元素----的位置

如果没有这样父元素或者祖先元素,则返回相对文档(即视区左上角)的位置

offset()返回的是:

计算相对文档的位置,不论元素的父元素或祖先元素的position属性如何

3css('width')和css(‘height’)      与 width() 和height()

计算元素的像素值,都是元素真正的维度----不论其如何被内部内容拉伸

区别:返回的数据类型不同。

css()返回字符型维度:即30px

width(),height()返回整数型维度:即30

注意点:尽量少用css()写法,因为ie获取到的是auto,

4click() (etc)、bind()  live()    delegate()

将事件绑定到元素的方法。

$('#table  td').click(function(){

alert('this td you click contains  '+ $(this).text());

});

$("#table  td").bind('click',function(){

alert('this td you click contains  '+ $(this).text());

});

bind特点1,可以一次绑定多个事件,多个事件用空格分隔并作为第一个参数

注:contextmenu是鼠标右键事件

$("#table  td").bind('click     contextmenu',function(){

alert('this td you click contains  '+ $(this).text());

});

还可以这样写:

$("#table td").bind(

"click",function(){},

"blure",function(){},

"keypress",function(e){switch(e.which)  {case 40:  alert('44')//}},

"mouserover",function(){alert($(this).text())}

);

bind特点2:能更好的控制事件处理函数中的处理过程。【通过传递三个参数】

 bind的事件解除:unbind()

$("#table  td").bind("click    contentmenu",{message: 'hello'},function(e){

alert(e.data.message);

});

给回调函数传递了一组变量供它读取。

疑问:为什么不在回调函数之外设置变量并让回调函数读取?

答案:与作用域和闭包有关

当读取变量时,js从直接作用域开始,并向外读取

var  message = "aaaaaaaaaaaaa";

$("#table  td").bind("click",function(e){

alert(message);

});

var  message = "bbbbbbbbbbbbbbb";

$("#table  td").bind("contentmenu",function(e){

alert(message);

});

无论用鼠标左键还是右键,都是弹出bbbbbbb,
因为alert(在触发时读取message变量,而且不是绑定事件时)

如果在绑定事件时给每个事件提供自己的message版本,那么可以解决这个问题

$("#table  td").bind("click",{message:'aaaaaaaaaaaaaaa'},function(e){

alert(e.data.message);

});

$("#table  td").bind("contentmenu",{message:'bbbbbbbbbbbb'}function(e){

alert(e.data.message);

});

live()

die()解除

与bind()作用几乎一样,但又重要区别:可将事件绑定到当前或者未来的元素(当前不存在,加载文档后通过dom脚本生成的元素)

下面是等价写法:主要他们的标点

$("#newDiv").css("width",100);

$("#newDiv").css("height",100);

$("#newDiv").css("background","orange");

《====》

$("#newDIv").css({

"width":100,height:100,background:'orange'});

$("#newDIv").attr("title","aaaa");

$("#newDIv").attr("disabled","disablede");

<======>

$("#newDIv").attr({ 'title':el.attr('title'), 'aria-haspopup':true, 'tabIndex':el.attr('tabIndex') })

 live缺点:与大多数jquery不同,它无法用于链式结构,只能直接用于选择器

$("#myDiv      a").live("mouseover",function(){     alert("sssssssss");});

$("#myDiv “).children('a').live("mouseover",function(){     alert("sssssssss");});//这样会失败

delegate() 与live一样也可以绑定到当前和未来元素中

undelegate()解除

jquey1.4.2中才有的方法,它可以通过将选择器内的上下文,作为第一个参数俩解决上面live的缺点:

1.可以加选择器,选择器也可以写多个,中间逗号隔开

2,还可以连续写多个delegate

$("#myDIv")

.delegate('li.ui-multiselect-optgroup-label      a',"mouseover",function(){

alert('aaaaaaaaaaa');

})

.deleget("label','mouseover',function(){

alert('bbbbbbbbbbbbb');

})

.delegate('input[type="checkbox"], input[type="radio"]', 'click.multiselect', function(e) {

        var $this = $(this);
        var val = this.value;
        var checked = this.checked;
        var tags = self.element.find('option');
        // bail if this input is disabled or the event is cancelled
        if(this.disabled || self._trigger('click', e, { value: val, text: this.title, checked: checked }) === false) {
          e.preventDefault();
          return;
        }

first() last():第一个,最后一个

menu.find('ul').first();

menu.find('ul').last();

children()   find()

children()返回

它返回由选择器返回的一个或者多个元素的直接子元素。

如果我们想要将一张表中所欲包含单词”dog“的<td>变成橙色,可以用下面语句:

$("#table  tr").children("td:contains(dog)").css('background',"orange");

find()

他的作用与childern()非常类似,只是它会查找子元素或者更远的子孙元素。他通常比children()更安全

比如:我们需要隐藏所有包含hideme类的<tr>

但这些开发人员会在表格中省略<tbody>,因此我们需要包含所有可能的情况

$("#table  tbody tr .hideme").hide();

如果没有<tbody>将会失败,我们可以使用find

$("#table").find("tr .hideme").hide();

not()  is()  :not()

not():返回选择器不匹配的元素:将所有不包括someclass类的段落变成橙色

$("p").not(".someclass").css("colore","orange");

is()     :是一个测试函数,只会返回一个布尔值:

$("myform").submit(function(){
if($(this).find('input').is('.required[value=]')){//表单中input class类而且值为空,is是链式结构的一部分
alert("有需要必填的内容没有填写");
return false;
}
});

:not()  :是not()的伪选择器等价方法。作用相同,只有一点区别

$('p :not(.someclass)').css("color","orange");

each()   filter()//迭代访问由选择器返回的每个元素并对其进行操作
each():有两种用法:
用法1:将回调函数作为唯一的参数传递
$('p').each(function(){
alert($(this).text());
});
用法2:用来处理数组和类似数组的对象

var  myarray = ['one','two'];

有两种写法:

第一种:$.each(myarray,function(key,val){

});
第二种:$(myarray).each(function(key,val){
});

filter();//不能用于数组和对象

区别的牛逼之处在于:他可以加过滤条件,而不是把所有的对象都进行遍历,不满足条件的跳过不处理

和each()一样,可以访问链表中每个元素,但如果没通过某个测试,就会从链表中移除该元素
用法:传递给它一个选择器字符串,

$('p  .someclass'),css("color","orange");

$('p').filter('.someclass').css('color','orange');

$("p").filter(function(){

return$(this).text().indexOf("hello")!=-1//这里return了true才能执行下面的语句语句,否则什么都不做

}).css('color','orange');

文档中找到每个《P>,如果包含”hello“字符串,就将他变成橙色。否则不处理。
$("p :contains('hello')").css('color',"orange");
对于简单条件,这没问题,但是filter()更多是用来更复杂或者冗长的测试,然后确定一个元素是否可保留在链中。

===================================================================================================

说说闭包:

下面通过一个简单例子来说明:

<html>

<head>

<title>闭包的本质</title>

</head>

<body>

<script>

//a是一个普通的函数:

function A(a){

         return a;

}

//B是一个带函数返回值的函数

function B(b){

      return funciton(){

               return b;

       }

}

var x = A(10);//因为A除了返回a什么也没做,执行A()函数后,调用堆栈被销毁,没有产生闭包

var y = B(20);//因为B返回一个匿名函数引用,它访问到B()被调用时产生的环境,因此这里产生了一个闭包结构(closure或者function instance),在它的环境中,b=20,因此y()返回的结果是20

var z = B(30);//同样,这里产生了第二个“闭包结构”在它的环境中,b=30,因此z()返回结果是30

alert(x);//得到10;

alert(y());//得到20;

alert(z());//得到30;

</script>

</body>

</html>

推荐一个写的通俗易懂的文章:

js中判断是否包含某个字符串用indexOf()函数

var souce = "this is the target";

var target = "target";

var index = source.indexOf(target)

if(index===“-1”){

alert(‘说明不包含这个字符串’);

}

jquery绑定多个事件:用大括号括起来,这个和等价写法一样,其实都是用{}包裹起来多个

$("#xxx").bind({

click:function(){},

keypress:function(e){},//有关键盘

mouseover:function(){},

mouseenter:function(){},

mouseleave:function(){},

focus:function(){},

blur:funciton(){},

});

有关键盘

 button.bind({

        click: clickHandler,
        keypress: function(
e) {
          switch(
e.which) {
            case 27: // esc
              case 38: // up
              case 37: // left
              self.close();
            break;
            case 39: // right
              case 40: // down
              self.open();
            break;
          }
        },

keyup:function(event){

var  code = event.keyCode();

if(vent.keyCode>=48&&event.keyCode<=57){

}

}

});

下面主要想让大家看看windows的event事件

点击非显示区域隐藏:

document.onclick = function(e){

//下面两个都是为了区分是ie还是ff

e= e||windows.event; //e对象存在时回返e,当window.event存在时返回event,这样就区分ff,ie了

var obj = e.srcElement?e.srcElement:e.target;//这是一种规范,ie下支持e.srcElement,ff支持e.target

if(!e||!(showdiv.contains(obj)||obj==input||obj==a)){

showdiv.style.display = "none";

}

}

今天遇到一个问题setInterval(函数,时间)

由于setInterval函数里面的函数,有个参数,所以,如果

直接写setInterval(update(basePath),500);会报错

必须这样写:setInterval(function(){update(basePath);},500);用一个function(){}函数,把要调用的函数包裹起来

  

转载地址:https://blog.csdn.net/lixld/article/details/32704889 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:自己实现mvc+自己实现标注的写法(更新)
下一篇:facebook的thriff 基于rpc的远程调用实现

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月21日 07时40分03秒