Как часто нужно проверять форму?
Все эти методы не подходят, если при нажатии на кнопку "сохранить", вы редиректите на другую страницу. Самый правильный вариант - отправлять запрос не сразу после нажатия клавиши, а спустя какое-то время. Некий таймер, который обнуляется, если пользователь продолжает вводить текст. Обычно такой метод называется "debounce", и уже реализован в разных библиотеках, например в underscrore
Если подключать библиотеку не хочется, то можно написать самому, примерно так:function debounce(method, timeout) {
        clearTimeout(method._tId);
        method._tId = setTimeout(function(){
            method();
        }, timeout);
    }       }, timeout);
}
Описываем нужный метод:function checkTitle() {
 //Код проверки
}
И вешаем его на событие:$('input').on('keyup', function() {
   debounce(checkTitle, 1000);
});
В итоге, если после ввода последнего символа прошла секунда и пользователь больше ничего не ввел, вызовется метод checkTitle()
Переводите в транслит при отправке запроса на сервер (по нажатию на кнопку "сохранить"), тогда же проверяйте занятость и при совпадении добавляйте "-2", "-3" и .д. при наличии такого url или время.