返回jQuery内......登陆

jQuery内存泄露解决办法

巴扎黑2016-12-26 14:00:18333

本文大家分享了jQuery内存泄露解决办法,供大家参考,具体内容如下

思路:为JQuery扩展删除jquery元素对象的方法,大大减轻内存泄露的压力

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

(function($){

 if(!$.lui.widget) $.lui.widget = {};

 //$.lui.newGuid()生成随机32位id

  

 //如果采用此方式多次生成jquery对象的话,html代码字符串会在内存中多次重复,占用额外的内容,也会有泄露。而$("<span></span>").attr('id',_id)写法无此问题。

  

 $.lui.widget.__clean$ = $("<span id='" + $.lui.newGuid()+ "'></span>");

 /**

 * 释放jquery对象,无返回值。此方法用以解决jquery的内存泄露问题

 */

 $.fn.del = function( SELECTor, keepData ) {

 if ( !SELECTor || $.filter( SELECTor, [ this ] ).length ) {

  // 释放dom对象

  var item = $(this);

  var clearItem = $.lui.widget.__clean$;

  item.appendTo(clearItem);

  $('*',clearItem).each(function(i, e) {

  (events = $.data(this'events')) && $.each(events, function(i, e1) {

   $(e).unbind(i + '.*');

  });

  $.event.remove(this);

  $.removeData(this);

  });

  clearItem[0].innerHTML = '';

  item = null;

 }

 };

  

 /**

 * 计算字符串在某元素上不折行时的长度

 * @param {jQuery} $Element jquery元素

 * @param {String} str 字符串

 * @returns  {Number}  字符串长度(px)

 */

 $.lui.widget.clacStrLength = function($Element,str){

   var _id = $.lui.newGuid();

   var $tmpSpan = $("<span></span>").attr('id',_id).css({

    'position':'absolute',

    'top':'-1000px'

   }).appendTo('body');

   var _width = $tmpSpan.css({

    'font-family':$Element.css('font-family'),

    'font-size':$Element.css('font-size'),

    'letter-spacing':$Element.css('letter-spacing'),

    'word-spacing':$Element.css('word-spacing'),

    'text-indent':$Element.css('text-indent')

   }).text(str).innerWidth();

   $tmpSpan.del();

   $tmpSpan = null;

   return _width;

 };

  

 /**

 * 在某元素上按像素截取字符串 (采用浏览器默认处理空白方式,不适用于复杂场景,仅用于不换行情况下按像素截取字符串)

 * @param $Element jquery元素(该元素的字体设置必须已经确定)

 * @param str 字符串

 * @param limit  像素值

 * @returns 按像素截取后的字符串

 */

 $.lui.widget.substrByPx = function($Element,str,limit){

 if($Element === undefined || !$Element instanceof $) return '';

 if(str === undefined || typeof str != 'string'return '';

 if(limit === undefined) return str;

 if(!str || limit <=0 ) return '';

 var _str = new String(str);

  

 var _id = $.lui.newGuid();

 var $tmpSpan = $("<span></span>").attr('id',_id).css({

  'position':'absolute',

  'top':'-1000px'

 }).appendTo('body');

 var _width = $tmpSpan.css({

  'font-family':$Element.css('font-family'),

  'font-size':$Element.css('font-size'),

  'letter-spacing':$Element.css('letter-spacing'),

  'word-spacing':$Element.css('word-spacing'),

  'text-indent':$Element.css('text-indent')

 }).text(str).innerWidth();

 while( _width >limit){

  _str = _str.substring(0, _str.length-1);

  _width = $tmp.text(_str).innerWidth();

 }

 $tmpSpan.del();

 $tmpSpan = null;

 return _str;

 };

})(jQuery);

  更多关于jQuery内存泄露解决办法请关注PHP中文网(www.php.cn)其它文章!  


最新手记推荐

• 用composer安装thinkphp框架的步骤• 省市区接口说明• 用thinkphp,后台新增栏目• 管理员添加编辑删除• 管理员添加编辑删除

全部回复(0)我要回复

暂无评论~
  • 取消回复发送