我已经承担了将项目从Grails 2升级到Grails 3的艰难过程。到目前为止,我已经完好无损地活了下来,但我遇到了一个非常神秘的障碍:在Grails 2版本上完美运行的Javascript似乎在Grails 3版本中完全忽略了。
示例:我有一个页面,其中包含一个字段,在提交表单之前需要填写该字段。下面是整个页面的代码 - javascript就在最后:
<head>
<meta name="layout" content="main">
</head>
<body>
<g:render template="worksheet/nav"/>
<div class="row-fluid">
<div class="span12">
<div id="errors" class="small alert alert-error" style="display:none"></div>
<br/>
<g:form class="form-horizontal" url="[action:'worksheet']" id="form" onsubmit="return validateForm()">
<fieldset>
<div class="control-group formSep">
<label class="control-label" for="moveType">
Client *
</label>
<div class="controls">
<g:select name="client" class="input-medium" from="${clients}" noSelection="['':'']" value="${map.client?.name}"/>
</div>
</div>
<br/>
<div class="btn-toolbar">
<g:hiddenField name="_eventId" value="next"/>
<span class="pull-right">
<g:link event="skip" class="btn btn-large">Skip</g:link>
<button type="submit" class="btn btn-large btn-primary">Next</button>
</span>
</div>
</fieldset>
</g:form>
</div>
</div>
</body>
<g:javascript>
$("#form").on('submit', function() {
$('#errors').html('');
$('#errors').hide();
});
$("#form").validate({
onfocusout: false,
onkeyup: false,
onclick: false,
rules: {
client: "required"
},
messages: {
client: "Please select a client"
},
errorElement: "div",
errorPlacement: function (error, element) {
$('#errors').append(error);
$('#errors').show();
}
});
在Grails 2中,这可以按预期工作 - 页面将在提交表单之前验证是否已进行选择。但是在Grails 3中,nada - 即使用户没有选择任何内容,表单也会被提交并且系统会移动到下一页。我在编译后检查了源代码并且JS就在那里,所以我不确定它为什么会被忽略。有什么想法吗?
一些额外的上下文:我也将JQuery从1.8.0升级到2.2.0,将Bootstrap从2.0.x升级到3.3.6。