Вместо того, чтобы воссоздавать ввод каждый раз, я думаю, что вы можете создать его один раз (возможно, прямо в своем HTML), но с display:none
. Когда мышь входит в ваш td
, скройте все, что там есть, и покажите ваш ввод.
Затем, когда мышь покидает ваш ввод, вы снова скрываете его и показываете, что было раньше (если вообще что-то). Таким образом, вам не нужно связывать и развязывать элементы на лету.
Обновление : Мне кажется, я неправильно понял ваш вопрос. Возможно, кто-то еще знает, как правильно связывать и отвязывать обработчики событий (я не знаю), но, возможно, я могу помочь вам решить вашу проблему. Если я правильно понял, вы пытаетесь сделать что-то похожее на редактирование содержимого таблицы, верно? (как электронная таблица)
Итак, мое предложение выше по-прежнему применимо, однако вы хотите запретить запуск этих обработчиков после того, как пользователь нажал на ввод. Поскольку только один элемент будет иметь фокус за раз, вы можете создать переменную lock
и установить для нее значение true, пока пользователь ее редактирует:
var lock = false;
$("input").click(function() { lock = true; });
И проверьте его перед запуском каждого из ваших обработчиков:
$(".translation").mouseenter(function(){
if ( lock )
return;
Когда пользователь нажимает ввод (или ввод теряет фокус), вы можете снова установить lock = false
и запустить тот же код, что и для mouseleave
(поскольку мышь, возможно, уже ушла, когда пользователь редактировал).
Полный рабочий пример на jsFiddle . Надеюсь, это поможет!