提供的脚本使用jQuery的$,但是drupal站点启用了noConflict

时间:2016-06-22 17:10:19

标签: javascript jquery drupal-7

我有一个Drupal 7站点(安装了jquery-update,FWIW)。 jQuery似乎是由jQuery对象而不是$引用的。这在https://www.drupal.org/node/171213已有详细记录。

我正在尝试使用提供的脚本来满足某些特定要求。

提供的脚本使用$ object,因此我得到“TyperError:$不是函数”。

提供的HTML和脚本如下所示:

<div id="grid"><span class="grid-load-error">There was an error loading the interactive grid.</span></div> 
<script type="text/javascript" src="//site.com/tool.js">
</script>

在页面加载时,我收到TypeError消息。

我试图将脚本的加载包装在一个闭包中:

<div id="grid"><span class="grid-load-error">There was an error loading the interactive grid.</span></div> 
<script type="text/javascript">
    (function($) {
        $(function() {
            // console.log($('#grid').html());
            $.getScript("//site.com/tool.js");
        });
    })(jQuery);
</script>

我知道$在闭包内工作 - 注释后的console.log()会在取消注释时生成正确的输出。

我认为$ .getScript()会失败,因为https://api.jquery.com/jquery.getscript/告诉我脚本是在全局上下文中执行的(如果我理解正确的闭包,那么$这里不是全局的)。

有没有办法可以从源代码中包含这个脚本,还是应该编辑它以用“jQuery”替换“$”?

2 个答案:

答案 0 :(得分:2)

$.getScript$.ajax()的快捷方式,然后jquery很好,只需将脚本附加到<head>即可。但是在你的情况下,这不会像你已经发现的那样起作用。因此,只需创建自己的$.getScript

即可

只需获取脚本,然后将其附加到您自己的<script>标记,并将获取的脚本的内容包装在iffe

<script id="myLib"></script>
<script>
    (function ($){
        //$.getScript('./tool.js');
        $.ajax({
            url: './tool.js',
            dataType: "text", //force script response to be treated as plain text
            success: function(data) {
                var myLib = '(function ($){' + data + '}(jQuery));';
                $('#myLib').html(myLib);
            }
        });
    }(jQuery));
</script>

你的脚本现在应该可以正常工作了。只需确保

<script id="myLib"></script>

在页面上定义了jQuery之后。

答案 1 :(得分:1)

您需要使用以下内容包装外部脚本:

(function($) {

})(jQuery);