Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将jQuery嵌入/导入到另一个JavaScript库中,而不会与网站上部署的jQuery/其他库产生潜在冲突?_Javascript_Jquery_Coffeescript - Fatal编程技术网

如何将jQuery嵌入/导入到另一个JavaScript库中,而不会与网站上部署的jQuery/其他库产生潜在冲突?

如何将jQuery嵌入/导入到另一个JavaScript库中,而不会与网站上部署的jQuery/其他库产生潜在冲突?,javascript,jquery,coffeescript,Javascript,Jquery,Coffeescript,我正在开发一个内部使用jQuery的JavaScript库。然而,当部署它的时候,我更愿意简化事情(w.r.t.部署),而不必担心环境是否已经(或没有)包含在中的jQuery 我应该提到,我的库是作为一个类在Coffescript中实现的,生成的.js文件具有用于隔离作用域的默认函数包装器 我可以想出一些解决这个问题的办法: 询问网站管理员是否已经有jQuery。如果 是的,只包括图书馆本身。如果不是,则包括jQuery+ 库,可能在单个文件中并连接。部署更加困难,但问题可能已经解决 创建一个连

我正在开发一个内部使用jQuery的JavaScript库。然而,当部署它的时候,我更愿意简化事情(w.r.t.部署),而不必担心环境是否已经(或没有)包含在
中的jQuery

我应该提到,我的库是作为一个类在Coffescript中实现的,生成的.js文件具有用于隔离作用域的默认函数包装器

我可以想出一些解决这个问题的办法:

  • 询问网站管理员是否已经有jQuery。如果 是的,只包括图书馆本身。如果不是,则包括jQuery+ 库,可能在单个文件中并连接。部署更加困难,但问题可能已经解决

  • 创建一个连接jQuery和我的lib代码的文件,并始终 让网站管理员只包含此文件。为了防止冲突,, 在jQuery代码之后执行
    var myJ=jQuery.noConflict()

  • 按照上面(2)中的操作,但在封装的Coffeescript类中调用
    var myJ=jQuery.noConflict()

  • 总之,这项挑战的目标是:

  • 绝对避免在已部署的网站上出现任何损坏,无论 他们可能在用什么
  • 使部署尽可能简单
  • 尽可能避免不必要的jQuery传输
  • 我关注的是:

    • 如果站点已经有jQuery,但是需要一个较旧/较新的 版本
    • 如果我的
      noConflict()
      调用中断了其上的某些内容,该怎么办 结束

    解决这种情况的最佳方法是什么?我遗漏了什么吗?

    如果您的结束脚本是一个闭包,您只需将它作为一个参数传递给jQuery,然后检查它是否未定义

    (function($) {
    
      if (!$) {
        // load jQuery
      } else {
        // check jQuery version if needed or just use jQuery
        if ($.fn.jquery !== '1.7.2') {
            // load 1.7.2
        };
      };
    
    })(window.jQuery || false);
    

    如果未声明jQuery,则必须使用window.jQuery,因为jQuery只会生成错误。CoffeeScript有一个-b选项可在没有顶级函数包装的情况下编译。使用此方法,您可以使用自己的顶级函数包装器

    i、 e

    然后,作为构建过程的一部分,将jQuery连接到编译输出的前端。适当的Linux/Mac shell命令为:

    (cat jQuery.js; coffee -pb yourSource.coffee) > yourCompiledFileWithjQuery.js
    
    CoffeeScript的
    p
    选项将编译后的输出打印到stdout,以便您可以将其与
    cat jQuery.js
    组合,并将该输出重定向到您的compiledFileWithjQuery.js

    这将确保在执行代码之前,jQuery将立即被包括在内。jQuery保留对$的旧所有者的引用,因此如果某个库或其他版本的jQuery已经在使用它,它将通过调用
    jQuery.noConflict()
    返回给它们

    jQuery.noConflict()
    还返回对该jQuery的引用,因此它将被传递到代码的
    $

    我希望这是清楚的

    额外:

    从几天前发布的CoffeeScript 1.3开始,您可以将其用于顶级函数包装器,这一点更清楚:

    do ($ = jQuery.noConflict()) ->
        # ...
        # your code
        # ...
    

    您将如何完成您概述的“加载”?这是另一个使用标记的远程获取吗?本文展示了一种很好的跨浏览器加载javascript文件和执行回调的方法。非常感谢。我知道这项技术,但很高兴看到一个带有回调函数的示例。然而,我仍然想知道是否有一种方法可以做到这一点,而不需要额外的远程获取;在最初加载的JS文件中一次完成所有操作。感谢您给出清晰的答案!很高兴知道,在编写代码之前对jQuery进行concating可以确保我拥有它,并且整个设置不会发生冲突。有一个问题:如果我在Coffeescript中声明一个类,并在类体中执行$=jQuery.noConflict()调用,会发生什么?我会把它放在类XYZ声明之后。保持一切不变,它也能顺利工作吗?
    do ($ = jQuery.noConflict()) ->
        # ...
        # your code
        # ...