“編寫程式”的版本间的差异

来自GeoGebra Manual
跳转至: 导航搜索
 
(未显示同一用户的14个中间版本)
第1行: 第1行:
 
<noinclude>{{Manual Page|version=4.0}}</noinclude>{{objects|property}}
 
<noinclude>{{Manual Page|version=4.0}}</noinclude>{{objects|property}}
GeoGebra supports two scripting languages -- GGBScript and Javascript. Script is a sequence of actions which can be triggered by :
+
GeoGebra 支援兩種程式語言 - GGBScript Javascript 。我們可以在下列的事件中編寫相對的觸發程序:
* clicking or updating particular object
+
* 用滑鼠點選某物件時 (On Click)
* loading the file (in case of Javascript)
+
* 某物件數值或屬性變更時 (On Update, ...)
* Javascript listeners (see [[Reference:JavaScript]])
+
* 開啟 GeoGebra 檔案時 (ggbOnInit)
You can set this script via Scripting panel of [[Properties Dialog]].
+
* Javascript 觸發程序 (listener),詳情請參考 [[:en:Reference:JavaScript|JavaScript]]
 +
我們可以透過物件[[ 屬性]] 視窗中的「程式」頁面來編寫程式碼。
 +
[[File:ScriptingTab.png|thumb|屬性視窗的「程式」頁]]
 
==GGBScript==
 
==GGBScript==
You can create scripts consisting of GeoGebra commands.
+
GGBScript 主要是用 GeoGebra 本身的指令來編寫。
 
{{Example|1=<div>
 
{{Example|1=<div>
* ''a'' is an integer-valued [[Slider Tool|slider]] ranging from 1 to 3
+
* 假設 a 是一個範圍從 1 到 3 的[[ 數值與角度| 整數]]
* <code><nowiki>list1 = {"red", "green", "blue"}</nowiki></code>
+
* 在命令列中輸入以下的[[串列|集合]]:<br><code><nowiki>colors = {"red", "green", "blue"}</nowiki></code>
* in properties of ''a'', set "On Update" script to <code>SetColor[a, Element[list1, a]]</code>
+
* 進入 ''a'' 的[[屬性]]中的「程式」頁面,然後在「On Update 」頁面中輸入:<br><code>[[SetColor 指令|SetColor]][a, [[Element 指令|Element]][colors, a]]</code>
* by moving the slider you change its color</div>}}
+
* 最後,調整 a 值就可以改變它的[[:en:Reference:Colors|顏色]]。</div>}}
 +
{{Hint|有些指令只能用於 GGBScript 中,詳情請參閱:[[GGB 程式碼 指令|GGBScript 指令]]}}
 +
{{Hint|有關顏色的名稱與編碼,請參閱:[[:en:Reference:Colors|完整的顏色列表]]}}
 +
{{Youtube|title=以 SetColor 指令動態改變顏色|url=http://www.youtube.com/watch?v=xpV2L5CAtM8}}
  
 
==JavaScript==
 
==JavaScript==
JavaScript is a programming language used by many Internet technologies. Unlike GeoGebra Script, in Javascript the commands don't have to be executed as a simple sequence, but a control flow (<code>if</code>, <code>while</code>, <code>for</code>) can be used. For generic JavaScript you can find a nice tutorial on [https://developer.mozilla.org/en/JavaScript/Guide developer.mozilla.org]. In GeoGebra, you can use special JavaScript methods which allow you to change the construction. These methods belong to ggbApplet object, which means that you call them as <code>ggbApplet.method_name(parameter,..,parameter)</code>. For complete list of these methods see [[Reference:JavaScript]].
+
JavaScript  是一種常用於網頁中的程式語言。不像 GGBScript 只能依序執行一些 GeoGebra 指令而己,JavaScript 可以使用 {{key|if|blue}}、{{key|while|blue}}、{{key|for|blue}} 等關鍵字來控制程式的流程。
 +
{{Hint|若想進一步瞭解 JavaScript 的語法,請參閱 [https://developer.mozilla.org/en/JavaScript/Guide developer.mozilla.org] 。}}
 +
我們也可以使用一些特別的 JavaScript 函數來作圖,這些函數都是 {{key|ggbApplet}} 的物件方法,也就是說我們必須使用:<code>{{key|ggbApplet}}.method(a, b, ...)</code> 這樣的語法來呼叫這些函數才行。
 +
{{hint|詳細的函數說明,請參閱 [[:en:Reference:JavaScript|ggbApplet 物件方法]] 列表。}}
  
 
{{Example|1=
 
{{Example|1=
 +
<code>
 +
for(var i =0;i<10;i++) {{key|ggbApplet}}.[[:en:Reference:JavaScript#Available_Methods|evalCommand]]("A_"+i+"=(random()*10,random()*10)");
 +
</code>
 +
 +
這段程式會畫出 10 個點:''A<sub>0</sub>'' 到 ''A<sub>9</sub>'',其座標均由亂數產生。
 +
}}
 +
 +
GeoGebra 擁有自己的 JavaScript 編譯程式。當我們要將 GeoGebra [[匯出網頁]]時,我們可以選擇要使用 GeoGebra 自己的編譯程式還是瀏覽器的編譯程式。如果你直接在 HTML 網頁碼中編輯 JavaScript 的話,記得要先執行:<code>{{key|ggbApplet}} = document.applets[0];</code> 否則 {{key|ggbApplet}} 物件無法自行啟動。
 +
 +
===全域 JavaScript===
 +
[[File:GlobalJavascriptPanel.png|right]]在「[[屬性]]」視窗的「全域 JavaScript」頁面中, 你可以編寫一些 JavaScript 函數或作一些全域變數設定,GeoGebra 會在載入物件前,先執行這裡的程式碼。 「全域 JavaScript」頁面不特屬於任何物件,所以不管你打開哪個物件的屬性視窗,都會看到這個頁面。
 +
 +
 +
你也可以在這裡面定義 {{key|ggbOnInit}}() 函數,此函數會在 GeoGebra 載入所有物件後馬上執行,因此我們常在這個函數中放入一些物件的相關觸發程序(JavaScript listeners),下面就是一個例子:
 +
{{example|1=
 
<pre>
 
<pre>
for(var i =0;i<10;i++
+
function ggbOnInit(){
  ggbApplet.evalCommand("A_"+i+"=(random()*10,random()*10)");
+
   // 當有物件新增(如新增一個點或一條線等)時,就會觸發 onAdd() 函數。
 +
   ggbApplet.registerAddListener("onAdd");
 +
}
 +
 
 +
function onAdd(objName){
 +
   alert("物件:"+objName+" 已新增!");
 +
}
 
</pre>
 
</pre>
 +
首先,我們在系統內定的 {{key|ggbOnInit}}() 函數中利用 [[:en:Reference:JavaScript#GeoGebraApplet_to_JavaScript_Communication|registerAddListener]]() 函數指定了一個「新增物件」的觸發程序,這行指令告訴系統:只要有物件新增了,就啟動 onAdd() 函數,系統同時會將新增物件的名稱丟給這個函數(也就是範例中的 objName,這個名稱不是關鍵字,你也可以用 name、obj 或其他變數名稱都可以),以方便後續的處理。
  
This script creates 10 points ''A<sub>0</sub>'' to ''A<sub>9</sub>'' at random coordinates.
+
onAdd() 函數是使用者自訂的,所以你也可以將函數名稱改為 doSomething(),或其他名稱。
 +
 
 +
當我們寫好了這段程式,然後將檔案存檔再重新開啟,系統就會載入 {{key|ggbOnInit}}() 函數。之後,假設我們新增了一點 A ,onAdd() 函數就會執行,然後顯示出「物件:A 已新增!」的訊息。
 
}}
 
}}
  
GeoGebra contains its own JavaScript engine. When exported as [[Dynamic Worksheet]] one can choose whether to use this engine or the one contained in browser applets. If you edit JavaScript in a HTML page, the ggbApplet variable will not be initialized, you have to initialize it e.g. using <code>ggbApplet=document.applets[0];</code> first.
+
除了指定「新增物件」的觸發程序外,我們也可以指定諸如「改名」、「刪除」、「清除全部物件」等等事件的觸發程序,完整的說明請看[[:en:Reference:JavaScript#GeoGebraApplet_to_JavaScript_Communication|這裡]]
===Global JavaScript===
+
{{Hint|JavaScript 函數的啟動順序如下:
In the Global JavaScript part of Scripting tab in [[Properties Dialog]] you may define some functions or do some assignments that will be done before the construction is loaded. You can also define function ''ggbOnInit()'', which is called automatically once the construction is loaded. The ggbOnInit function can be used for registering some listeners, as shown below.{{example|1=
+
{{key|全域 JavaScript|red}}(ggbOnInit 除外)⇨ 載入物件 ⇨ {{key|ggbOnInit}}() 函數
 +
 
 +
因此請勿在全域 JavaScript 中直接呼叫 {{key|ggbApplet}} 的物件方法,因為在 GeoGebra 尚未載入物件完成前,{{key|ggbApplet}} 物件根本就還沒產生,所以也沒辦法呼叫它。}}
 +
 
 +
 
 +
{{example|1= 當 GeoGebra 中有物件新增、變更、或刪除時,將其狀態顯示於其他網頁元件上。
 +
* 請看示範網頁:[http://www.geogebra.org/source/program/applet/geogebra_applet_java2javascript.htm ggbApplet 與 JavaScript 之間的互動]。
 +
}}
 +
以下為此網頁的 JavaScript 程式部份:
 
<pre>
 
<pre>
function onAdd(name){
+
<script type="text/javascript">
   alert("Object "+name+" was added.");
+
 
 +
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 ggbOnInit(){
+
function updateListener(objName) {
   ggbApplet.registerAddListener("onAdd");
+
  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>
 
</pre>
 
</pre>
First we defined function ''onAdd'' that given a string shows a message depending on that string. After that, using the ''ggbOnInit'' function, we told GeoGebra to call this function whenever a new object is added. Once we reload our construction, function ggbOnInit will be called and since then, when user adds a point named e.g. ''A'', message "Object A was added" will appear. }}
 
  
You can also use listeners for actions like rename, delete and clear construction. Complete list is available in [[Reference:JavaScript]].
 
{{Note|Using any ggbApplet methods in Global JavaScript outside of ggbOnInit will not work as intended since they will be called before the construction is loaded.}}
 
 
===USB Data Logging (From GeoGebra 4.2)===
 
===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:
 
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:

2011年12月21日 (三) 15:57的最新版本

Accessories dictionary.png
本頁為官方文件,一般使用者無法修改,若有任何誤謬,請與官方聯絡。如欲編輯,請至本頁的開放版


GeoGebra 支援兩種程式語言 - GGBScript 和 Javascript。我們可以在下列的事件中編寫相對的觸發程序:

  • 用滑鼠點選某物件時 (On Click)
  • 某物件數值或屬性變更時 (On Update, ...)
  • 開啟 GeoGebra 檔案時 (ggbOnInit)
  • Javascript 觸發程序 (listener),詳情請參考 JavaScript

我們可以透過物件屬性視窗中的「程式」頁面來編寫程式碼。

屬性視窗的「程式」頁

GGBScript

GGBScript 主要是用 GeoGebra 本身的指令來編寫。

範例:
  • 假設 a 是一個範圍從 1 到 3 的整數
  • 在命令列中輸入以下的集合
    colors = {"red", "green", "blue"}
  • 進入 a屬性中的「程式」頁面,然後在「On Update」頁面中輸入:
    SetColor[a, Element[colors, a]]
  • 最後,調整 a 值就可以改變它的顏色
Note 提示: 有些指令只能用於 GGBScript 中,詳情請參閱:GGBScript 指令
Note 提示: 有關顏色的名稱與編碼,請參閱:完整的顏色列表

JavaScript

JavaScript 是一種常用於網頁中的程式語言。不像 GGBScript 只能依序執行一些 GeoGebra 指令而己,JavaScript 可以使用 ifwhilefor 等關鍵字來控制程式的流程。

Note 提示: 若想進一步瞭解 JavaScript 的語法,請參閱 developer.mozilla.org

我們也可以使用一些特別的 JavaScript 函數來作圖,這些函數都是 ggbApplet 的物件方法,也就是說我們必須使用:ggbApplet.method(a, b, ...)這樣的語法來呼叫這些函數才行。

Note 提示: 詳細的函數說明,請參閱 ggbApplet 物件方法列表。


範例:

for(var i =0;i<10;i++) ggbApplet.evalCommand("A_"+i+"=(random()*10,random()*10)");

這段程式會畫出 10 個點:A0A9,其座標均由亂數產生。

GeoGebra 擁有自己的 JavaScript 編譯程式。當我們要將 GeoGebra 匯出網頁時,我們可以選擇要使用 GeoGebra 自己的編譯程式還是瀏覽器的編譯程式。如果你直接在 HTML 網頁碼中編輯 JavaScript 的話,記得要先執行:ggbApplet = document.applets[0]; 否則 ggbApplet 物件無法自行啟動。

全域 JavaScript

GlobalJavascriptPanel.png

在「屬性」視窗的「全域 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 已新增!」的訊息。

除了指定「新增物件」的觸發程序外,我們也可以指定諸如「改名」、「刪除」、「清除全部物件」等等事件的觸發程序,完整的說明請看這裡

Note 提示: JavaScript 函數的啟動順序如下:

全域 JavaScript(ggbOnInit 除外)⇨ 載入物件 ⇨ ggbOnInit() 函數

因此請勿在全域 JavaScript 中直接呼叫 ggbApplet 的物件方法,因為在 GeoGebra 尚未載入物件完成前,ggbApplet 物件根本就還沒產生,所以也沒辦法呼叫它。


範例: 當 GeoGebra 中有物件新增、變更、或刪除時,將其狀態顯示於其他網頁元件上。

以下為此網頁的 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.

© 2024 International GeoGebra Institute