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"> ...
随机推荐
- 关于KMP算法的感想
今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本 ...
- Mybatis中的关联映射和查询
一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...
- javax.servlet.ServletException: Could not resolve view with name‘ XXXX’in servlet with name 'spring'的解决方案-----SKY
出现的异常如下: javax.servlet.ServletException: Could not resolve view with name '{"msg":"成功 ...
- 关于Future
1 为什么需要Callable和Future Runnable没有返回值,也不抛异常,这样主线程不能知道子线程的执行结果. 为了解决这个问题就有了Callable和Future.Callable提供的 ...
- Linux环境安装Nginx详细步骤
1.yum解决编译nginx所需的依赖包,之后你的nginx就不会报错了yum install gcc patch libffi-devel python-devel zlib-devel bzip ...
- 我的Android进阶之旅------>如何将Activity变为半透明的对话框?
我的Android进阶之旅------>如何将Activity变为半透明的对话框?可以从两个方面来考虑:对话框和半透明. 在定义Activity时指定Theme.Dialog主题就可以将Acti ...
- Android系统移植与调试之------->如何修改Android自带的apk出现一圈圈类似鸡蛋的花纹
最近被一个问题烦恼到了,就是android4.1系统自带的Email.文件管理器.信息等apk都出现同一个问题,就是现实在平板上的时候会出现一圈圈类似鸡蛋的花纹. 我想了两种方法来解决,第一种方法没有 ...
- Virtualbox报错------> '/etc/init.d/vboxdrv setup'
Ubuntu下VirtualBox本来可以很好地用的,今天早上一来就报错了,--提示如下内容: ---------------------------------------------------- ...
- sublime 添加 颜色插件 colorcoder
高亮所有变量,因此可以极大的简化代码定位.尤其是对那些有阅读障碍的程序员非常有帮助.
- 高性能javascript学习总结(2)--DOM编程
我们知道,对DOM的操作都是非常的耗性能的,那么为什么会耗性能呢? 文档对象模型(DOM)是一个独立于语言的,使用 XML和 HTML 文档操作的应用程序接口(API).在浏览器中,主要与 ...