суббота, 3 октября 2009 г.

JQuery siblings VS find

Простенький пример:

$("div.test").find("li")  и $("div.test").siblings("li")

выполнят одну и ту же функцию - выберут из дива с классом test все элементы li, но по скорости siblings будет значительно выигрывать, так как ищет сестринские элементы в наборе, то-есть только элементы li, а find пропускает через себя все, оставляя только нужные.

Если у вас имеются большие куски ХТМЛ для парсинга, то вам следует использовать sibling если выбираются однотипные элементы. Это является неплохой оптимизацией работы поиска, особенно при больших объемах данных.

пятница, 2 октября 2009 г.

Универсальный механизм отправки AJAX запросов

Я хочу поделится своим опытом работы с JQuery для генерации AJAX запросов. Думаю что интересно будет не только новичкам.

Допустим, у нас есть какой-то проект, который находится на такой стадии разработки, что основной серверный функционал отлажен, дизайн существует в виде каркасов страниц. Нам ставят задачу - сделать обработку всех форм (причем для разных контроллеров) с помощью Аякса. Вполне понятно, что хотелось бы реализовать простой, удобный, а самое главное - универсальный механизм обработки AJAX запросов.

Для начала, нам понадобится подключить собственно сам JQuery, а также плагин JQuery Form. Советую создать JScript файл в котором мы и будем хранить наши универсальные методы обработки (удобно назвать например general.js).

В нем создаем такую функцию:

function FormSubmit(id,url,func){
   var params = $("#"+id).formSerialize();
   $.post(url,params, function(response){
    if(StatusOk(response)){
      call_func(func,response);
    }else{
      ShowValidation(response);
    }
   });
}

Функция принимает 3 параметра:
1 - ID формы со страницы, для того чтобы можно было сериализировать данные формы для отправки
2 - URL скрипта который будет обрабатывать запрос
3 - имя JScript функции-обработчика ответа

Добавим соглашение, что результатом обработки запроса, сервер вернет или текст валидационной ошибки, или: $id."Ok!"

Где id - номер обработанной записи в БД, или номер созданной записи и т.п.
StatusOk(response) - проверяет ответ сервера и возвращает TRUE если он успешный.
Код функции ниже:

function StatusOk(str){
   var re = /Ok!/;
   var result = re.test(str) ? true : false;
   return result;
}

Метод call_func(func,response) вызывает функцию по имени func и передает ей ответ сервера как параметр.

Реализацию привожу ниже:

function call_func(func, param){
  if(func!='') window[func](param);
}

Эта функция позволяет динамически вызывать функции по имени с передачей ей параметров.

ShowValidation(response) - стандартный метод в котором вы будете обрабатывать валидационные сообщения, например выводить их в какой-то общий див со специальным стилем.

Такой подход позволяет очень гибко обрабатывать формы. Например, мы в форме на кнопочку вешаем обработчик onclick='FormSubmit("form_id","/users/update", "userCreate")'

Наша функция соберет данные с формы заданной через id, передаст их на url скрипта обработки, после чего в случае успешного ответа - вызовет ф-ю userCreate (ее надо не забыть создать) и передаст туда ответ сервера для дальнейшей обработки. Как правило, эта функция должна обновлять набор данных на странице после их изменения (создание, редактирование). Если в ответе сервера не присутствует признак успешной операции, то значит ответом является валидационное сообщение которое надо отобразить.

Таким образом, все AJAX запросы выполняются в одном месте. Добавлением третьего параметра - вызов call-back функции, мы добавляем невероятную гибкость нашему методу. Он позволит вынести индивидуальную обработку ответа в нужное место в каждом конкретном случае. При этом, в call-back функции нам не надо заботится о Аяксе и о том как туда попали параметры.

Когда все запросы обрабатываются в одном месте, то вероятность возникновения ошибок, стремится к нулю. Необходимо только придерживаться соглашений для ответа сервера.

Вы можете всячески усовершенствовать данный механизм, который здесь приводится в облегченном варианте. Надеюсь что данный подход будет вам интересен и использован в своих приложениях.

Создаем JQuery фильтр для полей для предотвращения XSS атак. Create JQuery filter for XSS attacks avert

Столкнулся с задачей, когда необходимо фильтровать значение полей ввода, на предмет содержания в них HTML тегов, а также вызовов JScript функций.

В моем конкретном случае, дыра образовалась в инпуте, значение которого обрабатывалось JQuery методом.

Проблему решает написание JQuery фунции, которая может применятся к любому тегу который имеет значение val(). Я вырезаю из него все теги, а также содержимое всех скобок, вместе со скобками.

Реализацию функции привожу ниже:


(function($) {
  $.fn.stripTagsFromVal = function() {
    var regexp = /([<|(]("[^"]*"|'[^']*'|[^'">])*[>|)])/gi;
    this.each(function() {
        $(this).val(
          $(this).val().replace(regexp,"")
        );
      });
    return $(this);
  }
})(jQuery);


Приведу пример использования:
Пусть у нас есть input#test, зададим ему значение:


$("#test").val('< script>alert('XSS attack!')< / script>');


Применим нашу функцию и проверим что получим на выходе:


$("#test").stripTagsFromVal();
console.log('text: ',$("#test").val());


В консоле будет: text: alert, что означает что из всей конструкции осталось только безобидное имя функции alert.

Модифицировать даный пример, для конкретного вашего случая, не составит проблем. Для отладки регулярных выражений пользуйтесь замечательным online отладчиком Rubular

пятница, 14 августа 2009 г.

Firefox 3.5.2 первые впечатления

Новая версия ФФ должна была порадовать мировое сообщество ощутимым увеличением скорости, я сравнивал новый ФФ, Google Chrome, Opera 9.64. Визуально быстрее всех работает Опера, тестирование на выполнение JScript выиграл Google Chrome.

Firefox 3.5.2 работает быстрее своих старых версий, как и обещалось. Но, особого увеличения скорости я как юзер не увидел.. Виной тому являеся то, что я использую большое количество плагинов - что является как достоинством так и не достатком ФФ.

Хочу добавить - сейчас нельзя говорить что ФФ, Хром или Опера круче всех, потому что они постоянно тянутся друг за другом и это неможет не радовать. Конкуренция - двигатель прогресса.

Firefox 3.5.2 выгодно отличается поддержкой HTML 5, но думаю скоро это будет повсеместный стандарт среди броузеров.

Отдельно скажу о IE8 - он стал более адекватным чем 7 версия, пропала часть сугубо ИЕшных "приколов", стал быстрее. Но... По скорости он всеравно отстат от своих конкурентов. Да и для любого разработчика веб-приложений нет более ненависного броузера...

суббота, 1 августа 2009 г.

Радио РОКС - 102.4 FM

Здесь транслируют как современный рок, так и хиты 70-90 годов. Слушайте и получайте удовольствие!

Вывод WMZ без потерь и процентов

Если правильно все сделать, потери при выводе могут равнятся 0%! Если не сильно получится- то не больше 2%. Для того чтобы сэкономить деньги и не платить процент за снятие с карты читайте как правильно прикрутить свой webmoney акаунт к банковской платежной карте в этой статье.

Ваш успех (при правильном выборе БПК - банковской платежной карты) будет всецело зависеть от правильной ставки на бирже webmoney exchanger. Как правильно переводить валюту через нее написано тут.

Важно всегда помнить, чем быстрее вы хотите вывести деньги, тем больше у вас будут потери. Хорошо накатаная схема, позволяет поменять WMZ на другой валютный эквивалент webmoney примерно за 1 день. Для вывода на БПК потребуется тоже от 1 до 3 банковских дней. Чаще всего только 1. Таким образом можно за 2-3 дня вывести WMZ, совершенно без напрягов, рисков и потерь (зависит от того как вы играете на бирже))

пятница, 24 июля 2009 г.

Вывод Webmoney через УкрСоцБанк

Для вывода электронных денег в Украине используется сервис banking.ukrgarant.com, который позволяет:

- переводить деньги на банковскую карту
- перевод на банковский счет
- через систему банковских переводов «Аваль-Експрес» (комиссия банка 1.5% )
- через систему банковских переводов СОФТ от АКБ «Укрсоцбанк» (комиссия банка 1%)

Вам надо знать, что такие услуги возможны только для WMU - вебмани-гривен. Если вы имеете единицы Webmoney в другой валюте, то их надо будет обменять на WMU. Как правильно и без потерь это сделать - описано здесь.

Наиболее удобным способом является перевод на банковскую платежную карту (БПК). Именно из этих соображения я и опишу данный способ.

В качестве банка в котором открыть счет и сделать БПК - я выбрал УкрСоцБанк.

Причины выбора следующие:

- Банк считается одним из самых стабильных в Украине, так как входит в UnitCreditGroup. Это сообщество банков владеет общими финансовыми резервами, что означает меньшую вероятность банкротства и большую вероятность того, что в случае нового кризиса деньги вернут.
- комиссия за снятие денег составляет 0%, что позволяет свести к минимуму потери при выводе электронных денег на карту, а также при последующем их обналичивании.

Сервис в банке на достойном уровне, по сравнению с Приватом я очень удивился, так как при оформлении карты (VISA ELECTRON), ручку брал в руки всего пару раз - надо было расписаться возле галочек. Карта оформляется 10 дней, немного долго, но учитывая тот факт, что ваши денежные затраты при этом равняются 0 гривен - вполне нормально.

После того как карта получена, не забудьте взять в банке реквизиты, так как на сервисе banking.ukrgarant.com вам будет необходимо их указать.

Вы должны прикрепить свою БПК к вашему WMID (WebMoney identificator), для этого надо указать банковские реквизиты и подождать сутки (проверку).

В поле реквизитов Назначение укажите: ваш личный счет, ФИО, ИИН. Писать тут что-то еще - не стоит.

После успешного прикрепления БПК, сделайте перевод небольшой суммы для проверки. Деньги обычно приходят через сутки. После первого платежа на banking.ukrgarant.com нужно указать, что он прошел успешно.

Теперь все. Пользуйтесь своей картой для вывода.

Суммарная комиссия составляет:

0.8% за перевод webmoney + 1% за перевод на карту = 1.8%