Как я могу перехватить событие исправления проверки орфографии Firefox?

У меня есть текстовое поле. После написания текста с ошибкой и использования правой кнопки мыши -> исправление слово заменяется правильно написанным словом. Теперь моя проблема в том, что мне нужно выполнить некоторый код javascript, когда исправление будет выполнено.

Как я могу перехватить событие исправления проверки орфографии firefox? Если есть единственное решение, использующее надстройку firefox, я был бы рад узнать об этом.


person Thariama    schedule 31.01.2012    source источник
comment
Вас интересует только проверка орфографии, или вы пытаетесь зафиксировать исправления проверки орфографии в дополнение к клавиатуре и другим событиям. Вам нужно различать исправления проверки орфографии и другие типы ввода текста?   -  person Andy E    schedule 31.01.2012
comment
в моем случае мне не нужно различать их (но решение только для исправления было бы лучше)   -  person Thariama    schedule 31.01.2012


Ответы (2)


Mozilla запускает oninput в этом случае, не проверялось в других, но должно работать везде.

Интересно, что FF запускает два события ввода при использовании исправления орфографии: сначала удаляется слово, а затем вставляется новое:

> value=[holy coww]
(right click and choose "cow")
> value=[holy ]
> value=[holy cow]

http://jsfiddle.net/7ssYq/

person georg    schedule 31.01.2012
comment
Просто чтобы уточнить, oninput поддерживается в Firefox, Chrome, IE 9 (с ошибками), Opera и Safari, но имеет ошибки или не поддерживается в более старых версиях. Тем не менее, ОП делает вид, что ему нужно различать разные типы ввода, чего oninput не позволяет вам делать. - person Andy E; 31.01.2012
comment
К сожалению, я, кажется, не заставить его работать. Может быть, это потому, что мне нужно применить его к элементу contenteditable body, который помещается внутри iframe на моей странице (это редактор в реальном времени). - person Thariama; 31.01.2012
comment
Хм, вы упомянули текстовое поле в своем вопросе... В любом случае, вы всегда можете привязать все события к рассматриваемому элементу (используя это: stackoverflow.com/questions/6577346/) и посмотрите в консоли, какие события запускаются. - person georg; 31.01.2012
comment
@Thariama: oninput, к сожалению, не срабатывает для элементов, доступных для редактирования (в большинстве браузеров). - person Andy E; 31.01.2012
comment
правильно, я старался максимально упростить вопрос, но на самом деле он немного сложнее. я именно так и пробовал - ничего не получается - person Thariama; 31.01.2012
comment
@AndyE: это именно то, чего я боялся (и что объясняет, почему я не могу заставить его загореться) - person Thariama; 31.01.2012
comment
+1 спасибо за ваше решение, которое я приму из-за того, что оно работает для вопроса, который я задал (но не для моего точного варианта использования). похоже, что нет никакого подхода к тому, чтобы найти именно его. Я думал о надстройке Firefox, чтобы поймать событие исправления, но я не смог ничего найти в сети. - person Thariama; 31.01.2012

Первоначально я собирался предложить событие oninput, например ответ thg435, но я подумал, что буду искать более подробную информацию в сначала комментарии. Если вам не нужно различать исправления проверки орфографии и другие типы ввода (клавиатура, вставка, перетаскивание и т. д.), то oninput прекрасно справится с этой задачей.

Если вы действительно хотите различать эти типы ввода, то, боюсь, нет события, которое срабатывает специально для исправлений проверки орфографии. Однако существуют события для большинства других типов ввода, поэтому вы можете как минимум сузить вероятность того, что ваше событие ввода является исправлением, если вы сначала проверите другие типы событий. Рассмотрим следующее:

(function () {
    var el = document.getElementById("MyInput"),
        ignore = false;

    el.oninput = function (e) {
        // ignore the events that we don't need to capture
        if (ignore) {
            ignore = false;
            return true;
        }

        // Your code here
    }

    // IIRC, you need the following line for the `ondrop` event to fire
    el.ondragover = function () { return false; }

    // Ignore paste, drop and keypress operations
    el.onpaste = el.ondrop = el.onkeypress = setIgnore;

    function setIgnore (e) {
        ignore = true; 
    }
})();

Однако это не идеальное решение. Например, событие по-прежнему будет срабатывать для действий Undo/Redo (и, возможно, некоторых других действий), которые не инициируются клавиатурой.

person Andy E    schedule 31.01.2012
comment
+1 решение моего вопроса, но не охватывает все случаи - person Thariama; 31.01.2012