2011-12-22 43 views
2

我有以下简单的Javascript代码,只允许将数字输入到指定的TextField中。我早些时候在很多地方使用过它,例如Servlet,JSP,JSTL/EL,甚至在PHP中也是如此,并且按预期运行良好。然而,在JSF中,我更少关心一些字符需要转义的Javascript。我尽力让它运行,但我不能。这里是Javascript代码以及JSF的东西。实体名称必须紧跟实体参考中的'&'

<?xml version='1.0' encoding='UTF-8' ?> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
<title>Demo</title> 

<script type="text/javascript" language="javascript"> 

    $(document).ready(function() 
    { 
     $("#myForm:txtDemo").keypress(function(event) 
     { 
      if (event.keyCode==46 || event.keyCode==8|| event.keyCode==9 || event.keyCode>=35 && event.keyCode<=40) 
      { 
       // let it happen, don't do anything 
      } 
      else 
      { 
       if (event.charCode<48 || event.charCode>57 || event.charCode==16) 
       { 
          event.preventDefault(); 
       } 
      }      
     }); 
    }); 

</script> 

</h:head> 

<h:body> 
    <h:form id="myForm"> 

     <br/><br/><br/> 
     <h:inputText id="txtDemo" required="true" requiredMessage="Mandatory." validatorMessage="The field should contain al least 10 digits"> 
      <f:validateLength maximum="10" minimum="2"/> 
      <f:validateRegex pattern="[0-9]*"/> 
      <f:ajax event="valueChange" execute="txtDemo msg" render="txtDemo msg"/> 
     </h:inputText><br/> 

     <h:message id="msg" for="txtDemo" showDetail="true" style="color:red"/><br/> 

     <h:commandButton id="btnSubmit" value="Submit"/> 

    </h:form> 
</h:body> 


JavaScript是不被编译。它分析以下错误。

An Error Occurred: 

Error Parsing /Restricted/TempTags.xhtml: Error Traced[line: 14] The entity name 
must immediately follow the '&' in the entity reference. 

我甚至放在Javascript代码在一个单独的文件js并包含在此页面文件。我也用<h:outputScript></h:outputScript>代替<script></scrip>仍然是同样的问题。


我也曾尝试以下看到的Javascript功能是否被调用或不使用alert();去除的功能,但功能本身的错误解析代码甚至没有打来电话,警告信息是不显示。

<script type="text/javascript" language="javascript"> 

    $(document).ready(function() 
    { 
     $("#myForm:txtDemo").keypress(function(event) 
     { 
      alert(); 
     }); 
    }); 

</script> 

哪些是需要在使用Javascript必要的修改,把它按预期运行?

+2

当你在'CDATA'标签(Google的语法)中包装JS时会发生什么? – Blender 2011-12-22 04:44:43

+1

@Blender或只是[向下滚动](http://stackoverflow.com/a/8599528/139010)';-)' – 2011-12-22 04:52:35

+1

@MДΓΓБДLL:偷偷摸摸的答案提升,先生。我喜欢。 +1 – Blender 2011-12-22 04:53:18

回答

4

这是XHTML,所以你需要或者

  • Wrap the script contents in CDATA tags

    <script> 
    //<![CDATA[ 
    $(document).ready(function() 
    { 
        // snip... 
    } 
    //]]> 
    </script> 
    
  • 或者移动脚本到外部文件,并使用<h:outputScript />包括。

+0

我试着如你所说,解析错误消失,但该函数尚未被调用,应该在指定的'TextField'的'keypress'事件上调用。你能找到一些线索吗? – Lion 2011-12-22 04:56:03

+0

选择器有些不可思议:'$(“#myForm:txtDemo”)'。它不会匹配任何元素,因为':txtDemo'不是一个可识别的伪类。你想要选择什么? '

'或''? – 2011-12-22 04:58:49

+0

它是在JSF中选择一个封闭在表单标签内的元素的方式。我试图选择一个ID为'myForm'的窗体中包含id为'txtDemo'的TextField。它可以在JSF中实现,就像这个'myForm:txtDemo' – Lion 2011-12-22 05:03:38

1

如果您正在使用jQuery,你需要参考元素的ID有特殊字符这样的:

<h:form id="myForm"> 

    <h:inputText id="myInput" /> 

</h:form> 

<script type="text/javascript> 

    $("#myForm\\:myInput").val("some value"); 

</script> 

这是记录here(在页面顶部)。

+0

我已经试过这个'#myForm \\:txtDemo'。它不起作用。你能在上面的代码中找到其他错误吗?它看起来很好,但自从JSF以来,它可能需要一些额外的东西,我认为。我一直在使用JSF超过2年,但我在JSF中使用Javascript/jQuery的频率较低。 – Lion 2011-12-22 08:12:25

+0

你在头文件中包含了jQuery js文件吗? – 2011-12-22 08:18:05

+0

尽管Javascript函数本身并未被调用,但我尽我所能。它是最大的问题。 – Lion 2011-12-22 08:20:12

0

我发现了同样的问题,我解决:

if (event.keyCode==46 || event.keyCode==8|| event.keyCode==9 || event.keyCode>=35 &amp;&amp; event.keyCode<=40) { 
    // let it happen, don't do anything 
} 

这不是很酷,但它的工作原理。

相关问题