编写程式
GeoGebra 支援两种程式语言 - GGBScript 和 Javascript。我们可以在下列的事件中编写相对的触发程序:
- 用滑鼠点选某物件时 (On Click)
- 某物件数值或属性变更时 (On Update, ...)
- 开启 GeoGebra 档案时 (ggbOnInit)
- Javascript 触发程序 (listener),详情请参考 JavaScript。
我们可以透过物件属性视窗中的“程式”页面来编写程式码。
GGBScript
GGBScript 主要是用 GeoGebra 本身的指令来编写。
JavaScript
JavaScript 是一种常用于网页中的程式语言。不像 GGBScript 只能依序执行一些 GeoGebra 指令而己,JavaScript 可以使用 if、while、for 等关键字来控制程式的流程。
我们也可以使用一些特别的 JavaScript 函数来作图,这些函数都是 ggbApplet 的物件方法,也就是说我们必须使用:ggbApplet.method(a, b, ...)
这样的语法来呼叫这些函数才行。
for(var i =0;i<10;i++) ggbApplet.evalCommand("A_"+i+"=(random()*10,random()*10)");
GeoGebra 拥有自己的 JavaScript 编译程式。当我们要将 GeoGebra 汇出网页时,我们可以选择要使用 GeoGebra 自己的编译程式还是浏览器的编译程式。如果你直接在 HTML 网页码中编辑 JavaScript 的话,记得要先执行:ggbApplet = document.applets[0];
否则 ggbApplet 物件无法自行启动。
全域 JavaScript
在“属性”视窗的“全域 JavaScript”页面中, 你可以编写一些 JavaScript 函数或作一些全域变数设定,GeoGebra 会在载入物件前,先执行这里的程式码。 “全域 JavaScript”页面不特属于任何物件,所以不管你打开哪个物件的属性视窗,都会看到这个页面。
你也可以在这里面定义 ggbOnInit() 函数,此函数会在 GeoGebra 载入所有物件后马上执行,因此我们常在这个函数中放入一些物件的相关触发程序(JavaScript listeners),下面就是一个例子:
function ggbOnInit(){ // 當有物件新增(如新增一個點或一條線等)時,就會觸發 onAdd() 函數。 ggbApplet.registerAddListener("onAdd"); } function onAdd(objName){ alert("物件:"+objName+" 已新增!"); }
首先,我们在系统内定的 ggbOnInit() 函数中利用 registerAddListener() 函数指定了一个“新增物件”的触发程序,这行指令告诉系统:只要有物件新增了,就启动 onAdd() 函数,系统同时会将新增物件的名称丢给这个函数(也就是范例中的 objName,这个名称不是关键字,你也可以用 name、obj 或其他变数名称都可以),以方便后续的处理。
onAdd() 函数是使用者自订的,所以你也可以将函数名称改为 doSomething(),或其他名称。
当我们写好了这段程式,然后将档案存档再重新开启,系统就会载入 ggbOnInit() 函数。之后,假设我们新增了一点 A,onAdd() 函数就会执行,然后显示出“物件:A 已新增!”的讯息。除了指定“新增物件”的触发程序外,我们也可以指定诸如“改名”、“删除”、“清除全部物件”等等事件的触发程序,完整的说明请看这里。
全域 JavaScript(ggbOnInit 除外)⇨ 载入物件 ⇨ ggbOnInit() 函数
因此请勿在全域 JavaScript 中直接呼叫 ggbApplet 的物件方法,因为在 GeoGebra 尚未载入物件完成前,ggbApplet 物件根本就还没产生,所以也没办法呼叫它。
- 请看示范网页:ggbApplet 与 JavaScript 之间的互动。
以下为此网页的 JavaScript 程式部份:
<script type="text/javascript"> function ggbOnInit() { // 指定「新增物件、刪除物件、變更名稱、清除繪圖區、物件更新」等事件的觸發程序。 var applet = document.ggbApplet; applet.registerAddListener("addListener"); applet.registerRemoveListener("removeListener"); applet.registerRenameListener("renameListener"); applet.registerClearListener("clearListener"); applet.registerUpdateListener("updateListener"); } var strLength = 150; function addListener(objName) { document.listenerForm.textarea1.value = "add: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function removeListener(objName) { document.listenerForm.textarea1.value = "remove: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function renameListener(oldObjName, newObjName) { document.listenerForm.textarea1.value = "rename: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function updateListener(objName) { strVal = document.ggbApplet.getValueString(objName); document.listenerForm.textarea2.value = strVal + "\n" + document.listenerForm.textarea2.value.substring(0, strLength ); } function clearListener() { document.listenerForm.textarea1.value = ""; document.listenerForm.textarea2.value = ""; document.listenerForm.textarea1.value = "construction cleared"; document.listenerForm.consState.value = ""; } function printConstructionState() { var applet = document.ggbApplet; var objNumber = applet.getObjectNumber(); var strState = "Number of objects: " + objNumber; for (i=0; i < objNumber; i++) { strName = applet.getObjectName(i); strType = applet.getObjectType(strName); strCommand = applet.getCommandString(strName); strState += "\n" + strType + " " + strName + ", " + strCommand; } document.listenerForm.consState.value = strState; } </script>
USB Data Logging (From GeoGebra 4.2)
For logging data from some Vernier USB Data Loggers, eg Go!Motion and Go!Temp one can define a logger listener using the registerLoggerListener method. Such listener can look like this:
function logger(value) { var d = value * 1; ggbApplet.evalCommand("(CopyFreeObject[a],"+d+")"); ggbApplet.evalCommand("SetValue[a,a+1]"); }
This script assumes that there is a free number a in the construction. Each time number d is logged, point (a,d) is constructed and a is increased.