jQuery - noConflict()问题

时间:2016-05-03 14:43:43

标签: javascript jquery

我的问题可能与我试图做到这一点的范围有关。

滑块可以工作。或者图像将替换文本。但不是两个。

我必须拥有这个" scrollbox.min.js"文件链接,以便滑块工作。因此我使用noConflict。

我希望以下代码段使用scrollbox.min.js文件:

<script>
  jQuery().noConflict();
  jQuery(function($) {
        $(document).ready(function() {
          jQuery('#scrool').scrollbox({
            direction: 'h',
            switchItems: 3,
            distance: 540,
            autoPlay: false
          });
          jQuery('#scrool-backward').click(function() {
            jQuery('#scrool').trigger('backward');
          });
          jQuery('#scrool-forward').click(function() {
            jQuery('#scrool').trigger('forward');
          });
        })
      }
</script>

我希望其他人使用该网站的jQuery。

我注意到了一些事情:

取决于我放置jQuery()的位置.noConflict();它允许执行不同的代码段。我需要两个工作:

enter image description here

enter image description here

请参阅下面的完整部分脚本:

<script src="http://www.qwerty.com/assets/xjs/jquery.scrollbox.min.js"></script>
<script>
  jQuery().noConflict();
  jQuery(function($) {
    $(document).ready(function() {
      jQuery('#scrool').scrollbox({
        direction: 'h',
        switchItems: 3,
        distance: 540,
        autoPlay: false
      });
      jQuery('#scrool-backward').click(function() {
        jQuery('#scrool').trigger('backward');
      });
      jQuery('#scrool-forward').click(function() {
        jQuery('#scrool').trigger('forward');
      });
    });
  });

</script>

<script>
  jQuery(function($) {
    $(document).ready(function() {

      jQuery('.starIMGrating').each(function(i, obj) {

        var myString = jQuery(this).html()

        if (myString > "5") {
          var myString = "5"
        } else {}

        /* alert(myString); */
        myRegexp3 = /\d/;
        var match = myRegexp3.exec(myString);

        var myRegexp2 = /\d\.(\d)/;
        var matchstring = myString;
        var m;

        if (myString.indexOf(".") == -1) {
          var match2 = 0;
        } else if (myString.indexOf(".") == 1) {
          var m = myRegexp2.exec(matchstring)
          var match2 = m[1];
        }

        starIMG = "<img src='http://qwerty/" + match + "_" + match2 + "/5/rating.gif' alt='' style='width:70px !important;' />";

        /*alert(match2); */
        jQuery(this).html(starIMG);
        /* alert(starIMG); */
      });

    });
  });

</script>

4 个答案:

答案 0 :(得分:10)

调用jQuery().noConflict();会抛出错误:

  

未捕获TypeError:jQuery(...)。noConflict不是函数

当不在try { ... }块内时,将导致该脚本的其余部分根本不执行。

noConflict是主jQuery命名空间对象的一部分,但不是单个jQuery对象的一部分,因此您应该从jQuery()删除括号:

jQuery.noConflict();

有关详细信息,请参阅此处:http://learn.jquery.com/using-jquery-core/dollar-object-vs-function/

答案 1 :(得分:5)

正如其他人所提到的,你需要使用jQuery.noConflict(),但是每当调试这样的东西时你想要最小化所有移动部件。我将在下面描述的内容不太可能对您造成任何问题,但它强调了jQuery的一个非常明显的误用,您应该尝试并遵循。您有以下代码:

jQuery(function ($) {
  $(document).ready(function(){
    ...
  });
});

这相当于写下以下内容:

jQuery(document).ready(function ($) {
  $(document).ready(function(){
    ...
  });
});

你看到了两面派吗?让我解释一下:

  1. 以下两行相同:

    $(function() { /* execute code */ });
    $(document).ready(function () { /* execute code */ });
    

    所以当你把其中一个放在另一个里面时,就像你已经完成了一样,你基本上是在说&#34;等到文档准备就绪,然后等到文档再次准备就绪,然后然后执行代码&#34; 。这是多余的,没必要。

  2. 每当您使用上述任何一种&#34;文件准备好&#34;语句,你可以给jQuery一个不同的名称,以便在回调函数中使用。例如,如果需要,我们可以将jQuery重命名为fOobar

    $(function(fOobar) {
        fOobar('#scroll').trigger('forward');
    });
    
  3. 使用noConflict()时,上述技术特别有用。没有人喜欢输入jQuery,因为$美元符号更容易。但noConflict()表示您无法使用美元符号。要解决此问题,我们可以将jQuery重命名为美元符号,而不会影响页面上的其他代码:

    jQuery.noConflict();
    jQuery(function ($) {
      // you can safely use the dollar sign variable inside this function
      // instead of the cumbersome `jQuery` variable.
    });
    
  4. 最后,每次将选择器传递给jQuery时,都需要做很多工作才能在页面中找到该元素。为了防止jQuery太累,我们可以保存(或缓存)jQuery已经完成的工作并重用它。如果您缓存了#scroll元素,那么以下是您的代码:

    jQuery.noConflict();
    jQuery(function ($) {
      // get the #scroll element once and reuse it
      var $scroller = $('#scroll');
      $scroller.scrollbox({
        direction: 'h',
        switchItems: 3,
        distance: 540,
        autoPlay: false
      });
      $('#scrool-backward').click(function() {
        $scroller.trigger('backward');
      });
      $('#scrool-forward').click(function() {
        $scroller.trigger('forward');
      });
    });
    

答案 2 :(得分:0)

请参阅:jQuery.noConflict()

你会得到的:

jQuery.noConflict();
(function($) {
  $(document).ready(function() {
    $('#scrool').scrollbox({
      direction: 'h',
      switchItems: 3,
      distance: 540,
      autoPlay: false
    });
    $('#scrool-backward').click(function() {
      $('#scrool').trigger('backward');
    });
    $('#scrool-forward').click(function() {
      $('#scrool').trigger('forward');
    });
  });
}(jQuery);

答案 3 :(得分:0)

这里基本上你有两个jquery库实例(jquery库文件在页面中添加了两次),这样更简单的解决方案就是只有一个jquery库的实例,所以如果你能以某种方式添加单个例如,对你来说这很容易,我很想知道为什么这是不可能的。

另一方面,如果你无法删除额外的jQuery实例,那么你可以做一件事,在页面特定的变量中保存最新的jquery实例,然后不调用冲突。 e.g。

var $$ = $;
jQuery.noConflict();
$$('#scroll').scrollbox({})

所以你可以使用带有$$的滚动框,即$$('#roll')。scrollbox({})和其他带有单个$

的东西