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代码,具体如下所示:
/* ========================================================================
* Bootstrap: scrollspy.js v3.0.3
* http://getbootstrap.com/javascript/#scrollspy
* ========================================================================
* Copyright 2013 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================================== */
+ function($) {"use strict"; // SCROLLSPY CLASS DEFINITION
// ========================== function ScrollSpy(element, options) {
var href
var process = $.proxy(this.process, this) this.$element = $(element).is('body') ? $(window) : $(element)
this.$body = $('body')
this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
//console.log(this.$scrollElement);
this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
this.selector = (this.options.target || (( href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, ''))//strip for ie7
|| '') + ' .nav li > a'
//console.log(this.selector);
this.offsets = $([])
this.targets = $([])
this.activeTarget = null this.refresh()
this.process()
} ScrollSpy.DEFAULTS = {
offset : 10
} ScrollSpy.prototype.refresh = function() {
var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
//console.log(offsetMethod,11); this.offsets = $([])
this.targets = $([]) var self = this
var $targets = this.$body.find(this.selector).map(function() {
var $el = $(this)
var href = $el.data('target') || $el.attr('href')
var $href = /^#\w/.test(href) && $(href)
//console.log($el,"--",href,"--",$href);
console.log($href[offsetMethod]().top, "-------", $href[0].offsetTop, $href[0].id);
//console.log($href,$href["offset"]().top,"-----------"); return ($href && $href.length && [[$href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href]]) || null
}).sort(function(a, b) {
return a[0] - b[0]
}).each(function() {
//console.log(this);
self.offsets.push(this[0])
self.targets.push(this[1])
})
} ScrollSpy.prototype.process = function() {
//这里存在问题--scrollTop
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
console.log("scrollTop--->>>" + scrollTop);
var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
var maxScroll = scrollHeight - this.$scrollElement.height()
var offsets = this.offsets
//console.log(offsets);
var targets = this.targets
var activeTarget = this.activeTarget
var i if (scrollTop >= maxScroll) {
return activeTarget != ( i = targets.last()[0]) && this.activate(i)
} //console.log(scrollTop,offsets,) for ( i = offsets.length; i--; ) {
//activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i]) //activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i+1])
activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i])
}
} ScrollSpy.prototype.activate = function(target) {
console.log("target===>>>", target);
this.activeTarget = target; $(this.selector).parents('.active').removeClass('active') var selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]' var active = $(selector).parents('li').addClass('active') if (active.parent('.dropdown-menu').length) {
active = active.closest('li.dropdown').addClass('active')
} active.trigger('activate.bs.scrollspy')
}
// SCROLLSPY PLUGIN DEFINITION
// =========================== var old = $.fn.scrollspy; $.fn.scrollspy = function(option) {
return this.each(function() {
var $this = $(this)
var data = $this.data('bs.scrollspy')
var options = typeof option == 'object' && option if (!data)
$this.data('bs.scrollspy', ( data = new ScrollSpy(this, options)))
if ( typeof option == 'string')
data[option]()
})
} $.fn.scrollspy.Constructor = ScrollSpy; // SCROLLSPY NO CONFLICT
// ===================== $.fn.scrollspy.noConflict = function() {
$.fn.scrollspy = old;
return this;
}
// SCROLLSPY DATA-API
// ================== $(window).on('load', function() {
$('[data-spy="scroll"]').each(function() {
var $spy = $(this);
$spy.scrollspy($spy.data());
})
})
}(jQuery);
scrollspy.js--bug的更多相关文章
- jquery.pjax.js bug问题解决集锦
jquery.pjax 是一个很好的局部刷新插件,但实际应用过程是还是会有很多小问题,部分问题解决如下: 1.pjax 局部加载时候,IE 存在缓存问题,很容易理解,pjax是通过jquery的aja ...
- bootstrap插件学习-bootstrap.scrollspy.js
先看bootstrap.dropdown.js的结构 function ScrollSpy(){} //构造函数 ScrollSpy.prototype = {} //构造器的原型 $.fn.scro ...
- bootstrap源码之滚动监听组件scrollspy.js详解
其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮. 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项 ...
- JS BUG 传递数字过大,数据值会变化
如果要在js函数中传递大整型数值,一定要用字符串,否则会出现精度不准确 function testfun('2345234523452141234123412341234523452345123') ...
- swipe js bug
最近因为要写新的mobile site页面,有好几个页面上面必须用到photo slider. 使用插件: /* * Swipe 2.0 * * Brad Birdsall * Copyright 2 ...
- js bug
1 加载模块脚本失败:服务器以非JavaScript MIME类型“text/html”响应. 描述:ES6 import Class时路径出错,少一个 / ,添上即可
- bootstrap源码分析之scrollspy(滚动侦听)
源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2.导航必须是 .nav > li > a 结构,并且a ...
- bootstrap js插件
导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScri ...
- 《玩转Bootstrap(JS插件篇)》笔记
导入JavaScript插件 不论是单独导入还一次性导入之前必须先导入jQuery库. 一次性导入 <script src="js/bootstrap.min.js"> ...
随机推荐
- 7.FactoryBean 和BeanFactory去区别
FactoryBean源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apach ...
- csv文件的格式
csv, comma separated values csv是一种纯文本文件. csv文件由任意数目的记录构成,记录间以换行符分割,每条记录由字段构成,字段间以逗号作为分隔符. 如果字段中有逗号,那 ...
- debian dhcp配置
1 将/etc/network/interfaces中设置成dhcp auto eth0iface eth0 inet dhcp 2 重启网络服务 /etc/init.d/networking res ...
- 通过Safari获取iOS设备的UUID,远程发送更是便捷
1.获取UUID (1)在Safari上输入:http://fir.im/udid (2)点击安装描述文件,然后就可以获取到UUID了 2.fir.im提供一个非常好用的内侧平台 详情使用见:http ...
- Android笔记之使用ZXing扫描二维码
ZXing发布版下载地址:https://github.com/zxing/zxing/releases 为了能让官方Demo跑起来,先把ZXing核心部分core复制到自己的工程里 还要把andro ...
- Tensorflow官方文档中文版——第一章
第一示例: import tensorflow as tf import numpy as np x_data=np.float32(np.random.rand(,))#随机输入 y_data=np ...
- Executor中的类
Executor框架 其中ThreadPoolExecutor非常重要,通过这个类自定义线程池 public ThreadPoolExecutor(int corePoolSize, //线程池里面的 ...
- vue-router原理分析
本文整理总结自: https://zhuanlan.zhihu.com/p/27588422 单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面, 实现这一点主要是两种方式: 1.Hash: ...
- C语言伪随机数的注意事项
不要将srand(time(NULL))或srand(time(0))放到循环中,因为我们两次调用srand()函数设置随机数种子之间的时间间隔不超过1s,等价于使用了一个固定的随机数种子,会出现相同 ...
- Understanding Linux File Permissions
Although there are already a lot of good security features built into Linux-based systems, one very ...