2015-05-04 1 views
0

Невеста к JavaScript. Когда страница загружается, она связывает функцию removeFav/addFav с событием click тега anchor. Все работает по назначению, но когда пользователь нажимает на ссылку, она берет пользователя в верхней части страницы. Я попробовал preventDefault() в разных местах каждой из функций. Это остановило бы щелчок по умолчанию, но это предотвратило бы выполнение остальной части кода или нарушение функциональности.Javascript обязательный для 'click' и preventDefault() не работает

ПредотвращенDefault() еще правильный путь? Где следует предотвращатьDefault()? Как я могу остановить страницу от возврата в начало страницы при каждом нажатии ссылки. Любая помощь будет оценена по достоинству.

JavaScript код:

// Add a favorite 
function addFav() { 
    var id = $(this).data('id'); 
    var url = '/listings/' + id + '/favorite'; 
    $.ajax({ 
     url: url, 
     type: 'put', 
     success: function(){ 
     $('this') 
      .addClass('active') 
      .off('click') 
      .on('click', removeFav) 
     ; 
     console.log("success in add function"); 
     }, 
     error: function() { 
     console.log("error in add function"); 
     } 
    }); 
} 

    // Remove a favorite 
    function removeFav() { 
    var id = $(this).data('id'); 
    var url = '/listings/' + id + '/unfavorite'; 
    $.ajax({ 
     url: url, 
     type: "post", 
     dataType: "json", 
     data: {"_method":"delete"}, 
     success: function(){ 
     $('this') 
      .removeClass('active') 
      .off('click') 
      .on('click', addFav) 
     ; 
     console.log("success in remove function") 
     }, 
     error: function() { 
     console.log("error in remove function") 
     } 
    }); 
    } 

    // Attach the add or remove event handler to favorite links 
    function attachFavHandler() { 
    $('a#fav').each(function() { 
    var status = $(this).hasClass('active'); 
    if (status) { 
     $(this).on('click', removeFav); 
    } else { 
     $(this).on('click', addFav); 
    } 
    console.log(status) 
    }); 
    } 

    // Lets get the 'favorites' party started 
    attachFavHandler(); 

Рельсы Код:

  <% if user_signed_in? %> 
      <% if current_user.favorites.where(:listing_id => listing.id).first.nil? %> 
       <%= link_to "", "", :id => "fav", :class => "", :'data-id' => "#{listing.id}" %> 
      <% else %> 
       <%= link_to "", "", :id => "fav", :class => "active", :'data-id' => "#{listing.id}" %> 
      <% end %> 
      <% end %> 
+0

Почему вы даете одинаковый идентификатор каждому элементу привязки? –

+0

'preventDefault' должен присутствовать в верхней части ваших функций' removeFav' и 'addFav'. –

+0

Как и Vigneswaran, вы не должны иметь одинаковый идентификатор для нескольких элементов, ваш '$ ('a # fav'). Каждый()' всегда возвращает 1 элемент, даже если у вас несколько элементов с одинаковым идентификатором. Если вы хотите связать некоторый обработчик для всех элементов, дайте ваши элементы 'a', некоторый класс, например' link', и используйте '$ ('. Link'). Each()' для присоединения обработчиков. – Arkantos

ответ

1

Что вам нужно сделать, это вызвать метод preventDefault() на самом мероприятии. Чтобы получить событие, вам нужно передать событие в свои обработчики, которые уже привязаны к событиям.

Итак, все, что вам нужно сделать, это использовать это событие в ваших обработчиках.

function removeFav(e) { 
    e.preventDefault() 
    ... 
} 
+0

Это работает. Это нарушало мой код, потому что e.preventDefault() изменил $ (this) в обратном вызове ajax, чтобы мой элемент не обновлялся. – theMark

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