jquery $ .noConflict();问题

时间:2014-02-21 02:07:09

标签: javascript jquery

我已将此代码实施到我的网站中(随机化/随机播放divs顺序):

function shuffle(array) {
  var currentIndex = array.length
    , temporaryValue
    , randomIndex
    ;


  while (0 !== currentIndex) {


    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

$.fn.randomize = function (childElem) {

    return this.each(function () {
        var $this = $(this);
        var elems = shuffle($(childElem));
        $this.remove(childElem);
        for (var i = 0; i < elems.length; i++)
            $this.append(elems[i]);
    }); 
}

jQuery(function($){
    $("div.container").randomize("div.random");
});

然而由于与其他脚本冲突,它无法工作,我假设$ .noConflict();是这样的。

这是小提琴,http://jsfiddle.net/7L4gu/我很难自己解决这个问题,我将非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

使用jQuery.noConflict()时,您无法在$块之外使用jQuery(function($){...}。您需要将$.fn.randomize = ...更改为jQuery.fn.randomize = ...,或将函数定义放在jQuery调用中。您还需要在$(this)功能中将$(childelem)jQuery(this)更改为jQuery(childelem)randomize

答案 1 :(得分:1)

因为noConflict(),一旦你使用它$就不再引用jQuery了。在您调用$后,noConflict()未定义,因此表达式$.fn将失败。

广泛使用的解决方案是使用IIFE之类的

(function ($) {
    $.fn.randomize = function (childElem) {
        return this.each(function () {
            var $this = $(this);
            var elems = shuffle($(childElem));
            $this.remove(childElem);
            for (var i = 0; i < elems.length; i++)
            $this.append(elems[i]);
        });
    }
})(jQuery)

演示:Fiddle

在这种情况下,在IIFE方法中,我们接收jQuery对象作为参数,并将其命名为本地范围的变量$,以便我们可以在插件中使用较短的形式。