zoukankan      html  css  js  c++  java
  • 引入jQuery后$冲突的解决办法

          网站开发中的javasript部分,现在的开发人员很少有再去手工写document.getElementById()的了吧,那还不得累死,你还真别说,getElementById还真不好写,字母还挺多又区分大小写,一不留神就写错了。因此一下诸如用$来实现document.getElemetnById()就常见了。

    function $() {
      var elements = new Array();
      for (var i = 0; i < arguments.length; i++) {
        var element = arguments[i];
        if (typeof element == 'string')
          element = document.getElementById(element);
    
        if (arguments.length == 1)
          return element;
    
        elements.push(element);
      }
      return elements;
    }

          微软的asp.net ajax客户端框架也有类似用$get来实现的代码。

    var $get = Sys.UI.DomElement.getElementById = function Sys$UI$DomElement$getElementById(id, element) {
    /// <param name="id" type="String"></param> 4.5.    
    /// <param name="element" domElement="true" optional="true" mayBeNull="true"></param> 6.7.    
    /// <returns domElement="true" mayBeNull="true"></returns> 8.9.    
       var e = Function._validateParams(arguments, [
            {name: "id", type: String},
            {name: "element", mayBeNull: true, domElement: true, optional: true}
        ]);
        if (e) throw e;
        if (!element) return document.getElementById(id);
    .    if (element.getElementById) return element.getElementById(id);
        // Implementation for browsers that don't have getElementById on elements: 28.29.    
        var nodeQueue = [];
        var childNodes = element.childNodes;
        for (var i = 0; i < childNodes.length; i++) {
           var node = childNodes[i];
            if (node.nodeType == 1) {
                nodeQueue[nodeQueue.length] = node;
            }
        }
        while (nodeQueue.length) {
            node = nodeQueue.shift();
            if (node.id == id) {
                return node;
            }
            childNodes = node.childNodes;
            for (i = 0; i < childNodes.length; i++) {
                node = childNodes[i];
                if (node.nodeType == 1) {
                    nodeQueue[nodeQueue.length] = node;
                }
            }
        }
        return null;
    }

           由于jQuery的简约、优美,更重要的是被微软所大力推广,因此在项目中引入jQuery就显得自然而必然,jQuery采用$函数来返回一个jQuery对象,也就是$=jQuery,引入jQuery后针对$符号问题必然产生冲突,因此主要有2个思路来解决。

           一、利用jQuery.noConfict()使得$$等于jQuery,代码为$$=jQuery.noConflict()。这样需要做一下几件事

           1、在包含jQuery以及基于jQuery的javasript代码文件中最后加上$$=jQuery.noConflict(),jQuery的VS智能提示文件(jQueryXXX –vsdoc.js)也最后的window.jQuery = window.$ = jQuery;也改成window.jQuery = window.$$ = jQuery;好了。

           2、基于jQuery的插件和扩展文件最前面加上$=jQuery.noConflict();最后面加上$$=jQuery.noConflict();。

           3、原有的$的实现文件中,最上面加上jQuery.noConflict()表示将$的“权力”交给其他我们自己的js文件,然后文件最后面加上$$=jQuery.noConflict()。

    4、页面引入js的时候注意顺序,jQuery的相关文件放前面,与jQuery不相关的文件放后面。

    这样做了之后,$还是表示以前的含义,而使用jQuery则直接用jQuery或者$$就可以了。

    优点:只需要改几个文件就能达到目的。

    缺点:$$使用起来并不顺手,以后引入jQuery插件时都需要按步骤2进行操作一次。

    二、将原有的$进行替换,经过考虑后我采用的第二种方法,因为jQuery在以后的项目中将被广泛使用,使用$$或者jQuery来写代码毕竟别扭。考虑到asp.net ajax的兼容性,因此将原有$替换成$get。用Visual Studio来做替换到也不难

    ,但也还需要一点步骤。

            1、首先用$get("替换掉$(",然后是用$get(‘替换掉$(',最后才是$get替换成$。

            2、替换的时候利用VSS的签出提示功能,一个一个文件进行一定的确认(要是出了差错那可不是小事)。最后还是出了一些小问题,在同事的协助下也基本解决了。

            3、Visual Studio的替换功能还真是袖里有乾坤,如下的一个Replace in Files东西还真不少。

            image

            Use那个勾上上,可千万别选Regular expressions,因为在右边清楚的显示$表示End of Line。Look In那个当然选Current  Project,当然右边的按钮按下后可以选多个目录来框定反问,这个倒是以前完全没用过的。Look at these file types可以选定特殊的一些文件类型来缩小范围。

  • 相关阅读:
    遗传算法求函数最值(C语言实现)
    AjaxUploader使用
    AjaxUploader使用:FileUploaded及UploadCompleted
    AutoIt
    网站盗链问题及解决方案
    input不保留历史记录
    必备知识:消息处理
    AjaxUploader使用:文件保存到数据库
    AjaxUploader使用:JavaScript APIs
    页面定时跳转
  • 原文地址:https://www.cnblogs.com/xiaopang2010/p/1773942.html
Copyright © 2011-2022 走看看