Ответы пользователя по тегу JavaScript
  • Как создать свое событие в jQuery?

    @cmx Автор вопроса
    Очевидно и по существу, никакими обсерверами, биндами и триггерами здесь не пахнет.
    Решение оказалось не самое тривиальное, но архитектурно корректное и звучит как "Специальные события jQuery".
    В рамках моей задачи, рабочая реализация выглядит следующим образом:
    $.event.special.dblrightclick = {
    	setup : function(data, namespaces) {
    		var e = $(this);
    		e.bind("contextmenu", $.event.special.dblrightclick.handler);
    		e.data("x", null);
    		e.data("y", null);
    		e.data("time", null);
    		e.data("limit", data || 400);
    	},
    
    	teardown : function(namespaces) {
    		$(this).unbind("contextmenu", $.event.special.dblrightclick.handler);
    	},
    
    	handler : function (event) {
    		event.preventDefault();
    		var e = $(this);
    
    		if (e.data("x") == event.screenX && e.data("y") == event.screenY
    			&& (event.timeStamp - e.data("time")) < e.data("limit")) {
    			e.data("x", null);
    			e.data("y", null);
    			e.data("time", null);
    			event.type = "dblrightclick";
    			$.event.dispatch.apply(this, arguments);
    		} else {
    			e.data("x", event.screenX);
    			e.data("y", event.screenY);
    			e.data("time", event.timeStamp);
    		}
    	}
    };


    И, соответственно, ее использование:
    $("#widget").on("dblrightclick", ".button", function() {
    	alert("dblrightclick fired");
    });


    А также управление единственным параметром задержкой:
    $("#widget").on("dblrightclick", ".button", 200, function() {
    	alert("dblrightclick fired");
    });


    Очевидно, что данный код является расширением базового фреймворка и не имеет никакого отношения к бизнес-логике приложения. Как следствие - данный код можно подключать бесконфликтно к разным проектам.

    UPD Полное решение: https://github.com/comm1x/jquery-event-dblrightclick
    Ответ написан
    Комментировать
  • Как средствами php, css и js лучше всего реализовать онлайн-обработка изображений?

    @cmx
    Мой совет аналогичен предыдущему, но советовал бы imagemagick, т.к. лично имею опыт работы с ним, а также php обертку для него - phmagick, от которой поняв весь процесс позже можно будет отказаться.
    Кратко, все сводится к тому, что php вызывает методом exec() утилиту операционной системы, которая уже обрабатывает картинку, но не сам php, и уж тем более css js html...
    По той же песне можно работать и с видео через ffmpeg.
    Рабочие функции для обрезки и ресайза картинок, настрой и подставь свои пути библиотеки (win style: C:/programs/imagemagick).
    /**
     * Crop images
     * @param $file string Path to cropping file
     * @param $left int Pixels to left margin
     * @param $top int Pixels to top margin
     * @param $width int Width of final images in pixels
     * @param $height int Height of final images in pixels
     */
    public static function crop($file, $left, $top, $width, $height) {
    	exec(strtr('{imagick}convert {file} -gravity NorthWest -crop {w}x{h}+{l}+{t} {file} 2>&1', array(
    		'{imagick}' => '/usr/bin',
    		'{file}' => str_replace(' ', '\\ ', realpath($file)),
    		'{l}' => $left,
    		'{t}' => $top,
    		'{w}' => $width,
    		'{h}' => $height,
    	)), $out, $var);
    }
    
    /**
     * Change resolution of image
     * @param $file string Path to image
     * @param $size int Value of image's sides in pixels
     * @throws Exception\BaseException
     * @throws Exception\ImagemagickException
     */
    public static function resize($file, $size) {
    	if (! is_numeric($size)) {
    		throw new BaseException;
    	}
    
    	exec(strtr('{imagick}convert -scale "{resolution}>" -quality {quality} -strip "{target}" "{target}" 2>&1', array(
    		'{imagick}' => '/usr/bin',
    		'{resolution}' => $size.'x'.$size,
    		'{quality}' => 95),
    		'{target}' => $file,
    	)), $out, $var);
    
    	if ($var > 0) {
    		$msg = null;
    		if ($var === 1) {
    			$msg .= 'Probably incorrect path to the library';
    		}
    
    		throw new ImagemagickException('Imagemagick error #'.$var.' '.$msg);
    	}
    }
    Ответ написан
    Комментировать