2018.10.14

BUG原因:

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

 // 页面 test.jsp 内部的 JS 代码
// ${} JSP中EL语法,内部为Java服务端返回的长字符串值
// 由用户输入的,且含有隐藏 的空白符:换行符。 var valFromEL = ${article.content}; ...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都给你封装好了,何必自己造不靠谱的轮子。

【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL的更多相关文章

  1. JS错误:Uncaught SyntaxError: Unexpected token ILLEGAL

    $('tbody', '#' + tableId).append('<tr onmouseover="this.style.backgroundColor=\'#eeeeee\'&qu ...

  2. Uncaught SyntaxError : Unexpected token ILLEGAL js传递带空格的参数

    通常在页面中要让某些内容点击后产生点击事件(非页面跳转)都会使用onclick,但是这样不适于需要传递参数的情况,于是写成直接调用JavaScript函数的方式:<a href=javascri ...

  3. Uncaught SyntaxError: Unexpected token ILLEGAL【js错误】

    应该是逗号的中英文状态错了,应该是英文状态的逗号.还有百度应用后面的逗号.college后面的冒号

  4. 前端javascript 错误 Uncaught SyntaxError: Unexpected token ILLEGAL

    前端控制台报Uncaught SyntaxError: Unexpected token ILLEGAL 错误时,就是非法字符错误,首先检查符号是否正确,不要出现中文标点! 然后检查参数之类的类型是否 ...

  5. [Z] 从Uncaught SyntaxError: Unexpected token ")" 问题看javascript:void的作用

    https://blog.csdn.net/hongweigg/article/details/78094338 问题    在前端编程中,突然出现Uncaught SyntaxError: Unex ...

  6. 【shiro】使用shiro搭建的项目,页面引用js,报错:Uncaught SyntaxError: Unexpected token <

    使用shiro搭建项目过程中,总是出现登录页面 登录第一次有效果,登陆第二次出现302状态码,第三次又有效果,第四次又没有效果的局面. 因此,采用ajax提交页面登录的用户名和密码,但是在引用js的过 ...

  7. js Uncaught SyntaxError: Unexpected token错误

    今天遇到js报错Uncaught SyntaxError: Unexpected token 不知道是什么原因,并且js还会继续往下执行. 经过排查竟然是在保存行的上面有个if少一个大括号,真是坑爹啊 ...

  8. js多条件if语句简写发生Uncaught SyntaxError: Unexpected token }

    改写原生js 多条件if判断语句时,采用三元方法,发生Uncaught SyntaxError: Unexpected token } function compareImgSize() { var ...

  9. js报Uncaught SyntaxError: Unexpected token <错误 解决方法

    js报Uncaught SyntaxError: Unexpected token <错误 解决方法 错因 js被shiro的拦截器拦下,访问不了 #shiro的配置 shiro: hash-a ...

随机推荐

  1. python迭代器、生成器、列表推倒式

    创建迭代器: iter( ): 创建迭代器 next( ): 返回迭代器的下一个element(元素) 实例题: >>> list = [1,2,3,4] >>> ...

  2. inventor卸载不干净

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. Java学生管理系统(连接数据库查询)超详细

    这几天逼着交Java,借鉴各位师傅的做出来这么个简陋的东西,各位大师傅不要笑我.(学都没有学过Java的我,QAQ~) 下面针对的都是SQL Server系列的连接,如果你使用MySQL那么不必看关于 ...

  4. ETL模型设计

    传统的关系数据库一般采用二维数表的形式来表示数据,一个维是行,另一个维是列,行和列的交叉处就是数据元素.关系数据的基础是关系数据库模型,通过标准的SQL语言来加以实现. 数据仓库是多维数据库,它扩展了 ...

  5. 浅析正则表达式模式匹配的 String 方法

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace.match.search等方法,以下是对一些方法使用的总结. Stri ...

  6. jQuery UI dialog 隐藏默认关闭按钮

    var O_dialog = $("#dialog-modal"); O_dialog.dialog({ closeOnEscape: false, width: 250, hei ...

  7. Echarts学习笔记

    1.Ecahrts使用首先需要引用js文件 Echarts.js 然后定义一个带id的容器(div就可以) 然后就可以初始化echarts了 ↓这是柱形图 <h2 class="con ...

  8. one + two = 3

    读入两个小于100的正整数A和B,计算A+B.需要注意的是:A和B的每一位数字由对应的英文单词给出. 输入 测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =", ...

  9. HTML标签_1

    <meta charset="utf-8" /> 设置字符集 <meta name="description" content="这 ...

  10. tomcat下部署项目的流程和遇到的问题笔记

    简单部署流程: 1,解析域名关联到服务器ip 2,配置服务器jre运行环境 3,安装tomcat 4,项目打war包,放入tomcat根目录下webapps(tomcat默认加载的项目目录)目录下 5 ...