You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在脚本中定义tracery生成随机句子?及相关报错排查

问题解决指南

核心问题分析

报错Uncaught ReferenceError: tracery is not defined以及无法生成句子,本质是脚本加载时机冲突+DOM元素未就绪导致的,和你是否正确引入tracery文件无关。


具体修复步骤

1. 删掉重复的tracery脚本

你同时引入了tracery.js和tracery.min.js,这两个是同一个库的完整版和压缩版,重复加载会引发冲突,只保留压缩版即可:

<!-- 只留这一行,删掉另一个tracery脚本引入 -->
<script defer src="js/tracery/tracery.min.js"></script>

2. 调整自定义脚本的位置

你的自定义脚本写在<head>里,会在<body>和tracery脚本加载完成前执行——这时候既找不到tracery对象,也找不到output元素。解决办法有两种:

  • 方案一:把脚本移到body末尾
    确保DOM元素和外部脚本都加载完再执行代码:
    <body>
    <div id="output"></div>
    <!-- 脚本放在body最后 -->
    <script>
    var data = {
      "origin": "#salutation#, #name#",
      "salutation": ["Hi", "Good morning", "Good evening", "Good night"],
      "name": ["John", "Mary", "Peter", "Anne"]
    };
    var grammar = tracery.createGrammar(data);
    var sentence = grammar.flatten("#origin#");
    document.getElementById("output").innerHTML = sentence;
    </script>
    </body>
    
  • 方案二:给自定义脚本加defer属性
    让它和tracery脚本一起等DOM解析完再执行,注意要放在tracery脚本之后:
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script defer src="js/tracery/tracery.min.js"></script>
    <!-- 加defer,放在tracery脚本后面 -->
    <script defer>
    var data = {
      "origin": "#salutation#, #name#",
      "salutation": ["Hi", "Good morning", "Good evening", "Good night"],
      "name": ["John", "Mary", "Peter", "Anne"]
    };
    var grammar = tracery.createGrammar(data);
    var sentence = grammar.flatten("#origin#");
    document.getElementById("output").innerHTML = sentence;
    </script>
    </head>
    

3. 验证脚本路径

确认tracery.min.js的路径js/tracery/tracery.min.js和你的实际文件目录一致,避免路径错误导致脚本加载失败。


修正后的完整代码示例

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script defer src="js/tracery/tracery.min.js"></script>
</head>
<body>
<div id="output"></div>
<script>
var data = {
  "origin": "#salutation#, #name#",
  "salutation": ["Hi", "Good morning", "Good evening", "Good night"],
  "name": ["John", "Mary", "Peter", "Anne"]
};
var grammar = tracery.createGrammar(data);
var sentence = grammar.flatten("#origin#");
document.getElementById("output").innerHTML = sentence;
</script>
</body>
</html>

内容的提问来源于stack exchange,提问作者Pablo Rojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:07:32