ブロック定義では、ブロックの見た目と動作を記述します。テキスト、テキスト、 色、形、他のどのブロックに接できるかなどを指定できます。
JSON 形式と JavaScript API
Blockly では、JSON オブジェクトと JavaScript 関数という 2 つの方法でブロックを定義できます。 JSON 形式は、ローカライズ版を簡単に 実装するためのプロセスを 単語の順序が異なる言語にも適しています。推奨される JSON 形式 ブロックを定義します。
ただし、JSON 形式では ミューテータやバリデータとしても使用できますこれらは JavaScript で記述する必要があります。通常は 拡張機能です。
Blockly のオリジナルの JavaScript 実装を使用しているアプリは、 ブロック定義を下位レベルの Blockly API 関数呼び出しに直接 実装しています。
JSON
Blockly.defineBlocksWithJsonArray([{
"type": "string_length",
"message0": 'length of %1',
"args0": [
{
"type": "input_value",
"name": "VALUE",
"check": "String"
}
],
"output": "Number",
"colour": 160,
"tooltip": "Returns number of letters in the provided text.",
"helpUrl": "http://www.w3schools.com/jsref/jsref_length_string.asp"
}]);
JavaScript
Blockly.Blocks['string_length'] = {
init: function() {
this.appendValueInput('VALUE')
.setCheck('String')
.appendField('length of');
this.setOutput(true, 'Number');
this.setColour(160);
this.setTooltip('Returns number of letters in the provided text.');
this.setHelpUrl('http://www.w3schools.com/jsref/jsref_length_string.asp');
}
};
init
関数は、ブロックのシェイプを作成します。このコンテキストでは、
キーワード this
は、作成される実際のブロックです。
どちらの例でも同じ 'string_length' が読み込まれます。ブロックします。
ウェブでは、initJson
関数を使用して JSON 形式を読み込みます。
また、Blockly のウェブページで 2 つの形式を混在させることもできます。内容
可能な限り JSON を使用してブロックを定義することをおすすめします。また、JavaScript を使用して
JSON でサポートされていないブロック定義の部分のみに対して行われます。
以下は、主に JSON を使用して定義されたブロックの例です。 動的なツールチップを表示するために JavaScript API を使用して拡張されています。
JavaScript
var mathChangeJson = {
"message0": "change %1 by %2",
"args0": [
{"type": "field_variable", "name": "VAR", "variable": "item", "variableTypes": [""]},
{"type": "input_value", "name": "DELTA", "check": "Number"}
],
"previousStatement": null,
"nextStatement": null,
"colour": 230
};
Blockly.Blocks['math_change'] = {
init: function() {
this.jsonInit(mathChangeJson);
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
return 'Add a number to variable "%1".'.replace('%1',
thisBlock.getFieldValue('VAR'));
});
}
};
ブロックの色
ブロックのメインの色は、JSON の colour
プロパティによって定義されます。
block.setColour(..)
関数を使用すると、
テーマを使用し、ブロックを定義することで、
。
JSON
{
// ...,
"colour": 160,
}
JavaScript
init: function() {
// ...
this.setColour(160);
}
ブロックの色のガイドをご覧ください。 をご覧ください。
ステートメントの接続
ユーザーは、nextStatement
を使用してブロックのシーケンスを作成できます。
previousStatement
コネクタ。Blockly の標準レイアウトでは
ブロックが縦に積み重ねられて、上下に配置されています。
以前のコネクタが使用されているブロックに 出力コネクタを切り替えることができます。その逆も同様です。ステートメント ブロックという用語 値出力のないブロックを参照しています。通常、ステートメントブロックは 前の接続と次の接続の両方の履歴を確認できます。
nextStatement
接続と previousStatement
接続は、
typed、
この機能は標準のブロックでは使用されません。
次の接続
ブロックの下部にポイントを作成し、他のステートメントを その下に重ねて表示されます。次の接続があるが、前の接続がないブロック 通常はイベントを表します。このイベントを使ってレンダリングするよう 帽子。
JSON
型指定なし:
{
...,
"nextStatement": null,
}
タイプ済み(まれ):
{
"nextStatement": "Action",
...
}
JavaScript
型指定なし:
this.setNextStatement(true); // false implies no next connector, the default
タイプ済み(まれ):
this.setNextStatement(true, 'Action');
前の接続
ブロックの上部にノッチを作り、スタックとして接続できるようにする 記述できます。
以前の接続があるブロックに出力接続を設定することはできません。
JSON
型指定なし:
{
...,
"previousStatement": null,
}
タイプ済み(まれ):
{
"previousStatement": "Action",
...
}
JavaScript
型指定なし:
this.setPreviousStatement(true); // false implies no previous connector, the default
タイプ済み(まれ):
this.setPreviousStatement(true, 'Action');
出力のブロック
ブロックには単一の出力があり、 実現しています。出力は値の入力に接続します。出力を持つブロックは、 値ブロックと呼ばれます。
JSON
型指定なし:
{
// ...,
"output": null,
}
型指定済み:
{
// ...,
"output": "Number",
}
JavaScript
型指定なし:
init: function() {
// ...
this.setOutput(true);
}
型指定済み:
init: function() {
// ...
this.setOutput(true, 'Number');
}
出力コネクタを持つブロックに、それ以前のステートメントのノッチを設定することはできません。
入力をブロック
ブロックには 1 つ以上の入力があり、各入力には フィールドがあり、接続で終わる場合があります。Google の各種プロダクトには、 種類も豊富です
- 値の入力: アプリケーションの出力接続
value ブロック。
math_arithmetic
ブロック(加算、減算)は、 2 つの値入力を持つブロックの例を示しています。 - ステートメント入力: ステートメント ブロックの前の接続。「 while ループのネストされたセクションは、ステートメント入力の例です。
- ダミー入力: ブロック接続がありません。次の場合に改行として機能します。 外部値入力を使用するようにブロックが構成されています。
- 行末入力: ブロック接続がなく、常に 改行します。
JSON 形式と JavaScript API では、記述方法に若干異なるモデルが使用されます。 できます。
JSON の入力とフィールド
JSON で定義されたブロックは、補間されたシーケンスとして構造化される
メッセージ文字列(message0
、message1
、...)。各補間トークンは、
(%1
, %2
, ...) はフィールドまたは入力端です(したがって、入力コネクタは
(メッセージ内で)を、一致する JSON argsN
配列にレンダリングします。この形式は
多言語対応を容易にすることを目的としています。
JSON
{
"message0": "set %1 to %2",
"args0": [
{
"type": "field_variable",
"name": "VAR",
"variable": "item",
"variableTypes": [""]
},
{
"type": "input_value",
"name": "VALUE"
}
]
}
補間トークンは args0
配列と完全に一致している必要があります。重複なし。
欠かせません。トークンは任意の順序で存在する可能性があるため、異なる
ブロックのレイアウトを変更できます。
補間トークンの両側のテキストは空白文字が削除されます。
文字「%
」を使用するテキスト(割合を参照する場合など)では、
%%
に変換し、補間トークンとして解釈されないようにします。
引数の順序と引数の型によって、引数の形状が
ブロックします。これらの文字列のいずれかを変更すると、ブロックのレイアウトを完全に変更される可能性があります。
これは、語順が異なる言語において特に重要です。
表示されます。"set %1 to %2"
(
)を反転して "put %2 in %1"
とする必要があります。変更中
(残りの JSON はそのままにします)
次のブロックが作成されます。
Blockly はフィールドの順序を自動的に変更し、ダミー入力を作成しました。 外部入力から内部入力に切り替えられます。
Blockly ではメッセージ内の改行文字(\n
)も自動的に置き換えられます
します。
JSON
{
"message0": "set %1\nto %2",
"args0": [
{
"type": "field_variable",
"name": "VAR",
"variable": "item",
"variableTypes": [""]
},
{
"type": "input_value",
"name": "VALUE"
}
]
}
Args
各メッセージ文字列は、同じ番号の args
配列とペアになります。対象
たとえば、message0
は args0
と一致します。interpolation トークンは、
(%1
、%2
、...)は、args
配列の項目を参照します。すべてのオブジェクトには
type
文字列。残りのパラメータはタイプによって異なります。
- フィールド: <ph type="x-smartling-placeholder">
- 入力:
<ph type="x-smartling-placeholder">
- </ph>
input_value
input_statement
input_dummy
input_end_row
独自のカスタム フィールドを定義することもできます。 カスタム入力を作成し、引数として渡します。
すべてのオブジェクトに alt
フィールドを含めることもできます。Blockly が同期しないという
オブジェクトの type
が認識されると、代わりに alt
オブジェクトが使用されます。対象
たとえば、field_time
という名前の新しいフィールドが Blockly に追加された場合、
このフィールドで alt
を使用して、古いバージョンの field_input
フォールバックを定義できます
Blockly:
JSON
{
"message0": "sound alarm at %1",
"args0": [
{
"type": "field_time",
"name": "TEMPO",
"hour": 9,
"minutes": 0,
"alt":
{
"type": "field_input",
"name": "TEMPOTEXT",
"text": "9:00"
}
}
]
}
alt
オブジェクトは、独自の alt
オブジェクトを持つことができるため、チェーン化が可能になります。
最終的に、Blockly が args0
配列にオブジェクトを作成できない場合(
そのオブジェクトは単にスキップされます。alt
ブロックの最後にダミー入力が自動的に追加されます。
message
文字列が、入力に含まれていないテキストまたはフィールドで終わる。
したがって、ブロックの最後の入力がダミー入力である場合、
args
配列であり、message
への補間は必要ありません。「
テーリングダミー入力の自動追加により
message
です。JSON の残りの部分を変更する必要はありません。こちらの例をご覧ください。
"set %1 to %2"
(ダミー入力なし)と "put %2 in %1"
(ダミー入力が追加されている)
このページの前のセクションで
説明しました
implicitAlign0
まれに、自動作成された後置ダミー入力をアライメントする必要が
"RIGHT"
または "CENTRE"
に追加します。指定しない場合のデフォルトは "LEFT"
です。
以下の例では、message0
は "send email to %1 subject %2 secure %3"
です。
Blockly は 3 行目にダミー入力を自動的に追加します。設定
implicitAlign0
から "RIGHT"
にすると、この行は強制的に右揃えになります。この
アライメントは、JSON で明示的に定義されていないすべての入力に適用されます。
ブロック定義(改行文字を置き換える行末の入力など)
('\n'
)が含まれている。非推奨のプロパティ lastDummyAlign0
もあります。
implicitAlign0
と同じ動作をします。
RTL(アラビア語とヘブライ語)のブロックを設計する場合は、左右が逆になります。
したがって、"RIGHT"
はフィールドを左揃えにします。
message1
、args1
、implicitAlign1
一部のブロックは、自然に 2 つ以上の独立した部分に分割されます。 次の 2 つの行を持つ繰り返しブロックを考えてみます。
このブロックが 1 つのメッセージで記述されている場合、message0
プロパティは
"repeat %1 times %2 do %3"
になります。この文字列は翻訳者には不自然です。
%2
の置換の意味を説明するのは困難です。%2
ダミー
入力が望ましくない場合があります。場合によっては複数の
ブロックの 2 番目の行のテキストを共有します。適切なアプローチ
JSON で複数の message と args プロパティを使用します。
JSON
{
"type": "controls_repeat_ext",
"message0": "repeat %1 times",
"args0": [
{"type": "input_value", "name": "TIMES", "check": "Number"}
],
"message1": "do %1",
"args1": [
{"type": "input_statement", "name": "DO"}
],
"previousStatement": null,
"nextStatement": null,
"colour": 120
}
任意の数の message
、args
、implicitAlign
プロパティを定義できます。
0 から始まり、連続的に増加します。注:
ブロック ファクトリではメッセージを複数の部分に分割することはできませんが、
手動で行うのは簡単です。
JavaScript の入力とフィールド
JavaScript API には、入力タイプごとに append
メソッドが含まれています。
JavaScript
this.appendEndRowInput()
.appendField('for each')
.appendField('item')
.appendField(new Blockly.FieldVariable());
this.appendValueInput('LIST')
.setCheck('Array')
.setAlign(Blockly.inputs.Align.RIGHT)
.appendField('in list');
this.appendStatementInput('DO')
.appendField('do');
this.appendDummyInput()
.appendField('end');
各追記メソッドには、コード生成ツールで使用される識別子文字列を指定できます。ダミー 末尾行の入力を参照する必要はほとんどなく、通常は識別子が残ります。 未設定の場合。
JavaScript API には、データを追加するための汎用の appendInput
メソッドも含まれています。
カスタム入力。なお、この場合、識別子を
カスタム入力のコンストラクタに直接渡すことができます。
JavaScript
this.appendInput(new MyCustomInput('INPUT_NAME'))
.appendField('an example label')
すべての appendInput
メソッド(汎用と非汎用の両方)は、
メソッド チェーンを使用してさらに構成できるようにします。そこで、
入力を構成するために使用する組み込みメソッドが 3 つあります。
setCheck
JavaScript
input.setCheck('Number');
このオプションの関数は、接続された入力の型チェックに使用します。指定した場合 null(デフォルト)の場合、この入力は任意のブロックに接続できます。 詳細については、型チェックをご覧ください。
setAlign
JavaScript
input.setAlign(Blockly.inputs.Align.RIGHT);
このオプションの関数は、フィールドの位置揃えに使用します(下記参照)。3 つの
この関数に引数として渡すことができる自己記述的値:
Blockly.inputs.Align.LEFT
、Blockly.inputs.Align.RIGHT
、
Blockly.inputs.Align.CENTER
。
RTL(アラビア語とヘブライ語)のブロックを設計する場合は、左右が逆になります。
したがって、Blockly.inputs.Align.RIGHT
はフィールドを左揃えにします。
appendField
入力が作成され、appendInput
でブロックに追加されると、
必要に応じて任意の数の fields を入力に追加できます。これらのフィールドは
各入力の用途を説明するラベルとしてよく使用されます。
JavaScript
input.appendField('hello');
最もシンプルなフィールド要素はテキストです。Blockly の慣例では 小文字のテキスト。適切な名前(Google、SQL など)を除きます。
入力行には、任意の数のフィールド要素を含めることができます。複数の appendField
呼び出しを連結して、複数のフィールドを同じテーブルに効率的に追加できる
表示されます。
JavaScript
input.appendField('hello')
.appendField(new Blockly.FieldLabel('Neil', 'person'));
appendField('hello')
呼び出しは、実際には明示的な
FieldLabel コンストラクタ: appendField(new Blockly.FieldLabel('hello'))
コンストラクタは、
クラス名を指定してテキストのスタイルを設定できるようにしました。
インラインと外部
ブロック入力は、外部または内部としてレンダリングできます。
ブロック定義では、入力の有無を制御するブール値(省略可)を指定できます。
わかります。false
の場合、値の入力はすべて外部になります(
あります。true
の場合、値の入力はすべてインラインになります(
ご覧ください。
JSON
{
// ...,
"inputsInline": true
}
JavaScript
init: function() {
// ...
this.setInputsInline(true);
}
定義されていない場合、Blockly はいくつかのヒューリスティックを使用して、
最適ですBlockly が正しい選択をしていると仮定し、このフィールドは未定義のままにする
異なる言語の翻訳を自動的に生成できるため、この方法が推奨されます。
あります。"set %1 to %2"
(外部入力)の JSON の例と、
"put %2 in %1"
(インライン入力)については、このページの前半で説明します。
ブロックに数値などの小さな入力が含まれる可能性がある場合は、インライン入力を使用します。
collapse
の場合、ユーザーはコンテキスト メニューからこのオプションを切り替えることができます。
有効(ツールボックスにカテゴリがある場合はデフォルトで true)になります。
フィールド
フィールドでは、ブロック内の大半の UI 要素を定義します。たとえば、
入力テキスト、ラベル、画像、入力を
リテラル データ
文字列や数値などです。最も単純な例は math_number
ブロックです。
これは、field_input
を使用してユーザーが数値を入力できるようにします。
フィールドは、次を使用してブロックに追加されます。 appendField.
Blockly は、テキスト入力、カラー選択ツール、テキスト入力、 説明します。独自のフィールドを作成することもできます。
→ 組み込みフィールドの詳細をご覧ください。
→ カスタム フィールドの作成についての詳細
アイコン
アイコンは、「メタ」を表示するブロック上の UI 要素を定義しますChronicle の ブロックします。
アイコンは、addIcon を使用してブロックに追加されます。
Blockly には、コメント アイコンを含む多くの組み込みアイコンが用意されています 警告アイコンが表示されます。独自のアイコンを作成することもできます。
→ カスタム アイコンの作成についての詳細をご覧ください。
ツールチップ
ユーザーがブロックにカーソルを合わせると、ツールチップが表示され、すぐにヘルプが表示されます。 テキストが長い場合は、自動的に折り返します。
JSON
{
// ...,
"tooltip": "Tooltip text."
}
JavaScript
init: function() {
this.setTooltip("Tooltip text.");
}
JavaScript API では、ツールチップを
静的文字列です。これにより、動的なヘルプが可能になります。math_arithmetic
を
プルダウン オプションに応じて変わるツールチップの例
選択します。
JavaScript
Blockly.Blocks['math_arithmetic'] = {
init: function() {
// ...
// Assign 'this' to a variable for use in the tooltip closure below.
var thisBlock = this;
this.setTooltip(function() {
var mode = thisBlock.getFieldValue('OP');
var TOOLTIPS = {
'ADD': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_ADD,
'MINUS': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MINUS,
'MULTIPLY': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_MULTIPLY,
'DIVIDE': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_DIVIDE,
'POWER': Blockly.Msg.MATH_ARITHMETIC_TOOLTIP_POWER
};
return TOOLTIPS[mode];
});
}
};
JavaScript API を使用すると、ブロックで静的な値ではなく関数を指定できます。
ツールチップの文字列を返します。これにより、動的なツールチップが可能になります。
例については、math_arithmetic
をご覧ください。
カスタマイズ
カスタム レンダリングを用意してツールチップのデザインをカスタマイズすることもできます。 使用します。2 つのパラメータを受け入れる関数を作成します。
- 1 つ目は、コンテンツをレンダリングする
<div>
要素です。 - 2 つ目はマウスオーバー中の実際の要素で 次のツールチップは
関数の本体では、任意のコンテンツを関数内にレンダリングできます。
項目マウスオーバーしているブロックで定義されているツールチップの文字列を取得するには、
Blockly.Tooltip.getTooltipOfObject(element);
を呼び出します。ここで、element
は
使用します。
最後に、この関数を登録して、Blockly が適切なタイミングで関数を呼び出せるようにします。
Blockly.Tooltip.setCustomTooltip(yourFnHere);
例については、 カスタム ツールチップのデモ。
ヘルプの URL
ブロックには、関連するヘルプページを設定できます。これは
ブロックを右クリックして [ヘルプ] を選択し、Blockly for Web のユーザーには
選択できます。この値が null
の場合、メニューはグレー表示されます。
できます。
JSON
{
// ...,
"helpUrl": "https://en.wikipedia.org/wiki/For_loop"
}
JavaScript
init: function() {
// ...
this.setHelpUrl('https://en.wikipedia.org/wiki/For_loop');
}
JavaScript API を使用すると、ブロックで静的な値ではなく関数を指定できます。 string は URL 文字列を返し、動的なヘルプを可能にします。
リスナーと検証ツールを変更する
ブロックには、変更時に呼び出される変更リスナー関数を設定できます。 (ブロックに関係のないものを含む)。これらは主に ブロックの警告テキストや同様のユーザー通知を できます。
関数で setOnChange を呼び出すことで関数が追加されます。 JSON 拡張機能を使用する予定の場合は init の実行時に呼び出すか、 サポートしています。
JSON
{
// ...,
"extensions":["warning_on_change"],
}
Blockly.Extensions.register('warning_on_change', function() {
// Example validation upon block change:
this.setOnChange(function(changeEvent) {
if (this.getInput('NUM').connection.targetBlock()) {
this.setWarningText(null);
} else {
this.setWarningText('Must have an input block.');
}
});
});
JavaScript
Blockly.Blocks['block_type'] = {
init: function() {
// Example validation upon block change:
this.setOnChange(function(changeEvent) {
if (this.getInput('NUM').connection.targetBlock()) {
this.setWarningText(null);
} else {
this.setWarningText('Must have an input block.');
}
});
}
}
システムが関数を呼び出し、
変更イベント。
関数内で、this
はブロック インスタンスを参照します。
この関数は変更のたびに呼び出されるため、使用する場合、デベロッパーは リスナーはすぐに実行されます。ワークスペースの変更にも注意する必要があります。 カスケードまたはループバックする場合があります
controls_flow_statements
、logic_compare
、procedures_ifreturn
を参照
ご覧ください。
編集可能なフィールドには、入力検証用の独自のイベント リスナーがあることに注意してください。 副作用を引き起こします
ミューテーター
ミューテータを使用すると、高度なブロックの形状を変化させることができます。
ユーザーがコンポーネントの追加、削除、並べ替えを行うダイアログを開く。ミューテータは
mutator
キーを使用して JSON で追加します。
JSON
{
// ...,
"mutator":"if_else_mutator"
}
ブロックごとの構成
ブロック インスタンスには、インスタンスの動作を設定するさまざまなプロパティがあります。 できます。これらを使用して、特定のプロパティを反映するようにワークスペースを制約できます。 (例: 「開始」イベントが 1 つしかないなど)、またはフォーカス ユーザーの労力によって実現されます(チュートリアルなど)。
削除可能な状態
block.setDeletable(false);
false に設定した場合、ユーザーはブロックを削除できません。デフォルトでブロック 編集可能なワークスペースで削除できます。
すべてのブロック(削除できないブロックも含む)をプログラムで削除できます。
block.dispose();
編集可能な状態
block.setEditable(false);
false に設定した場合、ユーザーはブロックのフィールドを変更できません。 (プルダウン、テキスト入力など)。編集可能なコンポーネントでは、ブロックはデフォルトで編集可能 できます。
移動可能な状態
block.setMovable(false);
false に設定した場合、ユーザーはブロックを直接移動できません。「 移動できないブロックが、別のブロックの子である場合、そのブロックと ただし、親が移動されると親と一緒に移動します。ブロック デフォルトでは編集可能なワークスペースでは移動可能です
どのブロックも(移動できないものであっても)、 できます。
block.moveBy(dx, dy)
ワークスペース上のブロックの開始位置は、デフォルトで (0, 0) になります。
データをブロック
this.data = '16dcb3a4-bd39-11e4-8dfc-aa07a5b093db';
data は、ブロックに添付される任意の文字列です。Google データ文字列もシリアル化されます。これには、 ブロックを複製するか、コピー&ペーストされます。
多くの場合、これはブロックを外部リソースに関連付けるために使用されます。
JSON にシリアル化すると、データはブロック内の最上位プロパティとして保存されます。
{
"type": "my_block",
"data": "16dcb3a4-bd39-11e4-8dfc-aa07a5b093db",
// etc..
}
XML(古いアイスボックス型シリアル化システム)にシリアル化すると、データ文字列
ブロック内の <data></data>
タグに格納されます。
<block type="my_block">
<data>16dcb3a4-bd39-11e4-8dfc-aa07a5b093db</data>
<!-- etc... -->
</block>
破壊
ブロックには destroy
フックがあります。このフックは、ブロックが削除されるときに呼び出されます。
できます。これにより、バッキング データモデルや外部
ブロックに関連付けられたリソースが除外されます。
JSON
{
// ...,
"extensions":["destroy"],
}
Blockly.Extensions.registerMixin('destroy', {
destroy: function() {
this.myResource.dispose();
}
});
JavaScript
Blockly.Blocks['block_type'] = {
destroy: function() {
this.myResource.dispose();
}
}
destroy
メソッドは、ブロックの親が破棄された後に呼び出されますが、
破棄される前に示されます。
コンテキストメニュー
ブロックのコンテキスト メニューではデフォルトで、ユーザーは コメントの追加、ブロックの重複などができます。
個々のブロックのコンテキスト メニューを無効にするには、次のコマンドを実行します。
block.contextMenu = false;
メニューに表示されるオプションをカスタマイズすることもできます。Google Chat のメニューをカスタマイズするには、
詳細は、このモジュールの
コンテキスト メニューのドキュメントをご覧ください。
個々のブロックのメニューをカスタマイズするには、
customContextMenu
。この関数はメニュー オプションの配列と
によってその場で修正されるため、ユーザーはアイテムの追加と削除の両方を行うことができます。
各メニュー オプションは、次の 3 つのプロパティを持つオブジェクトです。
text
は表示テキストです。enabled
はブール値です。無効にするとオプションが表示されますが、グレー表示になります。 あります。callback
は、オプションがクリックされたときに呼び出される関数です。