之前自己动手做了一个小网站,在实现过程中遇到了一个关于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文件冲突问题解决方案的更多相关文章

  1. php中并发读写文件冲突的解决方案(文件锁应用示例)

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...

  2. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  3. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  4. matlab学习笔记5--低级文件输入输出函数

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  5. 在winform中调用js文件并输出结果

    在winform中调用js文件并输出结果默认分类 2007-10-19 16:35:06 阅读25 评论0 字号:大中小 由于项目需要在winform中调一个强大的js,所以把这个tip记录在此: 1 ...

  6. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  7. [转]html页面调用js文件里的函数报错onclick is not defined处理方法

    原文地址:http://blog.csdn.net/ywl570717586/article/details/53130863 今天处理html标签里的onclick功能的时候总是报错:Uncaugh ...

  8. iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (以后谁不会了,直接将连接给他)

    iOS 开发中,关于xxx.xcodeproj 文件冲突的解决方案 (一有冲突要手把手教一遍,太麻烦了,现在总结下,以后谁不会了,连接直接发他). 关于xxx.xcodeproj 文件冲突的话,是比较 ...

  9. Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

随机推荐

  1. PHP 数据库抽象层pdo

    PDO是PHP数据对象(PHP Data Object)的缩写. pdo就是一个"数据库访问抽象层",作用是统一各种数据库的访问接口,能够轻松地在不同数据库之间进行切换,使得数据库 ...

  2. 申请https证书需要注意的4大问题

    HTTPS证书是什么 https证书是数字证书中的一种,由受信任的数字证书颁发机构CA如[沃通CA]在验证服务器身份后颁发,具有服务器身份验证和数据传输加密 功能,因其要配置在服务器上,所以也称SSL ...

  3. matlab 中txt文件(含字符及数值)处理

    matlab 中txt文件(含字符及数值)处理 (2008-08-02 09:45:12) 转载▼ 标签: 杂谈 分类: matlab及C学习 Matlab文件操作及读txt文件ZZ 2008-07- ...

  4. Oracle创建表空间及用户

    1.sys dba登录 2.创建临时表空间 create temporary tablespace wf_temp tempfile 'C:\APP\ADMINISTRATOR\ORADATA\PLA ...

  5. ubuntu下安装TexLive和Texmaker

    也可以参考ubuntu14.04配置中文latex完美环境(texlive+texmaker+lyx) 设置中文字体的时候参考ubuntu 下安装 texlive 并设置 ctex 中文套装 1.首先 ...

  6. Java数据结构——双向链表

    //================================================= // File Name : DoublyLinked_demo //------------- ...

  7. CSS样式优先级

    关于CSS样式优先级 一般情况下: [1位重要标志位] > [4位特殊性标志] > 声明先后顺序 !important > [ id > class > tag ] 使用 ...

  8. JavaScript 五种(非构造方式)继承

    参考链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html

  9. java获取指定路径下的指定文件/java.io.File.listFiles(FilenameFilter filter)

    java.io.File.listFiles(FilenameFilter filter) 返回抽象路径名数组,表示在目录中此抽象路径名表示,满足指定过滤器的文件和目录. 声明 以下是java.io. ...

  10. JQuery-EasyUI与EXTjs有什么区别?

    一.ExtJS1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在 ...