Ответы пользователя по тегу JavaScript
  • Почему jQuery.getScript с использованием setInterval приводит к зависанию страницы?

    @egorinsk
    А вы используете средства разработчика (FireBug/Chrome Inspector) или расширения браузера? попробуйте отключить всю эту гадость, ситуация должна улучшиться.

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

    Ну и конечно, кроме этого, задачу вы решаете абсолютно криворуко и неправильно. Для этой задачи не нужны ни getScript (который фактически добавляет к странице элемет script), ни тем более воркеры (которые не будут работать в ИЕ). Надо просто делать обычный $.ajax(), а результат отдавать в виде JSON, и все у вас заработает.
    Ответ написан
    1 комментарий
  • Javascript try..catch?

    @egorinsk
    Я оборачивал в try/catch (естественно не руками) обработчики событий, вызовы setInterval/setTimeout, коллбеки, чтобы ловить ошибки и оггировать на сервер. Это, по моему, единственное применение, так как в нормальных условиях код не выбрасывает исключений (собственно, потому они и называются исключения).
    Ответ написан
    Комментировать
  • Как сделать динамическое обновление контекта, запрашиваемого через JSON?

    @egorinsk
    Вконтакте используется какая-то бибилиотека для веб-сокетов, а на серверах наверно стоит сишный (или не сишный?) демон, специально написанный для этой цели. Если сможете повторить такую конструкцию, будем рады видеть вашу статью с описанием на Хабре.
    Ответ написан
    3 комментария
  • Как удалить элементы из списка?

    @egorinsk
    Проблема в ИЕ решается заменой button на input typr=submit. Адекватнее сделать сначала удаление через POST формы, потом, если есть время, добавить аяксовое удаление и восстановление записей (надеюсь, вы уже не делаете confirm('А вы точно нажали на кнопку «Удалить»?')).
    Ответ написан
    1 комментарий
  • Обработка ошибок при асинхронном выполнении в JavaScript?

    @egorinsk
    Для асинхронных вызовов пишут функции в цепочку в виде:

    callFunction(function() { /* async code */ }).then(function() { /* async code */ }).then(function(){ /* async code */ }).onError(function() { /* error handler */ });

    Такая функция организует порядок выполнения и обработку ошибок сама. Есть какие-то библиотеки для этого, но я уверен, что они все кривые, плохо сделанные и overbloated, так что лучше написать свой код для таких целей.
    Ответ написан
  • Выгрузить javascript код из браузера?

    @egorinsk
    Чтобы не было конфликтов, надо правильно писать яваскрипт-код. Чтобы в подгруженной через AJAX странице скрипты выполнялись, вроде бы достаточно ее вставить через $(frame).html(pageContent); jQuery сам найдет и выполнит скрипты.
    Ответ написан
    Комментировать
  • Нужна путёвая подборка книг по JS, jQuery, ActionScript?

    @egorinsk
    Для начинающих — learn.javascript.ru
    Ответ написан
    Комментировать
  • Быстрый аналог Jcrop?

    @egorinsk
    Если не найдете готовый аналог, то держите ценную информацию.

    Что касается айфонов, там с помощью свойств css-transform можно добавить аппаратное ускорение, говорят, все работать быстрее начинает — можете попробовать.
    Ответ написан
  • Onsubmit в Internet Explorer?

    @egorinsk
    1) У вас в ходе работы onSubm() выбрасывается исключение, так как она написана с кучей ошибок, и false соответсвенно не возвращается.
    2) Или как вариант, у вас просто отключен яваскрипт.
    Ответ написан
  • Django, и JQuery (AJAX) - нет ответа?

    @egorinsk
    Нельзя (без извращений) отправлять AJAX-запросы с одного домена на другой. Точнее, отправлять можно, нельзя прочесть ответ. Это назвается same origin policy (есть обходные пути: JSONP и cross-origin requests). Я настоятельно советую отложить изучение jQuery и django и изучить основы HTTP, HTML и Javascript, а также принципы работы браузеров. Использование фреймворков не отменяет знание основ.
    Ответ написан
    5 комментариев
  • Как вредоносный код попал на сайт

    @egorinsk
    1) Украли сохраненный в тотал коммандере или подобной софтине пароль от ФТП
    2) В сриптах есть уязвимость и через нее вставляется вирус
    Ответ написан
  • Простые табы для сайта на jQuery, бывает еще проще?

    @egorinsk
    За ссылки с href=# надо отрывать руки. Что это за ссылка, которая никуда не ведет? Далее, при отключенном яваскрипте у вас будет пустая страница. далее, зачем тянуть 150-Кб тяжелый фреймворк, от которого айфон подвисает, ради табов?

    Далее. Вот у вас написано

    #wrapper div { display:none; }

    Что, если внутри сождержимого таба есть еще дивы? А если внутри таба есть еще один блок табов? А?

    Далее, а что если табов больше 3-х?

    Сделано на троечку, на уровне школьника, который впервые прочел сайт htmlbook.ru и захотел что-то сотворить. С кучей ошибок. Плохо, короче говоря.

    И что значит «без использования хешей»? Это почему еще?

    К слову, табы можно сделать вообще без яваскрипта, но вам видимо еще до этого далеко. Также, верстку табов можно сделать семантичнее — погуглите, у Сергея Чикуенка была статья на эту тему.
    Ответ написан
    3 комментария
  • HTTP-запрос к серверному api из плагина. Как на сервере защититься от подмены

    @egorinsk
    Никак.

    Чуть осложнить жизнь «подделывателям» можно, отправляя запрос по HTTPS, зашифрованным POST без параметров, только бинарное тело, и выставив неправильные HTTP-заголовки (если пришли правильные — значит подделка, пусть сидят гадают, почему, жалкие людишки). Отвечать сервер тоже должен нестандартно (всегда с кодом 200), бинарным ответом.

    Но все равно взломаем, если понадобится.
    Ответ написан
    1 комментарий
  • Отладка JavaScript в UIWebView?

    @egorinsk
    Аналог Firebug вас бы устроил? В таком случае предлагаю скачать и заюзать FirebugLite (это фаербаг для не-фаерфокса).
    Ответ написан
  • Как лучше организовать работу с ассетами?

    @egorinsk
    Храните в папке static основного репозитория, в чем проблема? Склеивать естественно надо автоматически, а не руками. Для простых проектов склейщик пишется за 10 минут на bash.
    Ответ написан
    Комментировать
  • Эффект перелистывающихся страниц на JavaScript

    @egorinsk
    Они все отвратительны в плане тормозов и юзабилити.
    Ответ написан
    Комментировать
  • Кроссбраузерная библиотека зависимостей (js, css)?

    @egorinsk
    Yepnope.js? А вообще, я бы сам лучше написал что-нибудь.
    Ответ написан
    1 комментарий
  • Расскажите про лучшие практики построения простых веб приложений на PHP+JS+jQuery?

    @egorinsk
    AJAX-приложения делаются не так и давно, потому найти собранные воедино best practices не так-то просто. Многие наработки просто не выложены в паблик, а используются разработчиками для каких-то своих проектов. Потому надо проявить старание и разобраться самому.

    Сначала посмотрите на то, что делают другие. Но здесь важно не брать плохие примеры (например, монстров типа Zend Framework и ExtJS. jQueryUI, кстати тоже уродливая вещь — вы его исходники смотрели?) Посмотрите, как написан клайентсайд у вконтакта. Посмотрите у фейсбука (хотя там код пожат, но разобраться можно). Посмотрите библиотеку Zforms. Посмотрите Google Closure Library (у Гугла есть чему поучиться, особенно в плане организации кода, посмотрите обязательно).

    Вообще, смотреть чужой код полезно. он не всегда хорошо написан, но даже в этом случае — это повод для размышлений на тему «а как правильно?».

    Теперь о теории. При построении более-менее сложных AJAX-приложений приходится решать примерно те же проблемы, что и на серверной части, а именно:

    — разделение кода на слабосвязанные компоненты (чтобы, меняя один из них, не ломать все остальное). Сюда входит как организация 3-звенной архитектуры (например, MVC), так и разбиение на модули, динамическая подгрузка модулей (посмотрите yepnope.js и сделайте то же, но проще). Выбор средства взаимодействия модулей — Dependency Injection или система событий (паттерн Observer). Мне больше нравится Observer.

    — организация хранилища данных — нужен какой-то модуль для получения данных с сервера с кешированием, проверкой актуальности, возможно с блокировками и нотификацией об изменениях. Посмотрите, например, как ведет себя Гугл Докс если открыть в 2 окнах 1 документ и править его. Нужна серверная половинка для приема/валидации/выдачи данных.

    — организация View: это решение вопроса о выборе шаблонов (jQuery Templates для начинающего — вполне пойдут), создание системы виджетов (чтобы например можно было вставить виджет графика в виджет формы и все работало) — я не знаю, правда, ни одной нормальной библиотеки виджетов, пишите сами.

    — роутер и контроллер — ну это элементарно пишется без всяких библиотек. Не знаете, как — посмотрите, как сделано у вконтакта.

    — повторное использование кода — копипаст недопустим.

    Также, есть проблемы специфичные именно для клиентсайда:

    — необходимость уменьшения числа запросов (неправильно: грузим диалог, обнаруживаем, что ему нужны CSS и JS файлы и грузим их) — лучше это делать одним запросом. То же про запросы к хранилищу: выбирайте все одним запросом. Несколько AJAX-запросов — это треш и ужас, особенно при пинге 100-200 мс.

    — необходимость минимизации объема и скорости работы JS-кода. Ради нее надо отказываться от тяжелых/перегруженных библиотек типа ExtJS, kendo и jQueryUI.

    — склеивание/сжатие JS файлов — элементарщина, можно склеивать хоть bash-скриптами (или make), плюс можно применить тулзы типа Google Closure Compiler. Разберитесь, как они работают.

    — необходимость создания адаптивной верстки — для этого есть библиотеки типа Modernizr, но по моему, это перегруженный монстр. Мне, например, хватает простого инлайн-скрипта, включаемого сразу после body, который ставит классы with/without-js, with-css3, with-ie, в итоге пользователи современных браузеров экономят трафик и видят rounded corners и CSS gradients, а пользователи ИЕ скачивают их в виде картинок.

    А, вот скрипт, если кому интересно: paste2.org/p/1947136

    — необходимость поддержки навигации средствами браузера — посмотрите библиотеку history.js (хотя имхо, ее тоже стоило бы урезать раза в 2-3, там много лишнего).

    Ну и для закрепления знаний нужна естественно практика.

    Напишите

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

    2) Сделайте форму редактирования/добавления данных в этот грид с валидацией.

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

    4) если не испытываете отрицательных эмоций по отношению к вконтакту — решите эту задачу: vk.com/page-1_42054413. Она хорошо подходит для отработки навыков разработки AJAX-приложений.

    Что касается PHP, в AJAX-приложении он просто служит бекендом и умным хранилищем данных, не более. Слепите простейший ORM, его вполне хватит.

    P.S. И никогда не повтоярйте ошибок, которые делают косолапые разработчики Хабра. Размер textarea для комментариев должен вмещать минимум 20-25 строк.
    Ответ написан
    1 комментарий