zoukankan      html  css  js  c++  java
  • 【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL

    2018.10.14

    BUG原因:

    在较早期的代码中,容易出现 JS 拼接 HTML 代码字符串的情况。如

    1 // 页面 test.jsp 内部的 JS 代码
    2 // ${} JSP中EL语法,内部为Java服务端返回的长字符串值
    3 // 由用户输入的,且含有隐藏 的空白符:换行符。
    4 
    5 var valFromEL =   ${article.content};
    6 
    7 ...bala bala...

    其中 article.content 是很长的字符串,其来源是由用户在 textarea 输入的长文本(可能出现换行符),如:

    今天天气真不错,是啊,我要开始换行了!
    我是第二行,我要换行了!
    我是第三行。

    BUG症状:

    使用 Chrome F12 控制台一看,很莫名其妙的错误。

    其实只是 第5行 代码出错,导致 JS 出现语法错误,后面的 JS 全都罢工不执行了。

    为什么会出现 “语法错误”呢。

    这其实隐藏了 2 个BUG,都比较难发现。

    BUG分析:

    BUG1.  JSP中的 EL表达式外未加上 双引号

    JSP中的Java代码,EL表达式会先编译执行输出后。这个JSP才会变成 一个普通的HTML代码,然后才是 JS动态脚本的执行。

    所以,不加双引号的HTML源代码就像这样: 

    // 以下为 JS 代码
    // ${} JSP中EL语法,内部为Java服务端返回的长字符串值
    // 由用户输入的,且含有隐藏 的空白符:换行符。
    
    var valFromEL =  今天天气真不错,是啊,我要开始换行了!
    我是第二行,我要换行了
    我是第三行;
    
    //...bala bala...

    “正确”的写法应该是这样:

    // 页面 test.jsp 内部的 JS 代码
    // ${} JSP中EL语法,内部为Java服务端返回的长字符串值
    // 由用户输入的,且含有隐藏 的空白符:换行符。
    
    var valFromEL =   ”${article.content}“ ;    //双引号包起来
    
    //...bala bala...

    BUG2.  EL表达式中的值(字符串)的换行

         即便按照BUG1 加了双引号,其实还是会报错的。

    因为你查看页面源代码发现是这个样子的:.

    // 以下为 JS 代码
    // ${} JSP中EL语法,内部为Java服务端返回的长字符串值
    // 由用户输入的,且含有隐藏 的空白符:换行符。
    
    var valFromEL =  "今天天气真不错,是啊,我要开始换行了!
    我是第二行,我要换行了
    我是第三行";
    
    //...bala bala...

    看到这里,你估计还是没有发现这有什么问题。是的,我当时也是,可 Chrome 控制台一直报错。

    这有什么错误呢?我们看个例子:

    看到了么。这是【语法错误】。

    // 这是对的:
    var valFromEL = "我是第一行" +
    "我是第二行"+
    "我是第三行";
    
    // 这是语法错误:
    var valFromEL = "我是第一行
    我是第二行
    我是第三行";

     最后,为什么会报错,给个原理性的解释:

    根据《Javascript权威指南》文中所说,Javascript 会自动为没有分号的行的末尾加上分号,也就是说,上面的错误代码其实变成了这样:

    // 这是语法错误:
    var valFromEL = "我是第一行;
    我是第二行;
    我是第三行";

    反正怎么折腾,这是妥妥的明显的语法错误。

    BUG的解决:

    解决方法较多,网上也有。

    1. 将用户通过 textarea 控件输入的 文本字符串 使用正则表达式,替换掉 空白字符。【逻辑复杂费脑力】

    2. 直接将 EL表达式内容 赋给隐藏 的 textarea 控件,使用 JQuery 获取该值。【使用JQuery包装能力自己省事】

    个人使用的 方法2,使用JQuery库。JQuery都给你封装好了,何必自己造不靠谱的轮子。

  • 相关阅读:
    拥抱webpack4,有效缩减构建时间57%+
    可能是最详细的UMD模块入门指南
    Chrome远程调试手机端UC浏览器
    sea.js的同步魔法
    在Linux和Windows系统中输出目录结构
    从部署上做到前后端分离
    一种在地图中处理曲线的通用方法
    vue项目中引入iconfont
    前端路上的自我怀疑----------自我突破
    表格布局----基于bootstrap样式 布局
  • 原文地址:https://www.cnblogs.com/muyun/p/9786599.html
Copyright © 2011-2022 走看看