我正在尝试添加一个javascript文件,该文件是通过Python文件的Transcrypt生成的。
然而,当我将该脚本添加到HTML文件中时,Console中出现了一些错误,我失败了。
我使用的Python文件:try.py
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 yor name? Please insert it below:</font></p>'
else:
document.getElementById("groet").innerHTML = '<p><font color="#00ff00">Hello, '+name+', thank you for introducing you</font></p>'
在那个脚本之后,我运行命令python3 -m transcrypt -b try.py
和一个名为"的文件夹目标";自动创建并且它包含一个文件";试试.js";。
因此,我编写了一个HTML文件,这是一个显示问候信息的基本示例:hello.HTML
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="__target__/try.js"></script>
</head>
<title>Insert Text</title>
<body onload=try.greet()>
<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 onclick=try.greet()>Refresh the greeting!</button>
</p>
</body>
</html>
我希望当我点击按钮或重新加载文件时,应该放置问候信息。然而,在控制台中,我出现了两个错误:
Uncaught SyntaxError: import declarations may only appear at top level of a module try.js:1:13
Uncaught SyntaxError: missing { before try block hello.html:1:3
那么,问题出在哪里呢?
[编辑]在T.J的回答之后,我更新了html文件如下:
'use strict';import{AssertionError,AttributeError,BaseException,DeprecationWarning,Exception,IndexError,IterableError,KeyError,NotImplementedError,RuntimeWarning,StopIteration,UserWarning,ValueError,Warning,__JsIterator__,__PyIterator__,__Terminal__,__add__,__and__,__call__,__class__,__envir__,__eq__,__floordiv__,__ge__,__get__,__getcm__,__getitem__,__getslice__,__getsm__,__gt__,__i__,__iadd__,__iand__,__idiv__,__ijsmod__,__ilshift__,__imatmul__,__imod__,__imul__,__in__,__init__,__ior__,__ipow__,
__irshift__,__isub__,__ixor__,__jsUsePyNext__,__jsmod__,__k__,__kwargtrans__,__le__,__lshift__,__lt__,__matmul__,__mergefields__,__mergekwargtrans__,__mod__,__mul__,__ne__,__neg__,__nest__,__or__,__pow__,__pragma__,__proxy__,__pyUseJsNext__,__rshift__,__setitem__,__setproperty__,__setslice__,__sort__,__specialattrib__,__sub__,__super__,__t__,__terminal__,__truediv__,__withblock__,__xor__,abs,all,any,assert,bool,bytearray,bytes,callable,chr,copy,deepcopy,delattr,dict,dir,divmod,enumerate,filter,float,
getattr,hasattr,input,int,isinstance,issubclass,len,list,map,max,min,object,ord,pow,print,property,py_TypeError,py_iter,py_metatype,py_next,py_reversed,py_typeof,range,repr,round,set,setattr,sorted,str,sum,tuple,zip}from"./org.transcrypt.__runtime__.js";var __name__="__main__";export var greet=function(){var py_name=document.getElementById("Name").value;if(py_name==""||py_name.length==0||py_name==null)document.getElementById("groet").innerHTML='<p><font color="#ff0000">Hello Anonymous, may I know yor name? Please insert it below:</font></p>';
else document.getElementById("groet").innerHTML='<p><font color="#00ff00">Hello, '+py_name+", thank you for introducing you</font></p>"};
//# sourceMappingURL=hello.map
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script type="module">
import { greet } from "./hello.js";
document.getElementById("greetButton").onclick=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>
import declarations may only appear at top level of a module
非常清楚:您没有将脚本作为模块加载,因此不能使用import
。将type="module"
添加到script
标记中。(但要确保你的目标浏览器支持模块——所有现代主流浏览器都支持,但在没有模块支持之前,你不必在一些浏览器中返回几个版本。(
missing { before try block
您有
<body onload=try.greet()>
try
是JavaScript中的一个关键字,不能将其用作标识符。您需要为try
对象使用不同的名称。(我将在这个答案的其余部分使用xtry
。(
如果您的代码真的是一个模块,那么您也不能将xtry
用作全局,即使它是在代码的顶级声明的,因为模块的顶级作用域不是全局作用域。你需要导入它才能使用它。这也意味着你不需要try.js
的script
标签,因为import
会这样做。删除onload
和你当前的script
标签,改为:
<script type="module">
import { xtry } from "__target__/try.js";
xtry.greet();
</script>
直到HTML被完全解析并填充DOM(因为type="module"
(,它才会运行。
附带说明:onload
属性处理程序通常不是最佳实践,原因有两个:1。他们只能使用全局变量和2。load
事件发生在页面加载周期的后期,等待加载所有资源(包括所有图像(。有时这是你想要的,但并不经常。相反,使用现代事件处理(如果您确实需要在load
上挂接处理程序(并使用现代脚本技术(type="module"
、defer
…(
除了@T.J.Crowder的回答外,我还将html中的脚本更改为:
<script type="module">
import * as hello from "./__target__/hello.js";
window.hello = hello;
</script>
如Transcrypt教程中所述。
通过这种方式,我可以在单击按钮时调用Python函数。