JQuery让前端飞早读

jQuery 模式中篇 前端早读课第35期

2017-09-15  本文已影响62人  知行社

There are only two hard things in Computer Science: cache invalidation and naming things.-- Phil Karlton

选择器优化

1, 指定性强的选择器写右边,指定性弱的在写左边。
jQuery 解析选择器是从右向左解析的。对于选择器 div a,jQuery 会先去找所有的 a 标签,然后找 a 标签的祖先元素中有 div 标签的元素。

指定性强的选择器写在右边相比放在左边,能减少查询元素的数量,性能更好。

$('div.data .brad')

应该优化成

$('.data td.brad')

2,用更精确的选择器
能用 id 选择器的就用 id 选择器。用 id 选择器找元素比 类选择器快。

$('#container div.robotarm');

可以优化成

 $('#container').find('div.robotarm')

3,通配符的优化
用通配符的查询性能相对比较差。

$('.buttons > *')
$('.gender *:radio')

可以优化为

$('.buttons').children()
$('.gender input:radio')

4,不要过分的指定选择器
过分指定优化器,增加不必要的查询次数,降低性能。

$('.data table.attendees td.brad')

可以优化为

$('.data td.brad')

用 jQuery 实现发布订阅框架的几种方法

发布/订阅框架用来做对象间做的消息交互,可以降级代码的耦合度。

方法1: 用 onoff
在 jQuery 中,可以用 on 监听自定义事件。用 off 来取消监听自定义事件。用 trigger 来触发自定义事件。实现如下

/* jQuery Tiny Pub/Sub - v0.7 - 10/27/2011
 * http://benalman.com/
 * Copyright (c) 2011 "Cowboy" Ben Alman; Licensed MIT, GPL */
(function($) {
  var o = $({});
  // 订阅事件
  $.subscribe = function() {
    o.on.apply(o, arguments);
  };
  // 取消订阅事件
  $.unsubscribe = function() {
    o.off.apply(o, arguments);
  };
  // 发布事件
  $.publish = function() {
    o.trigger.apply(o, arguments);
  };
}(jQuery));

用法

function handle(e, a, b, c) {
  // `e` is the event object, you probably don't care about it.
  console.log(a + b + c);
};
$.subscribe("/some/topic", handle);
$.publish("/some/topic", [ "a", "b", "c" ]);
// logs: abc
$.unsubscribe("/some/topic", handle); 

方法2:用 Callbacks
调用 jQuery.Callbacks() 返回的对象有方法 add, remove 和 fire,对应添加,删除,触发回调函数的功能。实现代码如下

var topics = {};
jQuery.Topic = function( id ) {
    var callbacks,
        topic = id && topics[ id ];
    if ( !topic ) {
        callbacks = jQuery.Callbacks();
        topic = {
            publish: callbacks.fire,
            subscribe: callbacks.add,
            unsubscribe: callbacks.remove
        };
        if ( id ) {
            topics[ id ] = topic;
        }
    }
    return topic;
}

用法

function fn1( value ){
  console.log( value );
}
function fn2( value ){
  fn1("fn2 says:" + value);
  return false;
}
// Usage:
// Subscribers
$.Topic( 'mailArrived' ).subscribe( fn1 );
$.Topic( 'mailArrived' ).subscribe( fn2 );
$.Topic( 'mailSent' ).subscribe( fn1 );
// Publisher
$.Topic( 'mailArrived' ).publish( 'hello world!' );
$.Topic( 'mailSent' ).publish( 'woo! mail!' );

方法3: 用 jQuery UI 的 Observable
$.Observable(观察对象) 中的观察对象的内容发生改变时,会触发 change 事件。示例如下

var myData = [], 
    observer = $.observer(myData);
function dataChange( data ){
   console.log('New data arrived with ID ' + data[0].id + ' and value ' + data[0].title);   
}
$(observer).bind("change", function ( e ) { 
    dataChange( e.target.data );
});
$.observable( myData ).insert({
                id: myData.length + 1,
                title: 'test'
            });

该方法不算实现了发布订阅模式。

方法4: 用第三方插件
这种方式就不细讲了,对细节感兴趣的的可以点这里

所有 JavaScript 模式:http://shichuan.github.io/javascript-patterns/

往期前端早读课地址:http://www.jianshu.com/c/0fda3d387a6d

上一篇下一篇

猜你喜欢

热点阅读