2014-06-24 49 views
3

工作jQuery的我一直在使用jQuery了好几年后,我包括任何网站,我工作的jQuery的脚本,我总是会用$ jQuery的对象。例如:

$('#my_selector').click(function(){... 

我建了一个网站,几年前在的Joomla 1.6,拥有200页和jQuery中使用的几乎所有的人,所有与$。现在我正在Joomla 3.3.0中重建网站。有趣的是,现在有时$只是在识别jQuery对象时不起作用,但是当我使用jQuery时它起作用。例如。上面的代码示例将不得不更改为:

jQuery('#my_selector').click(function(){... 

而且工作正常。最后最奇怪的是,在一个页面上,似乎$适用于某些jQuery,但不是全部。我看到的错误是这个:

TypeError: undefined is not a function 

好像在运行after load complete情况下,功能大多出现问题。无论如何,我只是想知道,如果有人知道为什么$将停止与识别jQuery功能和对象的工作。

谢谢!

+1

你是否在同一页面中多次引用jquery? –

+1

这很可能是因为[jQuery.noconflict()](http://api.jquery.com/jquery.noconflict/)导致'$'不能被定义。 – cmbuckley

+1

是否与其他图书馆发生某种冲突bcos –

回答

7

你最有可能使用冲突的库,意思是:声明(从而覆盖)可变$另一个脚本/库。总结所有的代码在一个封闭的,你应该是不错的:

(function($) { 
    $('#my_selector').doStuff(); 
})(jQuery) 

或者,如果需要的文件准备好后执行:

jQuery(document).ready(function($) { 
    $('#my_selector').doStuff(); 
}); 
+0

我有一堆函数在全局范围内,并在函数内使用$做jQuery的东西。是否有可能围绕所有这些功能创建一个闭包?功能仍然可以从全局范围调用? –

1

您或Joomla使用的mootools或任何其他库与$

这将意味着存在冲突并解决它的正确方法是使用jQuery而不是$

1

Joomla 3.x正在逐步向jQuery发展,并逐渐取代所有MooTools的依赖关系。

的默认状态是在noConflict()模式加载jQuery,但根据由扩展(templatesplug-inscomponentsmodules)MooTools的任何给定页面上使用的特征还可以被加载。

这意味着在某些页面上,jQuery被定义,而不是$,并且在其他页面上都被定义了,显然这会导致您遇到的问题。

添加到1.6时代的大多数第三方扩展(你一直在升级到2.5.x版本的路上),只是忽略了所发生的事情并加载了他们需要的任何东西(可能会吹走其他图书馆),您通常必须首先排除所有冲突。

唯一可以保证的方式来使用jQuery是通过使用jQuery前缀。

您可以阅读约using JavaScript frameworks with Joomla here,其中包括内置于Joomla中用于加载jQuery的未来验证机制。

要加载的jQuery,用途:JHtml::_('jquery.framework');

要加载的jQuery UI核心的呼叫:JHtml::_('jquery.ui');

正如已经提到你可以用你的JavaScript的关闭,其实这就是核心com_banners做在/media/cbanner.js

var jQuery; 
    (function ($) { 
     $(document).ready(function() { 
      $('#jform_type').on('change', function (a, params) { 
       var v = typeof(params) !== 'object' ? $('#jform_type').val() : params.selected; 
       switch (v) { 
       case '0': 
        // Image 
        $('#image, #url').show(); 
        $('#custom').hide(); 
        break; 
       case '1': 
        // Custom 
        $('#image, #url').hide(); 
        $('#custom').show(); 
        break; 
       } 
      }); 
     }); 
    })(jQuery);