Javascript 使用 JSF 的奇怪逻辑运算符行为:`&&`

Javascript weird logical operator behavior using JSF : `&&`

我正尝试在 javascript 中处理 keydown 事件,目前我遇到了以前从未发生过的事情:

var maxL = $("#myField").attr("maxLength")
console.log("Maximum Length : " + maxL);

if (e.key.length === 1 && str.length >= parseInt(maxL)) {
    console.log(">>>> in if");
    console.log(">>>> e.char == \"" + e.key + "\"");
    e.preventDefault();
}

当我加载页面时,它失败了。在调试时,我的服务器控制台记录了这个错误:

Error Parsing /folder/myPage.xhtml: Error Traced[line: 384] The entity name 
              must immediately follow the '&' in the entity reference.

其中 384 是 if 所在的行

我在dividually 中尝试了这两种情况,它们工作得很好,这让我认为“&&”运算符有问题。

如果这很重要,我在 JSF 中使用 PrimeFaces 在 WebSphere 服务器上工作,我尝试 运行 它在 Chrome 中。 javascript 嵌入在 div 中,以便在加载页面后将其删除:

<div id="deleteScript">
    <SCRIPT>
        //my script code

        $("#deleteScript").remove();
    </SCRIPT>
</div>

这不是浏览器的问题;看起来您的服务器正在尝试对“&&”进行操作。也许你必须在你的代码中转义它。

问题出在您的 JS 写在 html 脚本标签中。如果我是你,我会做的是:

<div id="deleteScript">
    <script src="path/to/script.js"></script>
</div>

由于脚本标签位于 ID "deleteScript" 的 div 中,该元素将在脚本加载时存在,您可以将其删除。

看起来 jsf 正在将您的部分 js 解释为 xhtml。

<![CDATA[]]> 包装您的脚本(在 <script> 标记之后),使其按字面意思解释内容:

<script>
    <![CDATA[
        //your code
    ]]>
</script>

<![CDATA[ ... ]]> 标签用于 XML 文件,以允许使用通常保留的字符,例如“&”、“>”等。您可以在 this answer and here.

上阅读更多内容

我实际上不得不使用以下语法:

<div id="deleteScript">
    <SCRIPT>
        <!--//--><![CDATA[//><!--
            //my script code

            $("#deleteScript").remove();
        //--><!]]>
    </SCRIPT>
</div>

我可以在 this other answer 上找到。 BalusC 似乎认为我们应该只在为较旧的 Web 浏览器工作时才使用此解决方案,但当我们在较旧的 JSF 服务器上工作时似乎也有必要。