IE环境下编写含300行JS的bookmarklet提示expected ')'报错如何解决?
问题根因
该报错是老IE的JScript引擎语法解析规则严格,合并压缩后的代码触发了语法解析异常,核心原因有4类:
- 自动分号插入规则失效:旧代码末尾无分号,和新增的
checkTEST函数声明拼接后,压缩工具生成的代码不符合IE语法要求,解析时误判括号配对失败 - 代码冗余语法干扰:新增代码中
addmessage的参数额外多包裹了一层括号,老IE解析时容易出现语法误判 - 注释残留:代码中的注释未被压缩工具完全清除,和后续代码拼接为单行后注释掉了部分括号配对代码
- bookmarklet封装不规范:直接将函数声明放入
javascript:(code)()模板,IE不支持将函数声明作为立即执行表达式的内容
解决步骤
- 先清理新增函数的冗余语法,移除
addmessage参数外多余的括号,修改后代码如下:
function checkTEST() { clickDynatreeSub("Special TEST Requirement"); setTimeout(function() { if (document.getElementById('ctl01_oldtestType').value != "hydro") { addmessage("test not hydro", "red"); } else { addmessage("test hydro........... OK", "green"); Checkdocuments(); } }, 8000); }
- 所有合并的代码段末尾手动补全分号,尤其是原有功能代码的最后一行必须补分号,避免自动分号插入失效
- 压缩代码时调整配置:开启「删除所有注释」「强制插入分号」选项,关闭「进阶变量混淆」「ES6语法转换」功能,老IE不支持高级压缩优化的语法
- 调整bookmarklet封装模板,不要直接用
javascript:(code)(),统一使用IIFE封装格式:javascript:(function(){/* 粘贴压缩后的所有代码 */})(); - 如果仍报错,采用逐段插入测试的方式定位问题:先单独封装旧功能代码确认无报错,再逐行插入新增代码,定位具体报错位置
内容的提问来源于stack exchange,提问作者Stej
相关产品推荐
相关产品推荐

