2009-10-01 2 views
0

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

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

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

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

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

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

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

Спасибо,

Пол

+0

Вы должны принять ответы на свои вопросы, щелкнув полый флажок рядом с вашим любимым ответом. – SLaks

ответ

0

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

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

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

+0

Thats довольно недетерминированный. Он может работать в одной среде, а не в другой. –

+1

@Frank Schwieterman: нет, это поведение согласовано во всех браузерах в дикой природе и в настоящее время стандартизировано через W3C. – NickFitz

+0

Большое спасибо - этот подход сделал трюк (то есть он работал каждый раз до сих пор ...) Я действительно попробовал setTimeout, но, очевидно, не понял его. Во всяком случае, не выдерживая комментариев о природе «перекрестите пальцы» этого материала, это намного лучше, чем у меня. Еще раз спасибо. – 2009-10-01 18:46:29

0

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

Вы можете попробовать установить тайм-аут в начале обработчика щелчка:

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 миллисекунды, все браузеры будут ждать не менее десяти миллисекунд, прежде чем запускать внутреннюю функцию, и событие размытия должно быть обработано в течение этого времени. Конечно, если обработка события размытия занимает много времени - скажем, более чем на двадцатую секунды - тогда пользователь будет воспринимать задержку в ответе от кнопки, что может стать проблемой ...

EDIT: я изменился с 0 мс до 1 мс, поскольку я только что вспомнил, что у какой-то чрезвычайно старой версии Opera была проблема с 0 - вряд ли будет проблемой, но вы не можете быть слишком осторожны.

+0

Помогает ли downvoter дать объяснение? Это может быть довольно хакерское решение того, что звучит как неудачное столкновение скриптов, но оно будет работать, как я опишу. – NickFitz

+0

+1 тоже кажется жизнеспособным решением – JustLoren

0

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

Смежные вопросы