2010-02-03 7 views
0

Я действительно смущен и даже не уверен, что искать, чтобы найти ответы. Я получаю несколько вызовов функции javascript. Я не имею смысла для меня.jquery live автоматически увеличивая событие keyup

Вот что делает код.

$('expenses_txt').live(\'keyup\', function() { 
    $(this).typeWatch({ highlight: true, wait: 500, captureLength: 0, callback: calculate_expenses }); 
}); 

«Calculate_expenses» является Java-функция, которая использует JQuery Ajax для вызова страницы PHP, который возвращает данные, которые получает отображается в пролете.

Я использую firebug, чтобы помочь мне отлаживать и в функции Calculate_expenses я поставил «console.log» для отладки при вызове этой функции.

Вот что происходит. У меня только 1 поле ввода в DOM в то время, когда это происходит, когда я нажимаю только одну клавишу, вывод в консоли выдает один отладочный msg, как он должен, когда я снова нажимаю клавишу в том же поле ввода, вывод в консоль удваивается (т. е. функция Calculate_expenses вызывается дважды, но должна была быть вызвана только один раз), когда я снова нажимаю клавишу (всего 3 нажатия клавиш), вывод в консоли выдает 3 вызова функции Calculate_expenses сейчас ..... и так далее. Я не знаю, что здесь происходит. Код мне кажется, что он будет вызывать только функцию Calculate_expenses 1 раз, но при использовании firebug он фактически вызывается снова и снова, когда я этого не хочу.

Любые идеи? Я так использую .live() Если я просто использую событие «keyup», он отлично работает, проблема в том, что мне нужно использовать плагин typeWatch, чтобы задержать вызов ajax до тех пор, пока после ввода текста не закончится и не активируется событие keyup скоро. Причина, по которой я использую live(), состоит в том, что я динамически добавляю элементы в dom, и это единственный способ выяснить, как использовать как typeWatch, так и динамически добавлять элементы в dom, которые необходимо было суммировать ...

Ваши мысли оценены. Благодарю.

+0

Какой метод вы используете для динамического добавления элементов в dom? – user113716

+0

patrick, я принял ваше предложение раньше в другом вопросе, который мне пришлось использовать .clone (true), который решил проблему с тем, что ключ не был скопирован во вновь созданные поля ввода. Проблема возникла, когда я попытался использовать плагин typeWatch ... он работал только в первом поле ввода, добавленные динамически не срабатывали. Я просто как проблема, с которой я столкнулся раньше, чем вы решили с .clone (true), моя единственная проблема - это то, что «keyup» является стандартным, а «typeWatch» - нет. Любые другие мысли? – Ronedog

ответ

0

ну, ничего с живым и машинным знаком работал ... работать было нужно использовать onblur и позволить .clone() скопировать его.

0

Где находится $('expenses_txt').live() кусок? Похоже, он срабатывает несколько раз.

Установите точку останова (вкладку сценария firebug, щелкните по левому краю по номерам строк) на линии $('expenses_txt').live(). Он должен срабатывать только один раз. Если он срабатывает несколько раз, вы легко увидите трассировку стека (которая должна привести вас к виновнику).

Также установите точку останова внутри крышки (где вы используете typeWatch). Часть typeWatch может быть виновницей, поскольку она повторно создает экземпляр на каждой клавиатуре (независимо от того, был ли уже обработан this (и привязка обратного вызова несколько раз).

Если это типWatch на работе, вы захотите ., чтобы проверить, если это связано как-то проще всего было бы флагом элемент DOM-то Вы могли бы, например, использование:.

jQuery('#element').data('hasTypeWatch',true) 

установить флаг первоначально Проверьте его с помощью:.

jQuery('#element').data('hasTypeWatch') 

Проверьте документы плагина на см. это автор так объяснил.

+0

Я добавляю эту страницу через php и повторяю строку. Сценарий Jquery находится в этой строке. Я могу добавить точки останова ко всему материалу в моем .js файле, но я не вижу скрипт jquery в firebug, чтобы разместить точку останова, где находится .live(). Элемент .live() находится в части document.ready этого скрипта. Я действительно думаю, что .live() как-то виновник, потому что когда я его удаляю, он работает. Проблема в том, что я использовал .live(), потому что когда я динамически добавлял новый элемент в DOM, он не привязывал бы к нему событие typeWatch, и я был бы достаточно новым для jquery, я не совсем уверен в работе вокруг , – Ronedog

+0

Вы на правильном пути с использованием 'live' для этого случая (примените привязку события теперь + любые будущие элементы dom - это действительно действительно крутая идея). Вкладка сценария Firebug, как правило, показывает вам весь скрипт.js-файлы, все динамически созданные скрипты, любые скрипты, которые появляются в тексте документа. Поиск (справа) является контекстно-зависимым и очень полезным. Вы должны иметь возможность использовать его для поиска своего пути к виновнику. На вкладке сценария также есть небольшая стрелка вниз, где вы можете точно настроить, какие скрипты показывать. – Koobz

+0

ну, я понял, как получить dymanic js для показа в firebug, но я не могу понять эту проблему. если я удаляю проблему .live(), уходит ... но мне действительно нужно иметь возможность привязывать динамические поля ввода к событиям ... думаю, мне придется найти работу. Все равно, спасибо за помощь – Ronedog

0

Вот макет:

function handleData(data){ 
    console.log(data); 
    $("#results").append("<p>"+ data +"</p>"); 
} 

$(function(){ 
    $("#inputElm").focus(); 
    $("#inputElm").live('keyup', function(){ 
     $(this).typeWatch({ 
      callback: handleData, 
      wait: 500, 
      captureLength: 0 
     }); 
    }); 
}); 

Примечание консоль входит несколько вызовов метода typeWatch на каждом KeyUp, в соответствии с замечанием koobz. Я думаю, вы хотите опустить $.live() и просто присоедините typeWatch к вашему вводу.

0

Ну, я все еще очень смущен. Koobz, спасибо за наконечник firebug. Я узнал, где я вижу скрипт, однако точки останова не работают или не останавливают код, он отлично останавливает код в моем .js-файле, который загружается с основным приложением, но скрипт, который динамически добавляется при загрузке конкретной страницы, похоже, не распознает точки останова и не останавливается на них, поэтому я не могу пройти через код.

Я заметил что-то странное, но это может быть только я, как странный, но функции jquery появляются без $(). Например: код JQuery в мой исходный код написан как:.

$ ('income_txt') жить ('KeyUp', функция() { $ (это) .typeWatch ({выделить: правда, wait: 500, captureLength: -1, callback: calculate_income}); });

, но при взгляде на вкладке поджигатель сценарий выглядит следующим образом:

функция() { $ (это) .typeWatch ({выделить: правда, подождите: 500, captureLength: -1, обратный вызов: calculate_income }); }

Является ли это тем, что делает jquery? Я предполагаю, что он привязан к «селектору» и, следовательно, ему не нужно показывать селектор перед ним, а просто использует «function()» ... это правильно?

Любые другие идеи в отношении .live() или другая работа для использования typeWatch, независимо от того, что я пытаюсь сделать, она по-прежнему вызывает функцию несколько раз, если я не удаляю .live(). Если я не использую .live(), typewatch работает в событии keyup, но новые элементы, добавленные в dom динамически с использованием .clone (true), не работают над этим объектом, а typeWatch не запускается. Я не знаю, как связать вновь созданные объекты с событием, использующим typewatch, кроме использования .live(), что вызывает другие проблемы. Если я забуду использование typeWatch и привяжу мое событие keyup к селектору, это сработает, но основная проблема заключается в том, что он слишком быстро вызывает ajax и вызывает проблемы при каждом нажатии клавиши.

Есть ли другие способы достижения того, что я пытаюсь сделать? Спасибо за вашу помощь.