Перед выполнением каких либо действий над элементами их сначала требуется найти, например:
function show() { var block = $( this ); var input = block.find( 'input' ); var elem = block.find( '.elem' ); input.val( 1 ); elem.slideDown(); } function hide() { var block = $( this ); var input = block.find( 'input' ); var elem = block.find( '.elem' ); input.val( 0 ); elem.slideUp(); }
Как вы уже наверное заметили у этих функции есть общий код, который хотелось бы вынести. Есть несколько способов сделать это, но я решил изобрести велосипед.
function base() { var block = $( this ); var input = block.find( 'input' ); var elem = block.find( '.elem' ); } show = concatf( base, function() { input.val( 1 ); elem.slideDown(); } ); hide = concatf( base, function() { input.val( 0 ); elem.slideUp(); } );
Ну и собственно реализация функции concatf:
var concatf = ( function() { function r( f ) { return f.toString().replace( /^[^{]+{/, '' ).replace( /[^}]}$/, '' ); } return function( f1, f2 ) { return new Function( f2.toString().match( /\(([^)]*)\)/ )[ 1 ].replace( /\s/g, '' ), r( f1 ) + r( f2 ) ); } } () );
В данной реализации есть большой минус, это потеря замыкания.
Эту проблему можно решить, но больно не красиво, поэтому приводить реализацию не буду.
ссылка на оригинал статьи http://habrahabr.ru/post/184368/
Добавить комментарий