jQuery-UI - "Cannot read property ' 步骤'未定义”

标签 jquery angularjs jquery-ui

我们最近将 jQuery 从版本 2.2.4 升级到了 3.1.1,现在发现了一些有趣的错误。我安装了 jquery-migrate 插件,它帮助我解决了一些错误,但不是全部。以下是我在 Chrome 开发者控制台中看到的错误,我似乎无法确定此错误发生的位置。

jquery-ui-1.12.1.js:1951 Uncaught TypeError: Cannot read property 'step' of undefined
    at String.<anonymous> (jquery-ui-1.12.1.js:1951)
    at each (jquery-3.1.1.slim.js:368)
    at Function.color.hook (jquery-ui-1.12.1.js:1913)
    at jquery-ui-1.12.1.js:1963
    at jquery-ui-1.12.1.js:2005
    at jquery-ui-1.12.1.js:14
    at jquery-ui-1.12.1.js:16

我在 Chrome 中进行了调试,它在一个名为 jQuery.fx.step[ hook ] 的函数内部中断。当我将鼠标悬停在 jQuery.fx 上时,它显示为未定义。见下文

jQuery.fx.step[ hook ] = function( fx ) {
            if ( !fx.colorInit ) {
                fx.start = color( fx.elem, hook );
                fx.end = color( fx.end );
                fx.colorInit = true;
            }

我已经卸载了 jquery-ui,但所做的只是破坏了 Angular。如果有人能解释一下这个问题,我会很高兴。

packages.config =

  <package id="Angular.Material" version="1.1.4" targetFramework="net462" />
  <package id="Angular.UI.Bootstrap" version="2.5.0" targetFramework="net462" />
  <package id="angular-file-upload" version="12.2.13" targetFramework="net462" />
  <package id="AngularJS.Animate" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Aria" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Core" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Messages" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Resource" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Route" version="1.6.5" targetFramework="net462" />
  <package id="AngularJS.Sanitize" version="1.6.5" targetFramework="net462" />
  <package id="Antlr" version="3.5.0.2" targetFramework="net462" />
  <package id="Bootbox.JS" version="4.4.0" targetFramework="net462" />
  <package id="bootstrap" version="3.3.7" targetFramework="net462" />
  <package id="CommonServiceLocator" version="1.3" targetFramework="net462" />
  <package id="EntityFramework" version="6.1.3" targetFramework="net462" />
  <package id="font-awesome" version="4.7.0" targetFramework="net462" />
  <package id="HubSpot.Tether" version="1.1.1" targetFramework="net462" />
  <package id="jQuery" version="3.1.1" targetFramework="net462" />
  <package id="jQuery.UI.Combined" version="1.12.1" targetFramework="net462" />
  <package id="lodash" version="4.17.4" targetFramework="net462" />

最佳答案

根据错误消息,您似乎正在使用 jQuery Slim(来自 at every (jquery-3.1.1.slim.js:368))。 Slim 显然删除了 jQuery UI 中所需的一些功能。要解决此问题,请使用完整版本的 jQuery。

这是一个重现您的问题的演示:

$( function() {
    // run the currently selected effect
    function runEffect() {
      // get effect type from
      var selectedEffect = $( "#effectTypes" ).val();
 
      // Most effect types need no options passed by default
      var options = {};
      // some effects have required parameters
      if ( selectedEffect === "scale" ) {
        options = { percent: 50 };
      } else if ( selectedEffect === "transfer" ) {
        options = { to: "#button", className: "ui-effects-transfer" };
      } else if ( selectedEffect === "size" ) {
        options = { to: { width: 200, height: 60 } };
      }
 
      // Run the effect
      $( "#effect" ).effect( selectedEffect, options, 500, callback );
    };
 
    // Callback function to bring a hidden box back
    function callback() {
      setTimeout(function() {
        $( "#effect" ).removeAttr( "style" ).hide().fadeIn();
      }, 1000 );
    };
 
    // Set effect from select menu value
    $( "#button" ).on( "click", function() {
      runEffect();
      return false;
    });
  } );
.toggler { width: 500px; height: 200px; position: relative; }
    #button { padding: .5em 1em; text-decoration: none; }
    #effect { width: 240px; height: 170px; padding: 0.4em; position: relative; }
    #effect h3 { margin: 0; padding: 0.4em; text-align: center; }
    .ui-effects-transfer { border: 2px dotted gray; }
<script src="https://code.jquery.com/jquery-3.1.1.slim.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet"/>

<div class="toggler">
  <div id="effect" class="ui-widget-content ui-corner-all">
    <h3 class="ui-widget-header ui-corner-all">Effect</h3>
    <p>
      Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
    </p>
  </div>
</div>
 
<select name="effects" id="effectTypes">
  <option value="blind">Blind</option>
  <option value="bounce">Bounce</option>
  <option value="clip">Clip</option>
  <option value="drop">Drop</option>
  <option value="explode">Explode</option>
  <option value="fade">Fade</option>
  <option value="fold">Fold</option>
  <option value="highlight">Highlight</option>
  <option value="puff">Puff</option>
  <option value="pulsate">Pulsate</option>
  <option value="scale">Scale</option>
  <option value="shake">Shake</option>
  <option value="size">Size</option>
  <option value="slide">Slide</option>
  <option value="transfer">Transfer</option>
</select>
 
<button id="button" class="ui-state-default ui-corner-all">Run Effect</button>

这是完整的 jQuery:

$( function() {
    // run the currently selected effect
    function runEffect() {
      // get effect type from
      var selectedEffect = $( "#effectTypes" ).val();
 
      // Most effect types need no options passed by default
      var options = {};
      // some effects have required parameters
      if ( selectedEffect === "scale" ) {
        options = { percent: 50 };
      } else if ( selectedEffect === "transfer" ) {
        options = { to: "#button", className: "ui-effects-transfer" };
      } else if ( selectedEffect === "size" ) {
        options = { to: { width: 200, height: 60 } };
      }
 
      // Run the effect
      $( "#effect" ).effect( selectedEffect, options, 500, callback );
    };
 
    // Callback function to bring a hidden box back
    function callback() {
      setTimeout(function() {
        $( "#effect" ).removeAttr( "style" ).hide().fadeIn();
      }, 1000 );
    };
 
    // Set effect from select menu value
    $( "#button" ).on( "click", function() {
      runEffect();
      return false;
    });
  } );
.toggler { width: 500px; height: 200px; position: relative; }
    #button { padding: .5em 1em; text-decoration: none; }
    #effect { width: 240px; height: 170px; padding: 0.4em; position: relative; }
    #effect h3 { margin: 0; padding: 0.4em; text-align: center; }
    .ui-effects-transfer { border: 2px dotted gray; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet"/>

<div class="toggler">
  <div id="effect" class="ui-widget-content ui-corner-all">
    <h3 class="ui-widget-header ui-corner-all">Effect</h3>
    <p>
      Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi.
    </p>
  </div>
</div>
 
<select name="effects" id="effectTypes">
  <option value="blind">Blind</option>
  <option value="bounce">Bounce</option>
  <option value="clip">Clip</option>
  <option value="drop">Drop</option>
  <option value="explode">Explode</option>
  <option value="fade">Fade</option>
  <option value="fold">Fold</option>
  <option value="highlight">Highlight</option>
  <option value="puff">Puff</option>
  <option value="pulsate">Pulsate</option>
  <option value="scale">Scale</option>
  <option value="shake">Shake</option>
  <option value="size">Size</option>
  <option value="slide">Slide</option>
  <option value="transfer">Transfer</option>
</select>
 
<button id="button" class="ui-state-default ui-corner-all">Run Effect</button>

关于jQuery-UI - "Cannot read property ' 步骤'未定义”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356723/

相关文章:

javascript - Angulartics 不会跟踪我在按钮或链接上的事件

jquery - 处理输入文本更改事件

javascript - jQuery fadeOut 回调永远不会触发

c# - asp.net 将值从 JS/jquery 传递到 C# 背后的代码

javascript - AngularJS 客户端验证 : Changing validation requirements depending on other fields?

jquery - 无表表单设计的好文章

jquery - 添加 jqueryui css 后单击事件未触发

php - 在 JQuery 中使用 getJSON 将 cookie 传递到外部域?

javascript - jQuery 缩放功能在多次放大和缩小后失败

javascript - 为什么 ng-show 不能正常工作?