jQuery-UI - “无法读取未定义的属性‘步骤’”
Posted
技术标签:
【中文标题】jQuery-UI - “无法读取未定义的属性‘步骤’”【英文标题】:jQuery-UI - "Cannot read property 'step' of undefined" 【发布时间】:2018-01-03 12:48:15 【问题描述】:我们最近将 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 2x 或 1x 版本,而不是 3X 吗? 我们选择升级到 jQuery 3X。升级后抛出此错误。 不是我问的。可能是您的 jquery ui 版本不能很好地与 3X 配合使用。 它在 jQuery 2X 中运行,但我们决定升级到 jQuery 3X。 【参考方案1】:根据错误消息,您似乎正在使用 jQuery Slim(来自 at each (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>
【讨论】:
【参考方案2】:只是使用不同的cdn,我使用的是引导网站上的cdn,它不起作用jquery cdn
可能是jquery slim版本
【讨论】:
是的,jQuery slim 版本给我造成了这个问题。以上是关于jQuery-UI - “无法读取未定义的属性‘步骤’”的主要内容,如果未能解决你的问题,请参考以下文章
jquery-ui-1.8.4.custom与一般的jquery-ui有啥区别,后面加了custom有啥作用?