scrollspy.js--bug

/**
* 20140505 14.33 ycx
*
scrollspy.js中存在的bug!!!---为什么ui.tabs必须在scrollspy.js中的window.onload之前执行,也就是必须在scrollspy初始化之前执行
*
1
scrollspy中的process函数中的scrollTop数值在tabs组件之后的都存在计算错误,是因为scrollspy初始化后,已经计算好整个页面的scrollTop等数组(offsets),而这时候ui.tabs进行初始化,
*
就会把tab页的其他暂时不显示出来的内容都隐藏起来,就会导致整个页面的scrollTop等方面的数值改变了,所以在tab之后的组件都会在scrollspy中存在偏差!!
*
针对这种情况,临时的解决方法是:
* 方法一:
将ui.tabs()在scrollspy初始化之前执行--如将ui.tabs()放到document.ready回调函数中执行(因为scrollspy是在window.onload回调函数执行的)

* 方法二: 将scrollspy初始化的函数拿出来,在ui.tabs()执行之后再开始初始化。
*

* 2 也就是说,如果其他组件或者js脚本会改变页面的scrollTop等方面的内容,那么估计都要采用上述两种方法来解决。
*/

1 ui.js---是我自己写的组件库

2 scrollspy.js可在bootstrap官网下载单独的源文件

scrollspy.js代码,具体如下所示:


  1 /* ========================================================================
2 * Bootstrap: scrollspy.js v3.0.3
3 * http://getbootstrap.com/javascript/#scrollspy
4 * ========================================================================
5 * Copyright 2013 Twitter, Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ======================================================================== */
19 + function($) {"use strict";
20
21 // SCROLLSPY CLASS DEFINITION
22 // ==========================
23
24 function ScrollSpy(element, options) {
25 var href
26 var process = $.proxy(this.process, this)
27
28 this.$element = $(element).is(‘body‘) ? $(window) : $(element)
29 this.$body = $(‘body‘)
30 this.$scrollElement = this.$element.on(‘scroll.bs.scroll-spy.data-api‘, process)
31 //console.log(this.$scrollElement);
32 this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
33 this.selector = (this.options.target || (( href = $(element).attr(‘href‘)) && href.replace(/.*(?=#[^\s]+$)/, ‘‘))//strip for ie7
34 || ‘‘) + ‘ .nav li > a‘
35 //console.log(this.selector);
36 this.offsets = $([])
37 this.targets = $([])
38 this.activeTarget = null
39
40 this.refresh()
41 this.process()
42 }
43
44
45 ScrollSpy.DEFAULTS = {
46 offset : 10
47 }
48
49 ScrollSpy.prototype.refresh = function() {
50 var offsetMethod = this.$element[0] == window ? ‘offset‘ : ‘position‘
51 //console.log(offsetMethod,11);
52
53 this.offsets = $([])
54 this.targets = $([])
55
56 var self = this
57 var $targets = this.$body.find(this.selector).map(function() {
58 var $el = $(this)
59 var href = $el.data(‘target‘) || $el.attr(‘href‘)
60 var $href = /^#\w/.test(href) && $(href)
61 //console.log($el,"--",href,"--",$href);
62 console.log($href[offsetMethod]().top, "-------", $href[0].offsetTop, $href[0].id);
63 //console.log($href,$href["offset"]().top,"-----------");
64
65 return ($href && $href.length && [[$href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href]]) || null
66 }).sort(function(a, b) {
67 return a[0] - b[0]
68 }).each(function() {
69 //console.log(this);
70 self.offsets.push(this[0])
71 self.targets.push(this[1])
72 })
73 }
74
75 ScrollSpy.prototype.process = function() {
76 //这里存在问题--scrollTop
77 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
78 console.log("scrollTop--->>>" + scrollTop);
79 var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
80 var maxScroll = scrollHeight - this.$scrollElement.height()
81 var offsets = this.offsets
82 //console.log(offsets);
83 var targets = this.targets
84 var activeTarget = this.activeTarget
85 var i
86
87 if (scrollTop >= maxScroll) {
88 return activeTarget != ( i = targets.last()[0]) && this.activate(i)
89 }
90
91 //console.log(scrollTop,offsets,)
92
93 for ( i = offsets.length; i--; ) {
94 //activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i])
95
96 //activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i+1])
97 activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i])
98 }
99 }
100
101 ScrollSpy.prototype.activate = function(target) {
102 console.log("target===>>>", target);
103 this.activeTarget = target;
104
105 $(this.selector).parents(‘.active‘).removeClass(‘active‘)
106
107 var selector = this.selector + ‘[data-target="‘ + target + ‘"],‘ + this.selector + ‘[href="‘ + target + ‘"]‘
108
109 var active = $(selector).parents(‘li‘).addClass(‘active‘)
110
111 if (active.parent(‘.dropdown-menu‘).length) {
112 active = active.closest(‘li.dropdown‘).addClass(‘active‘)
113 }
114
115 active.trigger(‘activate.bs.scrollspy‘)
116 }
117 // SCROLLSPY PLUGIN DEFINITION
118 // ===========================
119
120 var old = $.fn.scrollspy;
121
122 $.fn.scrollspy = function(option) {
123 return this.each(function() {
124 var $this = $(this)
125 var data = $this.data(‘bs.scrollspy‘)
126 var options = typeof option == ‘object‘ && option
127
128 if (!data)
129 $this.data(‘bs.scrollspy‘, ( data = new ScrollSpy(this, options)))
130 if ( typeof option == ‘string‘)
131 data[option]()
132 })
133 }
134
135 $.fn.scrollspy.Constructor = ScrollSpy;
136
137 // SCROLLSPY NO CONFLICT
138 // =====================
139
140 $.fn.scrollspy.noConflict = function() {
141 $.fn.scrollspy = old;
142 return this;
143 }
144 // SCROLLSPY DATA-API
145 // ==================
146
147 $(window).on(‘load‘, function() {
148 $(‘[data-spy="scroll"]‘).each(function() {
149 var $spy = $(this);
150 $spy.scrollspy($spy.data());
151 })
152 })
153 }(jQuery);

时间: 2024-11-05 22:54:25

scrollspy.js--bug的相关文章

js bug自动预警

这两天在看关于AMD中getCurrentScript函数时,突然想到,既然可以检测出当前出错的js文件,那么是不是可以做一个自动js bug预警的功能.以后只要有js错误出现,就会自动将错误上传到服务器. 先看司徒正美大大书中写的一段关于检测js文件地址的函数,相关博客地址点这: function getCurrentScript(base) { // 参考 https://github.com/samyk/jiagra/blob/master/jiagra.js var stack; try

jquery.pjax.js bug问题解决集锦

jquery.pjax 是一个很好的局部刷新插件,但实际应用过程是还是会有很多小问题,部分问题解决如下: 1.pjax 局部加载时候,IE 存在缓存问题,很容易理解,pjax是通过jquery的ajax加载局部内容的,默认cache=true,这会导致ie下get数据从缓存中获取,解决办法是设置pjax options的cache=false,这样请求会自动变成如下方式: /XXXX?_pjax=%23pjax-container&_=1455092848927 2.pjax 与 jquery

swipe js bug

最近因为要写新的mobile site页面,有好几个页面上面必须用到photo slider. 使用插件: /* * Swipe 2.0 * * Brad Birdsall * Copyright 2013, MIT License **/ Github:https://github.com/thebird/Swipe 在使用的时候,发现只要是在两张照片的情况下,你会在chrome的F12调试中的Elements选项中发现swipe js使用js动态创建出来了4个div,这里是使用如下的代码:

记IOS8中碰到的一个JS bug

IOS8的JS版本过低导致 var id = "123"; var temp1 = {id, "left": "200"}; // error in IOS8 var temp2 = {"id":id, "left": "200"}; 平时还是多写ES5的代码,es6的语法总能碰到兼容的坑. 改了好几天...气死啦

bootstrap js插件

导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScript插件可以单独导入到页面中,也可以一次性导入到页面中.因为在Bootstrap中的JavaScript插件都是依赖于jQuery库,所以不论是单独导入还一次性导入之前必须先导入jQuery库. 一次性导入: Bootstrap提供了一个单一的文件,这个文件包含了Bootstrap的所有JavaSc

bootstrap源码分析之scrollspy(滚动侦听)

源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2.导航必须是 .nav > li > a 结构,并且a上href或data-target要绑定hashkey3.菜单上必须有.nav样式4.滚动区域的data-target与导航父级Id(一定是父级)要一致 <div id="selector" class="navbar navbar-default"> &l

Gruntfile.js模板

module.exports = function(grunt) { // 配置项 var AppConfig = { name: 'app', //源文件目录 src: 'app/src', //生产文件目录 dist: 'app/assets' }; //加载所有的任务 require('load-grunt-tasks')(grunt); //显示每一个任务所花的时间和百分比 require('time-grunt')(grunt); grunt.initConfig({ config:

玩转Bootstrap(JS插件篇)

模态弹出框 一次性导入: Bootstrap提供了一个单一的文件,这个文件包含了Bootstrap的所有JavaScript插件,即bootstrap.js(压缩版本:bootstrap.min.js). 具体使用如下(或见右侧代码编辑器28-29行): <!-导入jQuery版本库,因为Bootstrap的JavaScript插件依赖于jQuery --> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js&qu

Bootstrap

第一章:认识Bootstrap Bootstrap的特点:灵活.优雅.可扩展. Bootstrap的定义:简单灵活的用于搭建Web页面的HTML.CSS.JavaScript工具集. Bootstrap中的JS插件依赖于jQuery,因此jQuery要在Bootstrap之前引用. Bootstrap不支持IE8. 第二章:排版 一.全局样式: Bootstrap不再一味的清零,而是注重重置可能产生的样式,保留和坚持部分浏览器的基础样式. 二.标题: Bootstrap定义标题也使用<h1>到