# Element: compositionstart event



The **`compositionstart`** event is fired when a text composition system such as an [input method editor](https://developer.mozilla.org/en-US/docs/Glossary/input%20method%20editor) starts a new composition session.

For example, this event could be fired after a user starts entering a Chinese character using a [Pinyin](https://en.wikipedia.org/wiki/Pinyin) [Input method editor](https://developer.mozilla.org/en-US/docs/Glossary/Input%20method%20editor).

## Syntax

Use the event name in [addEventListener()](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget%2FaddEventListener):

```js-nolint
addEventListener("compositionstart", (event) => { })
```

Alternatively, assign to the [event handler property](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Events#using_onevent_properties) of the interface:

```js-nolint
oncompositionstart = (event) => { }
```

## Event type

A [CompositionEvent](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent). Inherits from [UIEvent](https://developer.mozilla.org/en-US/docs/Web/API/UIEvent) and [Event](https://developer.mozilla.org/en-US/docs/Web/API/Event).

## Examples

```js
const inputElement = document.querySelector('input[type="text"]');

inputElement.addEventListener("compositionstart", (event) => {
  console.log(`generated characters were: ${event.data}`);
});
```

### Live example

#### HTML

```html
<div class="control">
  <label for="example">
    Focus the text-input control, then open your IME and begin typing.
  </label>
  <input type="text" id="example" name="example" />
</div>

<div class="event-log">
  <label for="eventLog">Event log:</label>
  <textarea
    readonly
    class="event-log-contents"
    rows="8"
    cols="25"
    id="eventLog"></textarea>
  <button class="clear-log">Clear</button>
</div>
```

```css hidden
body {
  padding: 0.2rem;
  display: grid;
  grid-template-areas: "control log";
}

.control {
  grid-area: control;
}

.event-log {
  grid-area: log;
}

.event-log-contents {
  resize: none;
}

label,
button {
  display: block;
}

input[type="text"] {
  margin: 0.5rem 0;
}

kbd {
  border-radius: 3px;
  padding: 1px 2px 0;
  border: 1px solid black;
}
```

#### JavaScript

```js
const inputElement = document.querySelector('input[type="text"]');
const log = document.querySelector(".event-log-contents");
const clearLog = document.querySelector(".clear-log");

clearLog.addEventListener("click", () => {
  log.textContent = "";
});

function handleEvent(event) {
  log.textContent += `${event.type}: ${event.data}\n`;
}

inputElement.addEventListener("compositionstart", handleEvent);
inputElement.addEventListener("compositionupdate", handleEvent);
inputElement.addEventListener("compositionend", handleEvent);
```

#### Result

## Specifications

## Browser compatibility

## See also

- Related events: [compositionend](https://developer.mozilla.org/en-US/docs/Web/API/Element%2Fcompositionend_event), [compositionupdate](https://developer.mozilla.org/en-US/docs/Web/API/Element%2Fcompositionupdate_event).
