2015-11-21 2 views
-1

Я хочу использовать функцию preventDefault() в .each для набора кнопок и ее не работает. Когда я использую его с одной .click-функцией, он отлично работает, но внутри .each неjQuery - preventDefault() в .each function

Что я делаю неправильно?

Вот мой .js код

$(document).ready(function() { 

    var findingStatus = $('#findingStatus').attr('finding-status-type'); 
    var findingLike = $('#finding_like_btn'); 
    var findingDislikeBox = $('.finding_dislike_add'); 
    var findingDislikeCollection = $('.finding_dislike_add_btn') 
    var findingUnlike = $('#finding_unlike_btn'); 
    var findingDislikeRemoved = $('#finding_dislike_removed'); 

    var alertBox = $('.alert-box').hide(); 



    if (findingStatus == 0) { 
     findingDislikeBox.show(); 
     findingUnlike.hide(); 
     findingDislikeRemoved.hide(); 
    } 
    else if (findingStatus == 1) { 
     findingDislikeBox.hide(); 
     findingUnlike.show(); 
     findingDislikeRemoved.hide(); 
    } 
    else if (findingStatus == 2) { 
     findingDislikeRemoved.show(); 
     findingUnlike.show(); 
     findingDislikeBox.hide(); 
     findingLike.hide(); 

    } 

    findingDislikeCollection.each(function() { 



     var findingDislike = $(this).clone(); 
     var url = findingDislike.attr("href"); 

     findingDislike.click(function(event) { 

      event.preventDefault(); 

      $.ajax({ 
       url: url, 
       type: "POST", 
       dataType: "json", 
       success: function(data) { 

        if (data.profileState == 1) { 

         $('#dislike_count_btn').text('Odrzuć' + data.DislikeCount); 
         findingDislikeBox.hide(); 
         findingDislikeRemoved.show(); 
         findingUnlike.show(); 
         //findingUnDislike.show(); 
         //findingUnDislike.attr('disabled', false); 
         //findingUnDislike.text('Cofnij'); 
        } 
        else { 
         alertBox.show(); 
         if ($('.alert-box-msg').length==0) { 
          $('.alert-area').prepend('<p class="alert-area alert-box-msg">Żeby korzystać z tej funkcji musisz być zalogowany.</p>'); 

         } 
         findingDislike.attr('disabled', false); 
        } 

       }, 
       error: function() { 
        alert('Problem z serwerem, spróbuj ponownie za kilka minut.'); 
        findingDislike.attr('disabled', false); 
       } 

      }); 


     }); 



    }); 



    $('html').click(function (e) { 
     if (!$(e.target).hasClass('alert-area')) { 
      $('.alert-box').hide(); 
      findingDislike.attr('disabled', false); 
     } 
    }); 


}); 

Спасибо за ответ

+1

Вопрос 1. Почему вы создаете клон узла и присоединяете событие к клону? –

+0

Этот код, очевидно, не работает. Элемент, который вы клонировали, не находится в DOM. Следовательно, клик не может произойти на клоне. Следовательно, код никогда не выполняется –

ответ

1

Вы клонировать элемент с .clone, что означает, что вы на самом деле не прикрепление слушателя событий к чему-либо в DOM. Клонированные элементы должны быть вручную вставлены в DOM с JavaScript, чтобы они имели какой-либо эффект.

+0

Я удалил .clone() и preventDefault() работает нормально, но ajax нет, console.log (url) говорит, что это undefined У меня есть сейчас: var findDislike = $ (this); –

+0

Так что 'findDislike.attr (" href ")' возвращает undefined? – Shashank

+0

Да, у меня есть: var findDislike = $ (this); var url = findDislike.attr ("href"); и консоль дает url - undefined –

0

Это не является правильным способом. После работы следует:

findingDislikeCollection.click(function(event){ 
    var findingDislike = $(this); 
    var url = findingDislike.attr("href"); 
    //AJAX call 
    event.preventDefault(); 
}); 

Более подробную информацию о событии мыши приведены здесь: https://api.jquery.com/click/

+0

Спасибо за ответ. Hiral, я новичок в jQuery Мне нужно использовать функцию .each, потому что у меня много кнопок, я пытался сделать вот так: var findDislike = $ (this); insted of .clone(), теперь preventDefault() работает, но ajax нет, я даю undefined в url:/ –