2013-06-11 3 views
0

Пожалуйста, загляните на следующий код, который находится в _form.html.erb:Основные вопросы о Javascript

<script> 
    function typeCatch(){ 
     $.post("<%= update_readers_link_essay_path(@essay) %>"); 
     $(this).off("keypress", typeCatch);//remove handler 
    } 

    $(function(){ 
    ("form#new_revision").on("keypress", typeCatch); 
    }); 
</script> 

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

Поскольку я еще не знаком с javacsript, я был бы признателен, если бы вы помогли мне прояснить некоторые вещи.

a. Во второй части, я могу просто сделать

$("form#new_revision").on("keypress", typeCatch);

без окружив его с $(function() {}?

b. Есть ли что-то, что я делаю неправильно? Поскольку вызов ajax не запускается, я, должно быть, допустил ошибку во второй части?

Дополнительный вопрос

my_personal_chat.js (в приложение/активов трубопровода/JavaScripts)

$(function() { 
    var pusher = new Pusher('app_key'); 
    var channel = pusher.subscribe('presence-my-chat'); 

    channel.bind('pusher:subscription_succeeded', function(members) { 
    $('#online_users').empty(); 
    members.each(function(member){ 
     addMember(member); 
    }); 
... other functions ... 
}); 

Это, как я реализовал свою функцию чата, с помощью толкателя. Поскольку канал является приватным, каждый раз, когда я вызываю var channel, вызывается вызов ajax для POST /pusher/auth.

Я обнаружил, что каждый раз, когда я перехожу на другую страницу, даже если это не функция чата, вызывается POST /pusher/auth. В принципе, каждый раз, когда загружается my_personal_chat.js, вызов ajax будет излишне вызван.

Вопрос: Как предотвратить это? my_personal_chat.js следует загружать только после перехода на myapp.com/chat. Должен ли я просто вытащить все из файла javascript и поместить его в chat.html.erb? Это обычный способ сделать это?

ответить на мой собственный вопрос: я переехал код из my_personal_chat.js в chat.js.coffee и удалил my_personal_chat.js. Теперь javascript загружается только тогда, когда пользователи переходят на страницу чата.

+2

Вам не хватает $ from '(" form # new_revision "). On (" keypress ", typeCatch)' –

+0

Это вы снова @FrederickCheung! Спасибо. Да, я добавил его, и проблема все еще сохраняется. Кроме того, мне не нужна точка с запятой в конце? –

+0

Semilcolons являются необязательными в JS. – pvnarula

ответ

2

a. Существуют альтернативы, но обертка кода в $(function() {}) является одним из лучших способов гарантировать, что код не будет выполнен, пока все элементы не будут загружены в DOM. Это функция jQuery.

b. ("form#new_revision").on("keypress", typeCatch); должно быть $("form#new_revision").on("keypress", typeCatch);. Вам не хватает $ в начале.

+1

Я загрузил библиотеку jquery и исправил ошибку javascript, и она работает. http://jsfiddle.net/xEu8w/ – fermin

+0

Спасибо за помощь всем. Проблема в том, что некоторые другие файлы javascript не были правильно импортированы, и это давало этому коду ошибку. Еще один вопрос. Предположим, у меня есть внешний javascript-файл 'foo.js', и я хочу, чтобы это было загружено только тогда, когда я попал на определенную страницу'/foo'. Я поместил 'foo.js' в каталог' app/assets/javascripts', и он загружается каждый раз, когда я перехожу на другую страницу. –

+0

Если он загружается, хотя вы не упоминаете его в теге '

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