กิจกรรม
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
เหตุการณ์จะทริกเกอร์เมื่อผู้ใช้โต้ตอบกับวิดเจ็ตหรือการเปลี่ยนแปลงแบบเป็นโปรแกรมในวิดเจ็ต หากต้องการดำเนินการเมื่อเกิดเหตุการณ์ ให้ลงทะเบียนฟังก์ชันการเรียกกลับในวิดเจ็ตด้วย onClick()
(สําหรับ ui.Map
หรือ ui.Button
) หรือ onChange()
(สําหรับรายการอื่นๆ ทั้งหมด) นอกจากนี้ คุณยังระบุการเรียกกลับในคอนสตรัคเตอร์ได้ด้วย พารามิเตอร์สําหรับการเรียกเหตุการณ์กลับจะแตกต่างกันไปโดยขึ้นอยู่กับวิดเจ็ตและประเภทเหตุการณ์ เช่น ui.Textbox
จะส่งค่าสตริงที่ป้อนในปัจจุบันไปยังฟังก์ชัน Callback ของเหตุการณ์ "คลิก" ตรวจสอบข้อมูลอ้างอิง API ในแท็บเอกสารเพื่อดูประเภทพารามิเตอร์ที่ส่งไปยังฟังก์ชันการเรียกกลับของวิดเจ็ตแต่ละรายการ
ตัวอย่างต่อไปนี้แสดงเหตุการณ์หลายรายการที่มาจากการกระทำของผู้ใช้รายเดียวในการระบุรูปภาพที่จะแสดง เมื่อผู้ใช้เลือกรูปภาพ วิดเจ็ต "เลือก" อีกรายการหนึ่งจะอัปเดตด้วยย่านของรูปภาพและแสดงย่านแรกในแผนที่
เครื่องมือแก้ไขโค้ด (JavaScript)
// Load some images.
var dem = ee.Image('NASA/NASADEM_HGT/001');
var veg = ee.Image('NOAA/VIIRS/001/VNP13A1/2022_06_02')
.select(['EVI', 'EVI2', 'NDVI']);
// Make a drop-down menu of bands.
var bandSelect = ui.Select({
placeholder: 'Select a band...',
onChange: function(value) {
var layer = ui.Map.Layer(imageSelect.getValue().select(value));
// Use set() instead of add() so the previous layer (if any) is overwritten.
Map.layers().set(0, layer);
}
});
// Make a drop down menu of images.
var imageSelect = ui.Select({
items: [
{label: 'NASADEM', value: dem},
{label: 'VIIRS Veg', value: veg}
],
placeholder: 'Select an image...',
onChange: function(value) {
// Asynchronously get the list of band names.
value.bandNames().evaluate(function(bands) {
// Display the bands of the selected image.
bandSelect.items().reset(bands);
// Set the first band to the selected band.
bandSelect.setValue(bandSelect.items().get(0));
});
}
});
print(imageSelect);
print(bandSelect);
โปรดทราบว่าเมื่อผู้ใช้เลือกรูปภาพ ระบบจะโหลดรายการชื่อแบนด์ของรูปภาพลงในวิดเจ็ต bandSelect
โดยตั้งค่าแบนด์แรกเป็นค่าปัจจุบัน และเรียกใช้ฟังก์ชัน onChange
ของ bandSelect
โดยอัตโนมัติ และโปรดสังเกตการใช้ evaluate()
เพื่อรับค่า ComputedObject
ที่ bandNames()
แสดงผลแบบไม่พร้อมกัน ดูข้อมูลเพิ่มเติมได้ในส่วนเหตุการณ์แบบไม่พร้อมกัน
ยกเลิกการฟัง
เมธอด unlisten()
ช่วยให้คุณนําฟังก์ชัน Callback ที่ลงทะเบียนในวิดเจ็ตออกได้ ซึ่งมีประโยชน์ในการป้องกันการทริกเกอร์เหตุการณ์ที่ควรเกิดขึ้นเพียงครั้งเดียวหรือในบางสถานการณ์เท่านั้น ค่าที่แสดงผลของ onClick()
หรือ onChange()
คือรหัสที่ส่งไปยัง unlisten()
ได้เพื่อให้วิดเจ็ตหยุดเรียกใช้ฟังก์ชัน หากต้องการยกเลิกการลงทะเบียนเหตุการณ์ทั้งหมดหรือเหตุการณ์ของประเภทที่เฉพาะเจาะจง ให้เรียกใช้ unlisten()
โดยไม่มีอาร์กิวเมนต์หรืออาร์กิวเมนต์ประเภทเหตุการณ์ (เช่น 'click'
หรือ 'change'
) ตามลำดับ ตัวอย่างต่อไปนี้แสดง unlisten()
เพื่ออำนวยความสะดวกในการเปิดและปิดแผง
เครื่องมือแก้ไขโค้ด (JavaScript)
// Create a panel, initially hidden.
var panel = ui.Panel({
style: {
width: '400px',
shown: false
},
widgets: [
ui.Label('Click on the map to collapse the settings panel.')
]
});
// Create a button to unhide the panel.
var button = ui.Button({
label: 'Open settings',
onClick: function() {
// Hide the button.
button.style().set('shown', false);
// Display the panel.
panel.style().set('shown', true);
// Temporarily make a map click hide the panel
// and show the button.
var listenerId = Map.onClick(function() {
panel.style().set('shown', false);
button.style().set('shown', true);
// Once the panel is hidden, the map should not
// try to close it by listening for clicks.
Map.unlisten(listenerId);
});
}
});
// Add the button to the map and the panel to root.
Map.add(button);
ui.root.insert(0, panel);
โปรดทราบว่า unlisten()
ใช้เพื่อหยุด Map
ไม่ให้ฟังเหตุการณ์การคลิกเพื่อปิดแผงเมื่อแผงปิดอยู่แล้ว
เหตุการณ์อะซิงโครนัส
หากใช้ผลลัพธ์ของ Earth Engine (เช่น เอาต์พุตตัวเลขจากการลดขนาด) ในวิดเจ็ต คุณจะต้องรับค่าจากเซิร์ฟเวอร์ (ดูรายละเอียดเกี่ยวกับไคลเอ็นต์กับเซิร์ฟเวอร์ใน Earth Engine ได้ที่หน้านี้) หากไม่ต้องการให้ UI ทั้งหมดค้างขณะที่คำนวณค่านั้น คุณสามารถใช้ฟังก์ชัน evaluate()
เพื่อรับค่าแบบไม่พร้อมกันได้ ฟังก์ชัน evaluate()
จะเริ่มต้นคําขอค่า และเมื่อค่าพร้อมแล้ว ก็จะเรียกฟังก์ชัน Callback เพื่อทำบางอย่างกับผลลัพธ์ ตัวอย่างเช่น ลองพิจารณาแอปพลิเคชันเพื่อหาค่าเฉลี่ยของอนุกรมเวลา NDVI ณ จุดหนึ่ง
เครื่องมือแก้ไขโค้ด (JavaScript)
// Load and display an NDVI image.
var ndvi = ee.ImageCollection('LANDSAT/COMPOSITES/C02/T1_L2_8DAY_NDVI')
.filterDate('2014-01-01', '2015-01-01');
var vis = {min: 0, max: 1, palette: ['99c199', '006400']};
Map.addLayer(ndvi.median(), vis, 'NDVI');
// Configure the map.
Map.setCenter(-94.84497, 39.01918, 8);
Map.style().set('cursor', 'crosshair');
// Create a panel and add it to the map.
var inspector = ui.Panel([ui.Label('Click to get mean NDVI')]);
Map.add(inspector);
Map.onClick(function(coords) {
// Show the loading label.
inspector.widgets().set(0, ui.Label({
value: 'Loading...',
style: {color: 'gray'}
}));
// Determine the mean NDVI, a long-running server operation.
var point = ee.Geometry.Point(coords.lon, coords.lat);
var meanNdvi = ndvi.reduce('mean');
var sample = meanNdvi.sample(point, 30);
var computedValue = sample.first().get('NDVI_mean');
// Request the value from the server.
computedValue.evaluate(function(result) {
// When the server returns the value, show it.
inspector.widgets().set(0, ui.Label({
value: 'Mean NDVI: ' + result.toFixed(2),
}));
});
});
เมื่อผู้ใช้คลิกจุดบนแผนที่นี้ ระบบจะเรียกใช้reduceRegion()
ในเซิร์ฟเวอร์ การดำเนินการนี้อาจใช้เวลาสักครู่ ตัวอย่างนี้จะลงทะเบียนฟังก์ชันการเรียกกลับไปยังผลลัพธ์โดยเฉพาะ computedValue.evaluate()
เพื่อไม่ให้แอปพลิเคชันบล็อกขณะที่ Earth Engine กำลังประมวลผล เมื่อการคํานวณเสร็จสิ้นแล้ว ระบบจะแสดงผลลัพธ์ ในระหว่างนี้ ระบบจะแสดงข้อความเพื่อบ่งบอกว่ากำลังประมวลผล
เนื้อหาของหน้าเว็บนี้ได้รับอนุญาตภายใต้ใบอนุญาตที่ต้องระบุที่มาของครีเอทีฟคอมมอนส์ 4.0 และตัวอย่างโค้ดได้รับอนุญาตภายใต้ใบอนุญาต Apache 2.0 เว้นแต่จะระบุไว้เป็นอย่างอื่น โปรดดูรายละเอียดที่นโยบายเว็บไซต์ Google Developers Java เป็นเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-25 UTC
[null,null,["อัปเดตล่าสุด 2025-07-25 UTC"],[[["\u003cp\u003eEvents in the Earth Engine Code Editor are triggered by user interactions or programmatic changes to widgets, allowing you to execute specific actions in response.\u003c/p\u003e\n"],["\u003cp\u003eRegister callback functions to widgets using \u003ccode\u003eonClick()\u003c/code\u003e for ui.Map or ui.Button interactions and \u003ccode\u003eonChange()\u003c/code\u003e for other widgets to define actions upon event occurrence.\u003c/p\u003e\n"],["\u003cp\u003eUtilize \u003ccode\u003eunlisten()\u003c/code\u003e to remove registered callback functions, preventing events from triggering when no longer necessary, as demonstrated in the panel open/close example.\u003c/p\u003e\n"],["\u003cp\u003eFor operations involving Earth Engine results that require server-side computation, employ \u003ccode\u003eevaluate()\u003c/code\u003e to asynchronously retrieve values, ensuring a smooth user experience while preventing UI blocking.\u003c/p\u003e\n"]]],[],null,["# Events are fired by user interaction with a widget or a programmatic change to a\nwidget. To do something when the event occurs, register a callback function on the\nwidget with either `onClick()` (for `ui.Map` or\n`ui.Button`) or `onChange()` (everything else). You can also\nspecify a callback in the constructor. The parameters to event callbacks vary\ndepending on the widget and event type. For example, a `ui.Textbox` passes\nthe currently entered string value to its 'click' event callback functions. Check\nthe API reference in the **Docs** tab for the type of parameter passed to\nthe callback functions of each widget.\n\nThe following example demonstrates multiple events originating from a single user\naction of specifying an image to display. When the user selects an image, another\nselect widget is updated with the bands of the image and displays the first band\nin the map:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load some images.\nvar dem = ee.Image('NASA/NASADEM_HGT/001');\nvar veg = ee.Image('NOAA/VIIRS/001/VNP13A1/2022_06_02')\n .select(['EVI', 'EVI2', 'NDVI']);\n\n// Make a drop-down menu of bands.\nvar bandSelect = ui.Select({\n placeholder: 'Select a band...',\n onChange: function(value) {\n var layer = ui.Map.Layer(imageSelect.getValue().select(value));\n // Use set() instead of add() so the previous layer (if any) is overwritten.\n Map.layers().set(0, layer);\n }\n});\n\n// Make a drop down menu of images.\nvar imageSelect = ui.Select({\n items: [\n {label: 'NASADEM', value: dem},\n {label: 'VIIRS Veg', value: veg}\n ],\n placeholder: 'Select an image...',\n onChange: function(value) {\n // Asynchronously get the list of band names.\n value.bandNames().evaluate(function(bands) {\n // Display the bands of the selected image.\n bandSelect.items().reset(bands);\n // Set the first band to the selected band.\n bandSelect.setValue(bandSelect.items().get(0));\n });\n }\n});\n\nprint(imageSelect);\nprint(bandSelect);\n```\n\nNote that when the user selects an image, the list of the image's band names is loaded\ninto the `bandSelect` widget, the first band is set to the current value,\nand the `onChange` function of `bandSelect` is fired\nautomatically. Also note the use of `evaluate()` to asynchronously get the\nvalue of the `ComputedObject` returned by `bandNames()`. Learn\nmore in the [Asynchronous Events section](/earth-engine/guides/ui_events#asynchronous-events).\n\nUnlistening\n-----------\n\nThe `unlisten()` method provides the ability to remove callback functions\nregistered on a widget. This is useful to prevent triggering events that should only\noccur once, or under certain circumstances. The return value of `onClick()`\nor `onChange()` is an ID that can be passed to `unlisten()` in\norder to make the widget stop calling the function. To unregister all events or events\nof a specific type, call `unlisten()` with no arguments or an event type (e.g.\n`'click'` or `'change'`) argument, respectively. The following\nexample demonstrates `unlisten()` to facilitate opening and closing of a panel:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Create a panel, initially hidden.\nvar panel = ui.Panel({\n style: {\n width: '400px',\n shown: false\n },\n widgets: [\n ui.Label('Click on the map to collapse the settings panel.')\n ]\n});\n\n// Create a button to unhide the panel.\nvar button = ui.Button({\n label: 'Open settings',\n onClick: function() {\n // Hide the button.\n button.style().set('shown', false);\n // Display the panel.\n panel.style().set('shown', true);\n\n // Temporarily make a map click hide the panel\n // and show the button.\n var listenerId = Map.onClick(function() {\n panel.style().set('shown', false);\n button.style().set('shown', true);\n // Once the panel is hidden, the map should not\n // try to close it by listening for clicks.\n Map.unlisten(listenerId);\n });\n }\n});\n\n// Add the button to the map and the panel to root.\nMap.add(button);\nui.root.insert(0, panel);\n```\n\nObserve that `unlisten()` is used to stop `Map` from listening\nfor click events to close the panel when the panel is already closed.\n\nAsynchronous Events\n-------------------\n\nIf you use an Earth Engine result (such the numerical output from a reduction) in a\nwidget, you will need to get the value from the server. (See the\n[this page](https://developers.google.com/earth-engine/client_server) for\ndetails about client vs. server in Earth Engine). To keep from hanging the entire UI\nwhile that value is computed, you can use the `evaluate()` function to\nget the value asynchronously. The `evaluate()` function begins a request\nfor a value, and when the value is ready calls a callback function to do something\nwith the result. For example, consider an application to get the mean value of an\nNDVI time series at a point:\n\n### Code Editor (JavaScript)\n\n```javascript\n// Load and display an NDVI image.\nvar ndvi = ee.ImageCollection('LANDSAT/COMPOSITES/C02/T1_L2_8DAY_NDVI')\n .filterDate('2014-01-01', '2015-01-01');\nvar vis = {min: 0, max: 1, palette: ['99c199', '006400']};\nMap.addLayer(ndvi.median(), vis, 'NDVI');\n\n// Configure the map.\nMap.setCenter(-94.84497, 39.01918, 8);\nMap.style().set('cursor', 'crosshair');\n\n// Create a panel and add it to the map.\nvar inspector = ui.Panel([ui.Label('Click to get mean NDVI')]);\nMap.add(inspector);\n\nMap.onClick(function(coords) {\n // Show the loading label.\n inspector.widgets().set(0, ui.Label({\n value: 'Loading...',\n style: {color: 'gray'}\n }));\n\n // Determine the mean NDVI, a long-running server operation.\n var point = ee.Geometry.Point(coords.lon, coords.lat);\n var meanNdvi = ndvi.reduce('mean');\n var sample = meanNdvi.sample(point, 30);\n var computedValue = sample.first().get('NDVI_mean');\n\n // Request the value from the server.\n computedValue.evaluate(function(result) {\n // When the server returns the value, show it.\n inspector.widgets().set(0, ui.Label({\n value: 'Mean NDVI: ' + result.toFixed(2),\n }));\n });\n});\n```\n\nWhen the user clicks a point on this map, a `reduceRegion()` call is triggered\non the server. This operation might take a while. To prevent the application from\nblocking while Earth Engine is computing, this example registers a callback function\nto the result, specifically `computedValue.evaluate()`. When the computation\nis finished, the result is displayed. In the meantime, a message is displayed to\nindicate that the computation is in progress."]]