Transcrypt生成JS嵌入HTML报错:import位置错误及缺少{语法问题
让我们一步步拆解你遇到的问题,以及对应的修复方案:
先看你遇到的两个核心错误
1. Uncaught SyntaxError: import declarations may only appear at top level of a module
Transcrypt默认生成的是ES模块格式的JavaScript文件,里面包含import语句来引入它的运行时依赖(比如org.transcrypt.__runtime__.js)。但普通的<script>标签默认会把文件当作传统脚本执行,不支持ES模块的import语法,所以浏览器直接抛出了这个错误。
2. Uncaught SyntaxError: missing { before try block
你的HTML里写了onload=try.greet(),但try是JavaScript的保留关键字(就是用来写try/catch异常处理的那个)。浏览器会把它当成try语句的开头,而不是你的模块名,自然会报错说缺少{。
完整修复方案
第一步:避开JavaScript关键字,重命名Python文件
把你的try.py改成hello.py(名字随便取,只要不是JS关键字就行),代码可以原样保留(顺便帮你修正了两个拼写小错误):
def greet(): name = document.getElementById("Name").value if name == "" or name.length == 0 or name == null: document.getElementById("groet").innerHTML = '<p><font color="#ff0000">Hello Anonymous, may I know your name? Please insert it below:</font></p>' else: document.getElementById("groet").innerHTML = '<p><font color="#00ff00">Hello, '+name+', thank you for introducing yourself</font></p>'
第二步:重新生成JS文件
执行Transcrypt命令,生成新的模块文件:
python3 -m transcrypt -b hello.py
这会在__target__文件夹下生成hello.js和对应的运行时文件。
第三步:修正HTML文件
主要做三个调整:
- 引入JS模块时必须加上
type="module"属性 - 放弃内联的
onload/onclick写法,改用更规范的事件绑定方式 - 通过ES模块导入的方式调用
greet函数
修正后的HTML代码:
<html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <script type="module"> // 从Transcrypt生成的模块中导入greet函数 import { greet } from "./__target__/hello.js"; // 页面加载完成后自动执行一次问候 window.addEventListener('load', greet); // 给按钮绑定点击事件 document.getElementById("greetButton").addEventListener('click', greet); </script> </head> <title>Insert Text</title> <body> <h2>Hello Demo Name</h2> <p> <div id="groet">...</div> </p> <p>Your Name: <input name="name" type="text" maxlength="80" id="Name" value="" /> [Please enter your name]<br><br> <button id="greetButton">Refresh the greeting!</button> </p> </body> </html>
额外小提示
为啥不用内联的onclick?这种写法不仅容易踩关键字的坑,还会把HTML和JS逻辑混在一起,后期维护起来很麻烦,用addEventListener的方式会更清晰、更灵活。
内容的提问来源于stack exchange,提问作者stuck
相关产品推荐
相关产品推荐

