【JS-Java-EL】JavaScript和Java(EL表达式)引发的 Uncaught SyntaxError: Unexpected token ILLEGAL
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的更多相关文章
- JS错误:Uncaught SyntaxError: Unexpected token ILLEGAL
$('tbody', '#' + tableId).append('<tr onmouseover="this.style.backgroundColor=\'#eeeeee\'&qu ...
- Uncaught SyntaxError : Unexpected token ILLEGAL js传递带空格的参数
通常在页面中要让某些内容点击后产生点击事件(非页面跳转)都会使用onclick,但是这样不适于需要传递参数的情况,于是写成直接调用JavaScript函数的方式:<a href=javascri ...
- Uncaught SyntaxError: Unexpected token ILLEGAL【js错误】
应该是逗号的中英文状态错了,应该是英文状态的逗号.还有百度应用后面的逗号.college后面的冒号
- 前端javascript 错误 Uncaught SyntaxError: Unexpected token ILLEGAL
前端控制台报Uncaught SyntaxError: Unexpected token ILLEGAL 错误时,就是非法字符错误,首先检查符号是否正确,不要出现中文标点! 然后检查参数之类的类型是否 ...
- [Z] 从Uncaught SyntaxError: Unexpected token ")" 问题看javascript:void的作用
https://blog.csdn.net/hongweigg/article/details/78094338 问题 在前端编程中,突然出现Uncaught SyntaxError: Unex ...
- 【shiro】使用shiro搭建的项目,页面引用js,报错:Uncaught SyntaxError: Unexpected token <
使用shiro搭建项目过程中,总是出现登录页面 登录第一次有效果,登陆第二次出现302状态码,第三次又有效果,第四次又没有效果的局面. 因此,采用ajax提交页面登录的用户名和密码,但是在引用js的过 ...
- js Uncaught SyntaxError: Unexpected token错误
今天遇到js报错Uncaught SyntaxError: Unexpected token 不知道是什么原因,并且js还会继续往下执行. 经过排查竟然是在保存行的上面有个if少一个大括号,真是坑爹啊 ...
- js多条件if语句简写发生Uncaught SyntaxError: Unexpected token }
改写原生js 多条件if判断语句时,采用三元方法,发生Uncaught SyntaxError: Unexpected token } function compareImgSize() { var ...
- js报Uncaught SyntaxError: Unexpected token <错误 解决方法
js报Uncaught SyntaxError: Unexpected token <错误 解决方法 错因 js被shiro的拦截器拦下,访问不了 #shiro的配置 shiro: hash-a ...
随机推荐
- Vue在单独引入js文件中使用ElementUI的组件
Vue在单独引入js文件中使用ElementUI的组件 问题场景: 我想在vue中的js文件中使用elementUI中的组件,因为我在main.js中引入了element包和它的css,并挂载到了全局 ...
- vue resource 携带cookie请求 vue cookie 跨域(六)
1.依赖VueResource 确保已安装vue-resource到项目中,找到当前项目,命令行输入: npm install vue-resource --save 在主方法添加 过滤 Vue.h ...
- python 选取Serise、DataFrame列的子集方法
- 人工智能和机器学习 AI&ML howto
我关心的AI.ML的分支领域: 我的博客:Deep Learning 和 Knowledge Graph howto (有关DL&KG的资料都在这里) https://www.cnblogs. ...
- day03 - Python基础3
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 ...
- SmartRF Flash Programmer突然打不开显示界面的办法【亲测有效】
在尝试打开任务管理器结束任务之后重新打开依然无果,在尝试了SmartRF Flash Programmer卸载重装无数次之后依然无果的况状,我被SmartRF Flash Programmer存在界面 ...
- ubuntu下安装录屏软件
sudo add-apt-repository ppa:maarten-baert/simplescreenrecorder sudo apt-get update sudo apt-get inst ...
- TP扩展Xxtea.class.php加密解密函数用法
http://www.coolcode.org/?action=show&id=128这里可以查到一个相关文章. 附上xiunobbs里的代码,自己加了点注释,欢迎大牛批评指正 //将数值数组 ...
- 解决MyEclipse报errors running builder ‘javascript validator’ on project
今天导入项目的时候,报了以下错误 MyEclipse测到功能代码变化(保存动作触发)就报错: errors running builder ‘javascript validator’ on proj ...
- DataGridView带图标的单元格实现
目的: 扩展 C# WinForm 自带的表格控件,使其可以自动判断数据的上下界限值,并标识溢出. 这里使用的方法是:扩展 表格的列 对象:DataGridViewColumn. 1.创建类:Data ...