我正在用Anki帮助我的5年级儿子学习数学。我的儿子已经到了一个点,他需要回顾如何解决特定的问题,而不仅仅是记住事实。

例如,假设您正在尝试学习如何将分数相乘...
.45 X .61 =?

我需要一种将随机数学问题放入Anki卡中的方法。这意味着该卡将有一天显示
.45 X .61 =?
下次显示该卡时,可能会出现问题。
.34 X .12 =?

搜寻互联网之后,我找到了一篇文章,解释了如何做...

https://yingtongli.me/blog/2015/03/15/random-question-generator-on-anki-using.html

我不是JavaScript开发人员,但是在敲打键盘一周后,就可以使用此技术。

让我解释一下您如何执行此操作,然后再解释问题出在哪里。

安装Anki的2.0版本。

打开Anki并创建一个新的牌组。

向卡座添加新卡。

出现添加卡对话框。最顶部是两个长按钮...“类型”和“甲板”。单击左侧的“类型”按钮。

出现“选择注释类型”对话框。

单击对话框底部的“管理”按钮。

选择基本笔记类型,然后单击左侧的“添加”按钮。

第一个选项应该是“添加基本”。单击对话框底部的“确定”按钮。

命名新的笔记类型。“脚本笔记类型”,然后单击“确定”

打逃生。

现在选择新的注释类型(“脚本注释类型”),然后单击“选择”。

现在我们要添加一个附加字段。默认情况下,此注释类型具有名为“Front”和“Back”的字段。我们要添加第三个名为“脚本”的字段。

左上角附近有一个标记为“字段”的按钮。点击这个按钮。

出现另一个对话框。左侧是“添加”按钮。点击它。

在出现的对话框中输入脚本,然后单击“确定”按钮。

现在,通过单击右侧按钮附近的关闭按钮来关闭当前对话框。

让我们现在设置卡。当前屏幕的左上方附近有两个按钮。右边的按钮标记为“卡片”。单击此按钮。

这是我们设置卡模板的地方。 JavaScript代码的一部分进入了Front Template。目前,这里应该有以下文字...

{{面前}}

删除所有内容并粘贴以下代码。
<script>

function persist(cb) {
    window.setTimeout(function() {
        // Determine whether to use Anki's Bridge object (Desktop) or sessionStorage (AnkiDroid) to store data across sides.
        var dummy = {};

        var mode = "dummy";
        if (typeof(py) !== "undefined") {
            mode = "py";
            py.data = py.data || {};
        } else if (typeof(sessionStorage) !== "undefined") {
            mode = "sessionStorage";
        }

        var dataObj = {
            setItem: function(key, val) {
                if (mode === "dummy") {
                    dummy[key] = val;
                } else if (mode === "py") {
                    py.data[key] = val;
                } else if (mode === "sessionStorage") {
                    sessionStorage.setItem(key, val);
                }
            },
            getItem: function(key, def) {
                var val = undefined;
                if (mode === "dummy") {
                    val = dummy[key];
                } else if (mode === "py") {
                    val = py.data[key];
                } else if (mode === "sessionStorage") {
                    val = sessionStorage.getItem(key);
                }
                if (val == null) {
                    return def;
                } else {
                    return val;
                }
            },
            tryItem: function(key, val) {
                var currVal = dataObj.getItem(key, undefined);
                if (currVal == null) {
                    dataObj.setItem(key, val);
                    return val;
                } else {
                    return currVal;
                }
            },
            clear: function() {
                if (mode === "dummy") {
                    dummy = {};
                } else if (mode === "py") {
                    window.py.data = {};
                } else if (mode === "sessionStorage") {
                    sessionStorage.clear();
                }
            }
        };

        if (!document.getElementById("back")) {
            dataObj.clear();
        }

        cb(dataObj);
    }, 0); //Execute after Anki has loaded its Bridge object.
}

</script>

<script>

var code = (function () {/* {{Script}} */}).toString();
code = code.replace(/^[^\/]+\/\*!?/, "").replace(/\*\/[^\/]+$/, ""); //Strip beginning/ending comments.
code = code.replace(/<div>/g, "\n").replace(/<\/div>/g, "\n").replace(/<br \/>/g, "\n"); //Strip HTML.
code = code.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&"); //Replace special symbols.
eval(code);
</script>

<div id="front">{{Front}}</div>

该JavaScript接收我们将放置在“脚本”字段中的JavaScrippt代码,并使用eval语句执行该代码。

请注意,在此代码中,persist函数可以使Anki卡的正面和背面的值保持一致。我的问题与此持久功能有关。

在屏幕的底部三分之一是“返回模板”。删除所有内容并粘贴以下代码...
  {{FrontSide}}

<hr id=answer>

<div id="back">{{Back}}</div>

点击右下角的“关闭”按钮。

现在我们需要填写字段。前面和后面的值无关紧要。我将“Front”放在前面,将“Back”放在后面。

对于脚本字段,我们要添加一些代码。粘贴代码之前,我们需要打开HTML View 。确保光标位于“脚本”字段中。

在Anki 2.0版中,屏幕右上方有一个带有向下箭头图片的按钮。 2.1版本带有“...”而不是向下箭头按钮。

单击此箭头,将显示一个菜单。选择“编辑HTML”菜单选项。

粘贴以下代码...
window.setTimeout(function(){

persist(function(data) {


var num1 = data.tryItem("num1",Math.random());


document.getElementById("front").innerHTML = num1;
document.getElementById("back").innerHTML = num1;
});

},0);

在Anki的2.0版本中有效。

这是问题

javascript - JavaScript在Anki的2.0版本中可用,但在2.1版本中不可用-LMLPHP

这是答案...

javascript - JavaScript在Anki的2.0版本中可用,但在2.1版本中不可用-LMLPHP

我们在JavaScript中生成了一个随机数,该值一直保留在Anki卡的正面和背面之间。这为使用随机数的Math和Science Anki卡开辟了可能性世界。

但是,在Whoville,一切都不好。

当您在Anki的2.1版本上运行此代码时,它将不起作用。

javascript - JavaScript在Anki的2.0版本中可用,但在2.1版本中不可用-LMLPHP

脚本将被绕过,并显示Front和Back字段的静态值。

JavaScript仍在执行。我可以在Script字段中放置一个警报语句,它可以工作。

问题出在持久功能上。较新版本的Anki不喜欢Persist功能。

谁能指出我正确的方向。

最佳答案

查看
https://github.com/SimonLammer/anki-persistence
它使用不同的方法来实现持久性。

但是Anki环境在某种程度上是不可预测的,因此您需要检查代码是否已成功初始化。

08-07 08:05