1

一段时间以来一直未能成功解决此问题。

我正在使用 JSPX,并使用图块来呈现 HTML(不是 XHTML)页面,父图块模板是这样的

<html lang="en-us" dir="ltr" xmlns:jsp="http://java.sun.com/JSP/Page"
  xmlns:tiles="http://tiles.apache.org/tags-tiles" xmlns:c="http://java.sun.com/jsp/jstl/core"
>
<jsp:output doctype-root-element="HTML" doctype-system="about:legacy-compat" omit-xml-declaration="yes"/>
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<jsp:directive.page pageEncoding="UTF-8" />
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<c:url var="rootUrl" value="/resources/" />
<link rel="stylesheet" type="text/css" href="${rootUrl}css/screen.css" />
<link href="${rootUrl}css/forms/uni-form.css" media="screen" rel="stylesheet" />
<link href="${rootUrl}css/forms/form.css" media="screen" rel="stylesheet" />
<link href="${rootUrl}css/forms/blue.uni-form.css" id="formStyle" title="Default Style" media="screen" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css" />
<!--[if lte ie 7]>
          <style type="text/css" media="screen">
          /* Move these to your IE6/7 specific stylesheet if possible */
            .uniForm, .uniForm fieldset, .uniForm .ctrlHolder, .uniForm .formHint, .uniForm .buttonHolder, .uniForm .ctrlHolder ul{ zoom:1; }
          </style>
        <![endif]-->
<![CDATA[
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js">
</script>

<script type="text/javascript" src="http://code.jquery.com/ui/1.9.0/jquery-ui.min.js">
</script>
]]>
<script type="text/javascript" src="${rootUrl}js/ext/forms/uni-form-validation.jquery.js">
    <!--avoid jspx tag collapse -->
    <jsp:text></jsp:text>
</script>   
<![CDATA[
<script type="text/javascript">
    $(function() {
        $( "#demographicInfo.dateOfBirth" ).datepicker({ 
            minDate: -20, maxDate: "+1M +10D", 
            changeMonth: true,
            changeYear: true });
        $('form.uniForm').uniform({
            prevent_submit : true,
            ask_on_leave : true,
        })
    });
</script> ]]>
<title>Mystery Shopping</title>
</head>
<body>
  <div id="page">
    <tiles:insertAttribute name="header" />
    <tiles:insertAttribute name="body" />
    <tiles:insertAttribute name="footer" ignore="true" />
  </div>
</body>
</html>

在实现 body 属性的视图中,表单已实现如下:

  <div id="createPane" class="panel roundedCorners">
    <form:form commandName="shopperDemographicInfo" method="POST" action="/shopper/contactinfo/save" id='contactInfo' class="uniForm">
      <div class="header">
        <h2>Contact Information</h2>
        <p>
          <a href="/shopper/info#contact_info" class="cta">Do I have to? →&lt;/a>
        </p>
      </div>
      <fieldset>
      ...
      ...
        <div class="ctrlHolder">
          <label for="demographicInfo.dateOfBirth"><em>*</em> Date of birth</label>
          <spring:bind path="demographicInfo.dateOfBirth">
            <input name="demographicInfo.dateOfBirth" id="demographicInfo.dateOfBirth" size="35" type="text"
              class="textInput auto required validateDate"
            >
          </spring:bind>
          <p class="formHint">Date of birth in dd/mm/yyyy format</p>
        </div
      ...

如您所见,我正在起诉基于 Jquery 的 UI 和表单生成插件。问题是块

<![CDATA[
<script type="text/javascript">
    $(function() {
        $( "#demographicInfo.dateOfBirth" ).datepicker({ 
            minDate: -20, maxDate: "+1M +10D", 
            changeMonth: true,
            changeYear: true });
        $('form.uniForm').uniform({
            prevent_submit : true,
            ask_on_leave : true,
        })
    });
</script> ]]>

不执行。也不是下面提到的形式

看到第一个回复后添加了备用块

<script type="text/javascript">
  <![CDATA[
    $(function() {
        $( "#demographicInfo.dateOfBirth" ).datepicker({ 
            minDate: -20, maxDate: "+1M +10D", 
            changeMonth: true,
            changeYear: true });
        $('form.uniForm').uniform({
            prevent_submit : true,
            ask_on_leave : true,
        })
    });
  ]]>
</script>

详细说明 uni-form-jquery-validation 如果存在验证错误,javascript 预计不允许提交;然而这并没有发生。然而,我确实看到验证适用于其他一些预期场景,例如元素失去焦点时。同样,来自 jQuery 的日期选择器组件根本不会被渲染。

如果我放置一个简单的 HTML 5 页面,所有这些都可以正常工作。我已经正确地转义了脚本;调试器没有显示任何错误(不是我有限的 javascript 知识可以学习)。

关于可能仍然出现问题的任何指示或想法?

这是统一 jquery 插件github 源的链接

更新:这是一个 jQuery 加载问题,而不是其他任何事情;这是每次都会发生的事情:

  1. 我等到页面完全加载
  2. 目的将文本字段完全留空,这会在元素失去焦点时导致违规错误
  3. 此时,如果我点击刷新或返回按钮,系统会提示我确认配置要求的离开页面

    'ask_on_leave:真'

  4. 但是该脚本永远不会“阻止”表单提交。

对此加载问题进一步进行故障排除以归零。

我得到的另一个相当诡异的行为是,在几次随机刷新之后,要求确认离开页面的弹出窗口开始按照配置的要求工作

ask_on_leave : true

对我来说,这似乎是一个实例化问题,但我无法再进行故障排除,因为运行 firebug 或 chrome 开发者控制台,当页面加载或添加断点以在访问页面上的控件时检查流程时,不会出现错误。

检查 JQuery 打开的缺陷,看看那里是否有一些指针。

日期选择器解决了

我对“id​​”属性的值使用了错误的格式

id='demographicInfo.dateOfBirth'

并在 jQuery 函数中

    $( "#demographicInfo.dateOfBirth" ).datepicker({ 
        minDate: -20, maxDate: "+1M +10D", 
        changeMonth: true,
        changeYear: true });

这让 jQuery 感到困惑,将其更改为

id='dateOfBirth'

    $( "#dateOfBirth" ).datepicker({ 
        minDate: -20, maxDate: "+1M +10D", 
        changeMonth: true,
        changeYear: true });

解决了

我必须添加片段来转义所有元素的名称,这些元素有一个句点,即一个元素

<input name='demographicInfo.age' .... />

javascript代码

required : function (field, caption) {
    var name;
    if (field.is(':radio')) {
        var rawName = field.attr('name');
        if(~rawName.indexOf('.')){
            console.log("escaping . chanracter");
            name = rawName.replace(".","\\.");
            console.log(name);
        }else
            name = rawName;
        if ($("input[name=" + name + "]:checked").length) {
            return true;
        }
        return i18n('req_radio', caption);
    }
    if (field.is(':checkbox')) {
        name = field.attr('name');
        if (field.is(":checked")) {
            return true;
        }
        return i18n('req_checkbox', caption);
    }
    if (jQuery.trim(field.val()) === '') {
        return i18n('required', caption);
    }
    return true;
}

由于带有 . 名字中的字符。

4

1 回答 1

1
<script type='text/javascript'>//<![CDATA[ 
    ...
//]]>  
</script>

注意脚本标签内的 CDATA 没有包围它们。

于 2012-10-18T13:14:45.823 回答