学习笔记:调用js文件冲突问题解决方案
之前自己动手做了一个小网站,在实现过程中遇到了一个关于js文件调用冲突的问题。
具体问题描述如下:在index.html文件中引用了两个js文件,单独添加banner.js或者focus_pic.js都可以运行并且实现相应的功能,但是两个同时添加两个文件后,后banner.js失效了。经过一番研究翻阅了一些资料,并在网上求助于各路大神,终于将问题的原因搞明白了。
banner.js代码如下所示:
var t = n = 0, count;
$(document).ready(function(){
count=$("#banner_list a").length;
$("#banner_list a:not(:first-child)").hide();
$("#banner_info").html($("#banner_list a:first-child").find("img").attr('alt'));
$("#banner_info").click(function(){window.open($("#banner_list a:first-child").attr('href'), "_blank")});
$("#banner li").click(function() {
var i = $(this).text() - 1;//获取Li元素内的值,即1,2,3,4
n = i;
if (i >= count) return;
$("#banner_info").html($("#banner_list a").eq(i).find("img").attr('alt'));
$("#banner_info").unbind().click(function(){window.open($("#banner_list a").eq(i).attr('href'), "_blank")})
$("#banner_list a").filter(":visible").fadeOut(500).parent().children().eq(i).fadeIn(1000);
$(this).css({"background":"#be2424",'color':'#000'}).siblings().css({"background":"#6f4f67",'color':'#fff'});
});
t = setInterval("showAuto()", 4000);
$("#banner").hover(function(){clearInterval(t)}, function(){t = setInterval("showAuto()", 4000);});
})
function showAuto()
{
n = n >=(count - 1) ? 0 : ++n;
$("#banner li").eq(n).trigger('click');
}
focus_pic.js代码如下所示:
var foucsbox = function (time) {
var time = time || 3500
, bigimgs = big.getElementsByTagName('li')
, samllimgs = samll.getElementsByTagName('li')
, imglink = tip.getElementsByTagName('a')[0]
, slide = function (z) {
samllimgs[lastIndex].className = '';
samllimgs[z].className = 'current';
bigimgs[lastIndex].style.display = 'none';
bigimgs[z].style.display = 'block';
try {
imglink.innerHTML = samllimgs[z].getElementsByTagName('img')[0].alt;
}
catch (e) {
imglink.innerText = samllimgs[z].firstChild.firstChild.alt;
}
lastIndex = i = z;
}
, helper = function (z) {
return function (e) {
var na;
if (!e) {
e = window.event;
na = e.srcElement.nodeName;
}
else {
na = e.target.nodeName;
}
if (na === 'IMG') {
slide(z);
}
}
}
, lastIndex = i = 0, x, y = bigimgs.length
, getPrevI = function (q) { return i - q < 0 ? y - q : i - 1; }
, getNextI = function (q) { return i + q >= y ? i + q - y : i + 1; }
try {
imglink.innerText = samllimgs[0].getElementsByTagName('img')[0].alt;
}
catch (e) {
imglink.innerText = samllimgs[0].firstChild.firstChild.alt;
}
for (x = 1; x < y; x += 1) {
bigimgs[x].style.display = 'none';
}
for (x = 0; x < y; x += 1) {
samllimgs[x].onmouseover = helper(x);
}
topCon.children[2].onclick = function (e) {
i = lastIndex;
var t;
if (!e) {
e = window.event;
t = e.srcElement;
} else {
t = e.target;
}
switch (t.className) {
case 'icon_prev':
slide(getPrevI(1));
break;
case 'icon_next':
slide(getNextI(1));
break;
}
};
topCon.onmouseover = function () {
clearInterval(s);
};
topCon.onmouseout = function () {
s = setInterval(function () {
slide(i);
i = getNextI(1);
}, time);
};
};
var $ = function (id) { return document.getElementById(id); }
, topCon = $('flower1')
, big = $('focus_pic1')
, samll = $('focus_list1')
, tip = $('focus_title1')
foucsbox(2500);
var topCon = $('flower2')
, big = $('focus_pic2')
, samll = $('focus_list2')
, tip = $('focus_title2')
foucsbox(2500);
var topCon = $('flower3')
, big = $('focus_pic3')
, samll = $('focus_list3')
, tip = $('focus_title3')
foucsbox(2500);
var topCon = $('flower4')
, big = $('focus_pic4')
, samll = $('focus_list4')
, tip = $('focus_title4')
foucsbox(2500);
问题的原因在于var $ = function (id) { return document.getElementById(id); }
就是这段覆盖了jquery的工厂函数,解决办法有2个,
解决方法1:把这个块换个名字
var foucsbox = function (time) {
var time = time || 3500
, bigimgs = big.getElementsByTagName('li')
, samllimgs = samll.getElementsByTagName('li')
, imglink = tip.getElementsByTagName('a')[0]
, slide = function (z) {
samllimgs[lastIndex].className = '';
samllimgs[z].className = 'current';
bigimgs[lastIndex].style.display = 'none';
bigimgs[z].style.display = 'block';
try {
imglink.innerHTML = samllimgs[z].getElementsByTagName('img')[0].alt;
}
catch (e) {
imglink.innerText = samllimgs[z].firstChild.firstChild.alt;
}
lastIndex = i = z;
}
, helper = function (z) {
return function (e) {
var na;
if (!e) {
e = window.event;
na = e.srcElement.nodeName;
}
else {
na = e.target.nodeName;
}
if (na === 'IMG') {
slide(z);
}
}
}
, lastIndex = i = 0, x, y = bigimgs.length
, getPrevI = function (q) { return i - q < 0 ? y - q : i - 1; }
, getNextI = function (q) { return i + q >= y ? i + q - y : i + 1; }
try {
imglink.innerText = samllimgs[0].getElementsByTagName('img')[0].alt;
}
catch (e) {
imglink.innerText = samllimgs[0].firstChild.firstChild.alt;
}
for (x = 1; x < y; x += 1) {
bigimgs[x].style.display = 'none';
}
for (x = 0; x < y; x += 1) {
samllimgs[x].onmouseover = helper(x);
}
topCon.children[2].onclick = function (e) {
i = lastIndex;
var t;
if (!e) {
e = window.event;
t = e.srcElement;
} else {
t = e.target;
}
switch (t.className) {
case 'icon_prev':
slide(getPrevI(1));
break;
case 'icon_next':
slide(getNextI(1));
break;
}
};
topCon.onmouseover = function () {
clearInterval(s);
};
topCon.onmouseout = function () {
s = setInterval(function () {
slide(i);
i = getNextI(1);
}, time);
};
};
var byId = function (id) { return document.getElementById(id); }
, topCon = byId('flower1')
, big = byId('focus_pic1')
, samll = byId('focus_list1')
, tip = byId('focus_title1')
foucsbox(2500);
var topCon = byId('flower2')
, big = byId('focus_pic2')
, samll = byId('focus_list2')
, tip = byId('focus_title2')
foucsbox(2500);
var topCon = byId('flower3')
, big = byId('focus_pic3')
, samll = byId('focus_list3')
, tip = byId('focus_title3')
foucsbox(2500);
var topCon = byId('flower4')
, big = byId('focus_pic4')
, samll = byId('focus_list4')
, tip = byId('focus_title4')
foucsbox(2500);
解决方法2:由于js的变量作用域或作用范围是按函数来划分界限的,所以放在一个函数里边,把他执行一下。一般通俗的叫:立即执行函数。这样,这个内部$不会穿透,或影响到外边去。这是一种偷懒或省力的解决办法。但是这个方法的缺点是:要求的技术储备比较高,里边也有少量的坑。比如,即不让$穿透,还需要把里边的方法暴露给外边。这时候需要借助window,把方法绑定在window上面去。比如:window.method = method.
(function(window){
var $ = function(id) {
return document.getElementById(id);
},
topCon = $('flower1'),
big = $('focus_pic1'),
samll = $('focus_list1'),
tip = $('focus_title1');
foucsbox(2500);
var topCon = $('flower2'),
big = $('focus_pic2'),
samll = $('focus_list2'),
tip = $('focus_title2');
foucsbox(2500);
var topCon = $('flower3'),
big = $('focus_pic3'),
samll = $('focus_list3'),
tip = $('focus_title3');
foucsbox(2500);
var topCon = $('flower4'),
big = $('focus_pic4'),
samll = $('focus_list4'),
tip = $('focus_title4');
foucsbox(2500);
}(window))
以上方法就可以成功解决问题啦!感谢大神的指点,受益匪浅!前端的路,才刚刚开始,希望以后可以更多的发现问题,解决问题,分享经验!
学习笔记:调用js文件冲突问题解决方案的更多相关文章
- php中并发读写文件冲突的解决方案(文件锁应用示例)
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- 在winform中调用js文件并输出结果
在winform中调用js文件并输出结果默认分类 2007-10-19 16:35:06 阅读25 评论0 字号:大中小 由于项目需要在winform中调一个强大的js,所以把这个tip记录在此: 1 ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- [转]html页面调用js文件里的函数报错onclick is not defined处理方法
原文地址:http://blog.csdn.net/ywl570717586/article/details/53130863 今天处理html标签里的onclick功能的时候总是报错:Uncaugh ...
- iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)
iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...
- Python 调用JS文件中的函数
Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...
随机推荐
- JVM内存简单理解
1.首先简单说一下CPU与内存之间的关系 CPU运转速度快,磁盘的读写速度远远不及CPU运转速度,所以设计了内存来缓冲CPU等待磁盘读写:随着CPU的发展,内存读写也远远跟不上CPU的读写速度,CPU ...
- Java字节流与字符流基本操作
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...
- ubuntu亮度调节失效
ctrl+alt+T 打开终端 输入下面的指令 sudo touch /usr/share/X11/xorg.conf.d/20-intel.conf 2 再输入下面的指令: sudo gedit / ...
- 《CSS3实战》读书笔记 第4章:样式继承
节省你的时间--样式继承 ### 什么是继承? 后代元素可以继承先代元素的一些属性.有了它,可以省去分别定义样式的时间.继承了方向是由外而内的. ### 继承的局限性 应该注意到,有些属性是不适宜继承 ...
- cmd 导出目录树
cmd: tree /f >tree.txt
- JavaScript中变量和函数声明的提升
现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...
- Linux下显示ip所属位置
在linux下,要是网络出现延迟,通常我们需要分析自己到对端的服务器的网络环境 例:ping www.baidu.com traceroute www.baidu.com 通过分析来确定大概是什么问题 ...
- sql语句积累
有一个需求表(demand),每一记录就是一条需求:另外有一个报价表(quotation),每一条记录是对需求记录的报价详情. 需求表: 报价表: 我现在想得到每条需求的信息以及有多少人报价了,我们可 ...
- web.config中customErrors与httpErrors的区别
打开IIS,我们发现会有两个处理错误页的地方,见下图: 进行不同的设置之后,我们发现设定结果会反应在web.config: .NET Error Pages设定被写入system.web/custom ...
- 使用BeanNameAutoProxyCreator实现spring的自动代理
提到代理,我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置 ...