2012-04-06 5 views
1

У меня есть два события click, которые почти похожи, но не совсем. Мне интересно, как их реорганизовать лучше всего:refactor этот код javascript

$('.remove_fields.dynamic').live('click', function(e) { 
    var $this = $(this); 
    var after_removal_trigger_node = $this.closest(".nested-fields").parent(); 
    trigger_removal_callback($this); 
    e.preventDefault(); 
    $this.closest(".nested-fields").remove(); 
    trigger_after_removal_callback(after_removal_trigger_node); 
    }); 

    $('.remove_fields.existing').live('click', function(e) { 
    var $this = $(this); 
    var after_removal_trigger_node = $this.closest(".nested-fields").parent(); 
    trigger_removal_callback($this); 
    e.preventDefault(); 
    $this.prev("input[type=hidden]").val("1"); 
    $this.closest(".nested-fields").hide(); 
    trigger_after_removal_callback(after_removal_trigger_node); 
    }); 

Как вы можете сказать, существует довольно много перекрытий. Мне интересно, какой лучший/лучший способ - реорганизовать этот код.

+1

Шаг 1: Не используйте '.live()'. Он устарел. –

ответ

4

Сделайте проверку класса в функции .remove_fields.

$('.remove_fields').click(function(e) { 
    var $this = $(this); 
    var after_removal_trigger_node = $this.closest(".nested-fields").parent(); 
    trigger_removal_callback($this); 
    e.preventDefault(); 
    if($this.hasClass("dynamic") { 
     $this.closest(".nested-fields").remove(); 
    } else if($this.hasClass("existing")) { 
     $this.prev("input[type=hidden]").val("1"); 
     $this.closest(".nested-fields").hide(); 
    } 
    trigger_after_removal_callback(after_removal_trigger_node); 
}); 
+0

'trigger_after_removal_callback' является обычным явлением в обоих случаях, вы можете разложить его на дно. – Joseph

+0

@Joseph: Ой, да, я мог бы, спасибо, что указал. –

3

Объединить селекторы в $('.remove_fields.dynamic, .remove_fields.existing').

Затем, если $this имеет класс existing. Если это так, запустите $this.prev("input[type=hidden]").val("1");.

Выполнено.

1

с чисткой немного больше:

$('.remove_fields').click(function(e) { 
    e.preventDefault(); 

    var $this = $(this); 
    var $nestedFields = $this.closest(".nested-fields"); 

    trigger_removal_callback($this); 

    if($this.hasClass("dynamic") { 
     $nestedFields.remove(); 
    } else if($this.hasClass("existing")) { 
     $this.prev("input[type=hidden]").val("1"); 
     $nestedFields.hide(); 
    } 

    trigger_after_removal_callback($nestedFields.parent()); 

}); 
Смежные вопросы