Как бороться с повторным добавлением обработчика события в jQuery
Нужно было навешивать и снимать обработчик клика динамически, при этом не затронув чужие обработчики, а их на элементе несколько, каждый ставится своим виджетом. Мой jQuery-ui-виджет навешивает клик только если его ещё нет. Для этого сделан отдельный метод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
_bindClick: function() { var me = this; var $me = $( me.element ); // боремся с повторным навешиванием обработчика var events = $.data( $me.get(0), 'events' ); var filteredEvents = []; if ( 'click' in events ) { filteredEvents = $.grep( events.click, function( Event ) { return Event.type == 'click' && Event.namespace == me.widgetName; } ); } if ( filteredEvents.length ) { return; } $me.bind( 'click.' + me.widgetName, function( Event ) { // логика клика, к примеру: if ( ! me.options.allowDoubleClick ) { $me.unbind( 'click.' + me.widgetName ); } } ); }, //===========================================================================}}} |
Работа с событиями в jQuery 1.7
В jQuery 1.7 добавили .on() и .off() для единообразия работы с событиями. bind, live и delegate могли вести себя непредсказуемо при использовании вместе. Например, $(document).unbind(‘click’) убирал все live(‘click’)-события со всего документа. Новое API событий .on() and .off() призвано как-то унифицировать систему создания обработчиков событий: Старое API Новое API $(elems).bind(events, fn) $(elems).on(events, fn) $(elems).bind(events, { mydata: 42 }, …
Борьба с утечками памяти в php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$limit = 512; $thresholdDelta = 10; ini_set('memory_limit', $limit . 'm'); ... $memoryThresholdReached = false; $memoryThreshold = ( $limit - $thresholdDelta ) * 1024 * 1024; ... while ( $user = $db->plain_fetch( $result ) ) { ... // тут работа с данными ... // проверка на превышение опасного порога использования памяти if ( ! $memoryThresholdReached && memory_get_usage( true ) > $memoryThreshold ) { $memoryThresholdReached = true; try { throw new SystemException( 'Превышен порог использования памяти...' ); } catch ( Exception $e ) {} } } |
Более серьёзные способы — просмотр стека (strace -f -p $pid) и дебаг php C-шным дебаггером DBG.
Адресная строка браузера в Ubuntu — выделить по клику всё содержимое
При клике на address bar в Ubuntu не выделяется всё содержимое как в Windows. Чтобы добиться этого в firefox, нужно: about:config → browser.urlbar.clickSelectsAll → true В Chrome этого сделать нельзя, но есть шорткаты — Ctrl+L или F6 http://askubuntu.com/questions/51580/why-doesnt-chrome-or-firefox-auto-highlight-the-address-bar
Виды мотивации сотрудников
«Цирк» — работа за еду «Театр» — работа за интерес (нужно поставить дело так, чтобы работнику было интересно работать) «Церковь» — работа за идею (внушить работнику, что это ему нужно) * Вообще-то это относится не только к работе, а к любому делу. Заставить человека работать за еду очень просто — надо платить ему зарплату. Каждый …
Горячие клавиши в Google Chrome
http://www.blogsdna.com/837/google-chrome-browser-shortcut-list.htm
Wireless-соединение в Ubuntu
Были проблемы. Сначала
1 |
ping 192.168.1.1 |
т.е. при пинге шлюза говорилось «destination host unreachable». Решилось просто — нужно было выключить сетевую карточку
1 2 3 |
sudo ip link set wlan0 down sudo ip link set eth0 down sudo ip link set wlan0 up |
После этого начал пинговаться шлюз, но всё остальное — нет, даже по ip (пробовал на 4.2.2.2). Оказалось проблемой DHCP. Решилось так: Правой кнопкой на беспроводном соединении → connection information → скопировать primary dns. Потом …
Решение проблемы со звуковой картой Creative в Ubuntu 11.04
Была проблема с creative-овской звуковухой — после очередного обновления моей Ubuntu 11.04 она просто замолчала. Я использовал встроенную, но звук там не тот. В общем терпел-терпел и решил заставить карточку работать. Заняло всё много времени, но для решения понадобилось сделать 3 вещи:
Что такое IIFE
IIFE (Immediately-Invoked Function Expression, «iffy») — немедленно выполняемый функтор. Если не ругаться, то это функция, которая выполняется сразу после объявления. Примеры:
1 |
(function(){ /* code */ }()); |
1 |
(function(){ /* code */ })(); |
1 |
!function(){ /* code */ }(); // facebook style |
Очень удобны тем, что не захламляют глобальное пространство переменных, могут использоваться для создания замыканий и т. д. В общем то, чем каждый день пользуешься, но вечно забываешь, как называется). Хорошая статья. …