【javascript常见面试题】常见前端面试题及答案 (19)

虽然我把绑定事件重新写了一次,代码多了点,但这种方式的效率明显高于live()方式,特别是在频繁的DOM操作中,这点非常明显。

80.请解释.end()的用途。

在官方的API上是这样描述end()方法的:“回到最近的一个”破坏性”操作之前。即,将匹配的元素列表变为前一次的状态。”;看样子好像是找到最后一次操作的元素的上一元素,在如下的例子中:html代码:

复制代码代码如下:

<div>测试内容1</div><div>测试内容2</div>

jQuery代码:

复制代码代码如下:

$(\'<p>新增内容</p>\').appendTo(\'div\').addClass(\'c1\').end().addClass(\'c2\');

复制代码代码如下:

<div>测试内容1

    <p class="c1 c2">新增内容</p>

</div>

<div>测试内容2

    <p class="c1">新增内容</p>

</div>

这里我就有一点不太明白了,怎么只有第一个

标签有两个样式,end()方法后返回的是什么,在火狐里添加了监控,得到如下结果1.$(‘新增内容‘).appendTo(‘div’)返回的是:[p,p]对象数组,即新增后的两个p标签;

2.$(‘新增内容‘).appendTo(‘div’).addClass(‘c1’)返回的是:[p.c1,p.c1]对象数组,即添加了c1类样式后的p对象数组;

3.$(‘新增内容‘).appendTo(‘div’).addClass(‘c1’).end()返回的是[p.c1],是第1个中的,在2操作中,最后“破坏”的是第2个中的,所以他的前一次操作的对象是第1个中的,返回的就是它;

4.$(‘新增内容‘).appendTo(‘div’).addClass(‘c1’).end().addClass(‘c2’)返回的仍然是第1个中的;现在算是有点明白了,关键是要搞清楚最后一次操作的元素的上一元素是什么。

81.你如何给一个事件处理函数命名空间,为什么要这样做?

任何作为type参数的字符串都是合法的;如果一个字符串不是原生的JavaScript事件名,那么这个事件处理函数会绑定到一个自定义事件上。这些自定义事件绝对不会由浏览器触发,但可以通过使用.trigger()或者.triggerHandler()在其他代码中手动触发。如果type参数的字符串中包含一个点(.)字符,那么这个事件就看做是有命名空间的了。这个点字符就用来分隔事件和他的命名空间。举例来说,如果执行.bind(‘click.name’,handler),那么字符串中的click是事件类型,而字符串name就是命名空间。命名空间允许我们取消绑定或者触发一些特定类型的事件,而不用触发别的事件。参考unbind()来获取更多信息。

jQuery的bind/unbind方法应该说使用很简单,而且大多数时候可能并不会用到,取而代之的是直接用click/keydown之类的事件名风格的方法来做事件绑定操作。

但假设如下情况:需要在运行时根据用户交互的结果进行不同click事件处理逻辑的绑定,因而理论上会无数次对某一个事件进行bind/unbind操作。但又希望unbind的时候只把自己绑上去的处理逻辑给释放掉而不是所有其他地方有可能的额外的同一事件绑定逻辑。这时候如果直接用.click()/.bind(‘click’)加上.unbind(‘click’)来进行重复绑定的话,被unbind掉的将是所有绑定在元素上的click处理逻辑,潜在会影响到该元素其他第三方的行为。

当然如果在bind的时候是显示定义了function变量的话,可以在unbind的时候提供function作为第二个参数来指定只unbind其中一个处理逻辑,但实际应用中很可能会碰到各种进行匿名函数绑定的情况。对于这种问题,jQuery的解决方案是使用事件绑定的命名空间。即在事件名称后添加.something来区分自己这部分行为逻辑范围。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgddxp.html