Два JavaScript-процесса - PullRequest
       9

Два JavaScript-процесса

0 голосов
/ 01 октября 2009

Я использую продукт под названием DHTMLXGrid, который представляет собой библиотеку JS для создания таблиц в виде электронных таблиц на веб-странице.

Когда я редактирую ячейку и затем щелкаю за пределами ячейки, запускается событие (они называют его onCellEdit), и я делаю вещи для обработки этого события - вызов AJAX для сохранения данных ячейки в БД.

Но если пользователь редактирует ячейку и щелкает кнопку за пределами сетки, которая запускает какой-то другой JavaScript, обработчик onCellEdit не имеет возможности работать до запуска нового кода JS. Не вдаваясь в детали, это все портит.

Итак, у меня есть «Код сетки» и «Код кнопки», и я хочу, чтобы код кнопки ждал, пока код сетки не будет выполнен.

Поэтому я попытался вставить глупый метод sleep () в начале выполнения кода Button. Я ошибочно думал, что это даст возможность запустить Grid-код. Но это предполагает многопоточность, которой, конечно, у нас нет. В результате выполнение всего кода JS было приостановлено, и мой код кнопки все еще выполнялся до кода Grid.

Таким образом, общая проблема заключается в том, что нажатие кнопки удаляет фокус с ранее выбранного элемента. И щелчок, и изменение / размытие являются событиями. Я хочу, чтобы событие размытия обрабатывалось до события щелчка. Кажется, происходит обратное. Я предполагаю, что в чистом JS это будет работать таким образом (я не пробовал), но это сложная библиотека, которая делает свое дело.

Итог - есть ли способ, которым я могу асинхронно приостановить мой код кнопки, чтобы завершить мой код сетки, а затем перейти к коду кнопки?

Спасибо

Пол

Ответы [ 3 ]

0 голосов
/ 01 октября 2009

Все это звучит как нечто вроде мешанины: - (

Вы можете попробовать установить время ожидания в начале вашего обработчика кликов:

function myClickHandler(event) {
    // make sure we have the stuff we need from the event object
    var something = event.someProperty;
    var x = event.x;
    setTimeout(function() {
        doWonderfulThings(something, x);
    }, 1);
}

Несмотря на задержку в 1 миллисекунду, все браузеры будут ждать не менее десяти миллисекунд перед запуском внутренней функции, и событие размытия должно обрабатываться в течение этого времени. Конечно, если обработка события размытия занимает много времени - скажем, больше, чем примерно двадцатую секунды, - тогда пользователь будет воспринимать задержку ответа от кнопки, которая может стать проблемой ...

РЕДАКТИРОВАТЬ: я изменил с 0 мс до 1 мс, так как я только что вспомнил, что у какой-то очень старой версии Opera была проблема с 0 - вряд ли это проблема, но вы не можете быть слишком осторожны

0 голосов
/ 01 октября 2009

Я не думаю, что в конечном итоге вы сможете рассчитывать на какую-то определенную серию обработки цикла событий. То, что может работать чуть более надежно, чем просто добавление простых задержек времени ожидания между вашими пальцами, - это иметь прямые обработчики событий для "onCellEdit" и ваши кнопки управления - все просто добавлять блоки команд (возможно, просто вызываемые замыкания) на отдельные рабочие очереди. Дайте вашей странице таймер с интервалом 100 мс (или 50 мс или как-то еще), который запускает код для обработки этих очередей. Имейте этот код, чтобы расставить приоритеты в работе так, как вы хотите - ячейка меняется сначала, кнопка X затем, кнопка Y последняя или что-то еще. Конечно, этот подход все еще будет уязвим к состоянию, при котором ваше событие интервального таймера пробирается между «размытием» из ячейки таблицы и «размытым» (или «щелчком») на вашей кнопке.

0 голосов
/ 01 октября 2009

Установите небольшой (но не слишком маленький) тайм-аут в обработчике кнопок, например:

setTimeout(function {
    //Button handler
}, 100);    //100 means this will execute after 100 milliseconds.

Если код сетки начинает работать до того, как таймер «звонит», функция будет выполнена только после завершения кода сетки (поскольку Javascript является однопоточным). Вам следует выбрать значение тайм-аута, достаточно большое, чтобы код сетки начал работать до того, как он зазвонит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...