Ответы пользователя по тегу JavaScript
  • JQuery: как сделать свой $.post?

    Mithgol
    @Mithgol
    Действуйте согласно руководству Шевчука.
    Ответ написан
    Комментировать
  • Хочу изучить Node.js

    Mithgol
    @Mithgol
    Я также хочу предостеречь, сообщив о том, что многие источники устаревают стремительно, оттого что авторы их не следят за эволюцией Node — хотя, казалось бы, для такого слежения достаточно читать blog.nodejs.org.

    Например, по адресу http://nodeguide.ru/doc/felix/beginner/ можно прочесть:

    Прежде всего, для того, чтобы использовать Node.js, необходимо иметь под рукой работающую *nix-подобную операционную систему. Рекомендуется Linux или OSX, но также могут подойти FreeBSD или cygwin (под windows). В настоящее время ведутся работы над портированием Node.js под windows, но пока они не доведены до стабильного состояния.

    Портирование Node.js под Windows завершилось успехом в ноябре 2011 года, сейчас май 2012 года — стало быть, этот абзац устарел на полгода.
    Ответ написан
    2 комментария
  • Хочу изучить Node.js

    Mithgol
    @Mithgol
    Всегда, даже узнав какие-то сведения из источников на русском языке, нужно не лениться лазать и проверять содержимое пособия http://nodejs.org/docs/latest/api/ оно на английском, но только там можно видеть полное и последнее описание API Node.js (кое-где даже с наглядными примерами).
    Ответ написан
    Комментировать
  • Обработка ошибок при асинхронном выполнении в JavaScript?

    Mithgol
    @Mithgol
    Асинхронная функция потому и асинхронная, что возврат из неё (return) происходит существенно быстрее, нежели заканчивает выполняться исходный код запущенных изнутри неё операций и callbacks.

    Следовательно, обёртывать такую функцию в конструкцию try-catch бесполезно (когда возврат из функции случился, тогда никакие ошибки ещё не могли произойти — а значит, ловить ещё нечего), и для обработки ошибок поневоле приходится применять передачу их callback-функциями, а не бросание оператором throw.

    Для такой передачи, как правило, применяется первый же параметр callback-функции, то есть вызов её имеет вид «callback(err, data)», где error ошибка или null, а data данные, передаваемые при отсутствии ошибки. (Параметров с данными может быть несколько.)

    Смысл такого порядка, при котором параметр ошибки идёт первым по счёту, заключается в том, что вместо «throw new Error()» используется простой вызов callback-функции с единственным параметром: «callback(new Error()); return;» — в общем-то, это не слишком-то сложнее, чем throw.

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

    Я не разделяю мнения , согласно которому библиотеки таких функций, которые специально предназначены для обработки ошибок в асинхронных функциях, являются кривыми, и сделаны худо, и чрезмерно наполнены, и не могут служить подспорьем. Я держусь противоположного мнения: библиотека async представляется мне удобным средством для управления асинхронными функциями и вообще, и в частности — для обработки ошибок в них.

    Да это и не только моё мнение: мне доводилось ужé подмечать в январе нынешнего (2012) года, что пакет async вошёл в десятку наиболее используемых модулей для движка Node по свéдениям сайта «The Node Toolbox», основывающимся на статистике пакетного менеджера npm.
    Ответ написан
    1 комментарий
  • Библиотека на Js для расстановки точек на изображении и его дальнейшее масштабирование

    Mithgol
    @Mithgol
    Полагаю, что следует использовать Leaflet, соответствующим образом (по документации) настроив параметры конструктора L.TileLayer().

    (Отвечаю с некоторым запозданием, потому что сама библиотека вышла в свет только в мае.)
    Ответ написан
    Комментировать
  • Dual license: Можно ли использовать в коммерческих продуктах jQuery?

    Mithgol
    @Mithgol
    Да.
    Ответ написан
    Комментировать
  • Относительное позиционирование с jQuery?

    Mithgol
    @Mithgol
    Попробуйте использовать (с соответствующими изменениями) метод $(…).position() вместо метода $(…).offset(), если это позволяют условия задачи.
    Ответ написан
  • Произвести модификацию в jQuery UI и получить сжатый вариант?

    Mithgol
    @Mithgol
    Более радикальным методом решения этой проблемы является отказ от стандартного конструктора-упаковщика, предлагаемого на сайте jQuery UI, и переход к собственноручному склеиванию желаемых файлов джаваскрипта встык, с дальнейшей упаковкою их собственноручно же — притом с именно такой упаковкою, которая не изменяет имена методов, так что не создаёт описанной Вами проблемы.

    Для этой цели, например, можно использовать прославленный упаковщик Дина Эдвардса, поставив ему в настройках галочку «Base62 encode», но сняв галочку «Shrink variables».
    Ответ написан
    Комментировать
  • Произвести модификацию в jQuery UI и получить сжатый вариант?

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

    Затем, методом пристального вглядывания, Вы сможете определить в нём имя желаемого метода (сравнив его содержимое с известным Вам содержимым первоначального несжатого кода того же метода и убедившись в их логической одинаковости). Используйте найденное имя в своём вызове, и тем невозбранно достигнете желаемого.
    Ответ написан
    1 комментарий
  • JQuery: методы $.add() и $.append() работают некорректно?

    Mithgol
    @Mithgol
    Как я понимаю, Вы желаете отыскать такой аналог вызова
    $(function(){
       $("p#append").click(function(){
          $(this).append("<div class='div'></div>");
       });
    });
    
    который создавал бы элемент по имени и затем снабжал его классом, а потом присоединял бы к указанному.

    Тогда это вот что:
    $(function(){
       $("p#append").click(function(){
          $('<div />').addClass('div').appendTo($(this));
       });
    });

    Метод .add() не сгодится потому, что он используется для пополнения $-наборов. Например, его можно использовать, чтобы добавить два div-элемента вместо одного:
    $(function(){
       $("p#append").click(function(){
          $('<div />').add('<div />').addClass('div').appendTo($(this));
       });
    });

    Метод .css() не сгодится потому, что он используется для наложения CSS-свойств. Например, вот этот вызов:
    $(function(){
       $("p#append").css('color', 'red');
    });
    налагает свойство
    {color: 'red';}
    Ответ написан
    Комментировать
  • Большая нагрузка на браузер при вкл jquery?

    Mithgol
    @Mithgol
    Похоже, что в Вашем коде при каждом наведении (hover) загружается «Cloud Zoom» из Сети (getscript), что само по себе способно создать колоссальную нагрузку:
    $(document).ready(function(){
       $('#zoom1').hover(function(){
          $.getscript('js/cloud-zoom.1.0.2.min.js', function(){
             testAjax();
          });
       });
    });
    

    Уместно, по меньшей мере, переставить местами обработчики событий, чтобы сперва один раз загружался скрипт «Cloud Zoom», а затем (когда он пришёл) назначался обработчик наведения мыши на иллюстрацию (если $('#zoom1') является именно иллюстрацией):
    $(function(){
       $.getscript('js/cloud-zoom.1.0.2.min.js', function(){
          $('#zoom1').hover(function(){
             testAjax();
          });
       });
    });
    

    В скрипте «Cloud Zoom», судя по его коду, не предусмотрен собственный механизм для приостановки эффекта лупы. Вы, если искали такой механизм, можете попробовать отодрать обработчики событий от иллюстраций и галерей:
    $('.cloud-zoom, .cloud-zoom-gallery').unbind();
    

    После этого можно попробовать перезапускать эффект лупы тем способом, который в самóм плагине «Cloud Zoom» используется в самом начале кода:
    $('.cloud-zoom, .cloud-zoom-gallery').CloudZoom();
    

    Естественно, идеальная работа не гарантируется: это просто напрашивающийся «грязный трюк» («dirty hack»).

    Сразу скажу ещё, что «грязный трюк», может быть, и не нужен ещё: если достаточно того, чтобы плагин «Cloud Zoom» не начинал автоматически набрасываться на все имеющиеся картинки и галереи на странице (то есть скачивать чёртову уйму крупных иллюстраций), а начинал бы действовать только при наведении мыши на картинку, то хватит всего двух шагов.

    Во-первых, отредактируйте используемый код «Cloud Zoom», убрав оттуда автозапуск. В коде джаваскрипт автозапуска идёт в одну строку, но я для красоты напишу его в структурированном виде:
    $(document).ready(function () {
        $('.cloud-zoom, .cloud-zoom-gallery').CloudZoom()
    });
    


    Во-вторых, вместо убранного автозапуска следует вручную написать запуск, срабатывающий при наведении мыши на иллюстрацию или галерею:
    $('.cloud-zoom, .cloud-zoom-gallery').hover(function(){
       $(this).CloudZoom();
    });
    

    Если же окажется, что многократный запуск CloudZoom(), случающийся после каждого наведения мыши, создаёт неприятные эффекты, то можно пометить иллюстрации и галереи некоторой пометкою, и снимать её после запуска CloudZoom():
    $('.cloud-zoom, .cloud-zoom-gallery').addClass('CloudZoomNotRunning').hover(function(){
       var $this = $(this);
       if ($this.is('.CloudZoomNotRunning')){
          $this.CloudZoom().removeClass('CloudZoomNotRunning');
       };
    });
    

    Естественно, весь такой код, на .CloudZoom() основанный, следует запускать только после того, как код плагина «Cloud Zoom» ужé загружен getscript().

    Точно такую же цепочку .addClass(…).hover(…), несомненно, придётся по разу с нуля применять и на каждую такую новую иллюстрацию или галерею, которая добавлена на страницу AJAXом.
    Ответ написан
    1 комментарий
  • Изменение стиля при помощи javascript

    Mithgol
    @Mithgol
    Начнём с того, что раз уж речь идёт о переключении классов, то уместно сразу все стили записать в CSS:
    .bImg { /* сюда вписываем стиль обычного div */ }
    .vImg { /* сюда вписываем стиль div, жмякнутого мышою */ }
    
    Для элементов <div> после этого достаточно указывать классы (class="..." вместо style="...").

    Затем при помощи библиотеки jQuery можно немало упростить себе задачу.

    Во-первых, можно сделать проще HTML-код:
    1. Не придётся вписывать в него обработчики onclick, потому что они будут назначены позже, джаваскриптом.
    2. Не придётся и вписывать в него id, так как jQuery исполняет обработчики в контексте элементов: this указывает в обработчике на жмякнутый элемент.
    Было так:
    <div id="1" style="b-img" onclick="kodimg(id)">...</div>
    <div id="2" style="b-img" onclick="kodimg(id)">...</div>
    <div id="3" style="b-img" onclick="kodimg(id)">...</div>
    <div id="4" style="b-img" onclick="kodimg(id)">...</div>
    <div id="5" style="b-img" onclick="kodimg(id)">...</div>
    

    Стало так:
    <div class="bImg">...</div>
    <div class="bImg">...</div>
    <div class="bImg">...</div>
    <div class="bImg">...</div>
    <div class="bImg">...</div>
    

    Во-вторых, желаемое достигается простым JS-кодом для jQuery:
    $(function(){
       // после загрузки документа назначаем обработчики событий:
       $('div.bImg').click(function(){
          // в обработчике делаем две вещи:
          // 1) находим предыдущий жмякнутый div, отменяем жмякнутость
          $('div.vImg').removeClass('vImg').addClass('bImg');
          // 2) свежежмякнутому div придаём жмякнутость
          $(this).removeClass('bImg').addClass('vImg');
       });
    });
    
    Ответ написан
    2 комментария
  • Оставлять логику PHP или отдавать JavaScript'у?

    Mithgol
    @Mithgol
    Если джаваскрипт в любом случае ужé необходим, то почему бы не использовать его по максимуму, тем разгружая сервер от исполнения кода?
    Ответ написан
    1 комментарий