javascript Примерприкрепленияизображений

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript Примерприкрепленияизображений相关的知识,希望对你有一定的参考价值。

/**
 * Обеспечивает вложение изображений в переписку
 * @author Elovskiy I.V. <i.elovsky@starliner.ru> <elovskigor@gmail.com>
 * @type {Object}
 */
var broadcastAttachments = {

    init: function () {
        this.initAppVars();
        this.initAppListeners();
        this.initContentEditableDiv();
        this.addPasteHandler();
    },
    /**
     * Инициализация переменных
     */
    initAppVars: function () {
        this.broadcastMsgElem = $('#broadcast_message');
        this.listeners = {};
        this.handlers = {};
        this.broadcastId = null;
        this.companyId = null;
        this.broadcastMethods = null;
        this.broadcastIndicatorElem = null;
        this.userAgent = detect.parse(navigator.userAgent);
    },
    /**
     * Инициализация прослушек
     */
    initAppListeners: function () {
        this.addBtnListener();
        this.addInputListener();
    },
    /**
     * Добавляет прослушку
     * @param element
     * @param event
     * @param handler
     * @param capture
     * @returns {number} Идентификатор прослушки
     */
    addListener: function (element, event, handler, capture) {
        var i = Object.keys(this.listeners).length;
        element.addEventListener(event, handler, capture);
        this.listeners[i] = {
            element: element,
            event: event,
            handler: handler,
            capture: capture
        };
        return i;
    },
    /**
     * Удаляет прослушку по идентификатору
     * @param id
     */
    removeListener: function (id) {
        var h;
        if (id in this.listeners) {
            h = this.listeners[id];
            h.element.removeEventListener(h.event, h.handler, h.capture);
            delete this.listeners[id];
        }
    },
    addBtnListener: function () {
        var attachImageBtn = document.getElementById('broadcast_attach_image_btn');
        this.handlers['attachImageBtn'] = this.addListener(attachImageBtn, 'click', broadcastAttachments.actionAttach, false);
    },
    addInputListener: function () {
        var inputFile = $('#broadcast_file_uploader input')[0];
        this.handlers['inputFile'] = this.addListener(inputFile, 'change', broadcastAttachments.actionInput, false);
    },
    /**
     * Инициализация вспомогательного div-контейнера для IE (вставка из буфера)
     */
    initContentEditableDiv: function() {
        // Только для IE
        if (['IE'].indexOf(this.userAgent.browser.family) !== -1) {
            var div = $('<div />', {
                id: 'broadcast_message_ced',
                contenteditable: true,
                css: {opacity: '0', maxWidth: '0', maxHeight: '0', width: '0', height: '0', minWidth: '0', minHeight: '0', border: '0'}
            });
            $('#broadcast_attach_img_textarea_wrapper').append(div);
            this.contentEditableDiv = $('#broadcast_message_ced');
        }
    },
    /**
     * Обработка события paste
     */
    addPasteHandler: function () {
        this.handlers['pasteHandler'] = this.addListener(this.broadcastMsgElem[0], 'paste', broadcastAttachments.pasteHandler, false);

        // Для IE
        if (['IE'].indexOf(this.userAgent.browser.family) !== -1) {
            this.handlers['contentEditableDivPasteHandler'] = this.addListener(this.contentEditableDiv[0], 'paste', broadcastAttachments.pasteHandler, false);
            $(this.broadcastMsgElem[0]).on('keydown', function (event) {
                if ((event.ctrlKey && event.keyCode === 86) || (event.shiftKey && event.keyCode === 45)) {
                    $(broadcastAttachments.contentEditableDiv).empty();
                    $(broadcastAttachments.contentEditableDiv).focus();
                }
            });
        }
    },
    /**
     * Вызовет клик по label (input type file) для открытия диалога выбора файлов
     */
    actionAttach: function () {
        $('#broadcast_file_uploader label').trigger('click');
    },
    /**
     * Обработка выбранных файлов
     * @param e
     */
    actionInput: function (e) {
        var files = e.target.files;
        if (files.length === 0) return;

        var result = broadcastAttachments.checkRequirements(files);
        if (result.errorType === false && result.errorSize === false) {
            broadcastAttachments.createWindow(files);
        } else {
            broadcastAttachments.createErrorWindow(result);
        }
    },
    /**
     * Создаст окно с ошибкой
     * @param errors
     */
    createErrorWindow: function (errors) {
        var buttons = {};
        buttons[_('ОК')] = true;
        var errorMsg = {
            errorType: _('Только изображения, пожалуйста'),
            errorSize: _('Размер файла не должен превышать 2 мегабайта')
        };
        $.slPrompt((errors.errorType === true) ? errorMsg['errorType'] : errorMsg['errorSize'], {
            close: true,
            title: _('Ошибка'),
            prefix: 'err_',
            buttons: buttons
        });
    },
    /**
     * Проверка файлов
     * Файл должен быть изображением и не более 2 Мб
     * @param files
     */
    checkRequirements: function (files) {
        var result = {};
        result.errorType = false;
        result.errorSize = false;
        for (var k = 0; k < files.length; k++) {
            // Только изображения
            if (!files[k].type.match('image.*')) {
                result.errorType = true;
            }
            // Не более 2Мб
            if (files[k].size > 2097152) {
                result.errorSize = true;
            }
        }
        return result;
    },
    /**
     * Создает окно с предварительным просмотром изображения и вводом комментария
     * @param files
     */
    createWindow: function (files) {
        var buttons = {};
        buttons[_('Загрузить')] = true;
        buttons[_('Отмена')] = false;
        $.slPrompt('<div id="broadcast_file_uploader_thumbs" class="broadcast_file_uploader_thumbs"></div>', {
            close: true,
            title: _('Подтвердите действие'),
            prefix: 'bf_',
            buttons: buttons,
            callback: function (value, message, fields) {
            },
            submit: function (value, message, fields) {
                if (value === true) {
                    var comment = $('#broadcast_image_comment').val();
                    broadcastAttachments.broadcastMethods._addMessage(_('Загрузка изображения...'));
                    var formData;
                    var deferred = [];
                    var errors = [];
                    formData = new FormData();
                    formData.append('path', broadcastAttachments.companyId + '/broadcast/' + broadcastAttachments.broadcastId);
                    for (var i = 0; i < files.length; i++) {
                        formData.append('qqfile', files[i], (files[i].name) ? files[i].name : 'image.png');
                        deferred.push(
                            $.ajax({
                                url: '/File/ajaxUpload',
                                data: formData,
                                processData: false,
                                contentType: false,
                                type: 'post',
                                dataType: 'json',
                                success: function (data) {
                                    bindingsUtil.updateAjaxResponse(data);
                                    if (data.success === true) {
                                        var filePath = data.user_dir + '/' + data.filename;
                                        broadcastAttachments.sendMessage(comment, '/File/show' + filePath, data.filename);
                                    } else if (data.error) {
                                        errors.push(data.error);
                                    }
                                }
                            })
                        );
                    }
                    $.when.apply($, deferred).done(function () {
                        if (errors.length === 0) {
                            $.prompt.closePrompt($('#loadingbox'), null, null, null, null);
                        } else {
                            var errorMsg = errors.reduce(function (str, current, index, errors) {
                                return ((errors.length > 1) ? ((index + 1) + '. ') : '') + str + current + '<br />';
                            }, '');
                            $.showerror(errorMsg);
                            broadcastAttachments.clearInputFile();
                        }
                    });
                } else {
                    broadcastAttachments.clearInputFile();
                }
            },
            loaded: function () {
                broadcastAttachments.actionFileSelect(files);
                var parent = $('#broadcast_file_uploader_thumbs').parent();
                var commentDiv = $('<div />', {});
                var commentTextArea = $('<textarea />', {
                    id: 'broadcast_image_comment',
                    rows: 3,
                    placeholder: _('Добавить комментарий (не обязательно)')
                });
                $(commentTextArea).addClass('form-control');
                $(commentDiv).append(commentTextArea);
                $(parent).append(commentDiv);
                var text = $.trim($(broadcastAttachments.broadcastMsgElem).val());
                if (text !== '') {
                    $(commentTextArea).val(text);
                }
            }
        });
    },
    /**
     * Создает превью изображений
     * @param files
     */
    actionFileSelect: function (files) {
        for (var i = 0, f; f = files[i]; i++) {
            var reader = new FileReader();
            reader.onload = (function (theFile) {
                return function (e) {
                    var div = document.createElement('div');
                    div.className = 'broadcast_file_uploader_thumb';
                    div.innerHTML = ['<img class="broadcast_file_uploader_img" title="', (theFile.name), '" src="', e.target.result, '" />'].join('');
                    document.getElementById('broadcast_file_uploader_thumbs').insertBefore(div, null);
                };
            })(f);
            // Чтение изображений в виде data URL.
            reader.readAsDataURL(f);
        }
    },
    /**
     * Очистит input от выбранных файлов
     */
    clearInputFile: function () {
        var inputFile = $('#broadcast_file_uploader input');
        $(inputFile).attr('type', '');
        $(inputFile).attr('type', 'file');
    },
    /**
     * Подготовит DOM и отправит на сохранение в БД
     * @param comment - комментарий
     * @param imgPath - путь к файлу
     * @param imgName - имя файла
     */
    sendMessage: function (comment, imgPath, imgName) {
        $(broadcastAttachments.broadcastMsgElem).val('');
        this.clearInputFile();

        var commentDiv = $('<div />', {text: comment});
        var wrapperMsg = $('<div />', {});
        var linkImgDiv = $('<div />', {});
        $(linkImgDiv).addClass('broadcast_message_img_div');
        var link = $('<a />', {href: imgPath, target: '_blank'});
        var img = $('<img />', {alt: imgName, src: imgPath});
        $(img).addClass('broadcast_message_img');
        $(link).append(img);
        $(linkImgDiv).append(link);
        $(wrapperMsg).append(commentDiv, linkImgDiv);

        this.broadcastMethods._send(this.broadcastIndicatorElem, this.broadcastId, $(wrapperMsg).html());
        $(this.broadcastMsgElem).val('');
    },
    /**
     * Перехватывает вставку из буфера обмена
     * @param e
     */
    pasteHandler: function (e) {
        // Если поддерживается event.clipboardData (Chrome|Opera|Safari|Firefox)
        if (e.clipboardData) {
            // Получаем все содержимое буфера
            var items = e.clipboardData.items;
            if (items) {
                // Находим изображение
                for (var i = 0; i < items.length; i++) {
                    if (items[i].type.indexOf('image') !== -1) {
                        // Представляем изображение в виде файла
                        var blob = items[i].getAsFile();
                        var result = broadcastAttachments.checkRequirements([blob]);
                        if (result.errorType === false && result.errorSize === false) {
                            broadcastAttachments.createWindow([blob]);
                        } else {
                            broadcastAttachments.createErrorWindow(result);
                        }
                    }
                }
            }
        } else {
            // IE
            var waitToPastInterval = setTimeout(function () {
                if ($(broadcastAttachments.contentEditableDiv).children().length > 0) {
                    clearInterval(waitToPastInterval);
                    // Поиск изображений
                    var image = $(broadcastAttachments.contentEditableDiv).find('img');
                    if (image.length > 0) {
                        var dataURI = $(broadcastAttachments.contentEditableDiv).find('img')[0].src;
                        var blob = broadcastAttachments.dataURItoBlob(dataURI);
                        var result = broadcastAttachments.checkRequirements([blob]);
                        if (result.errorType === false && result.errorSize === false) {
                            broadcastAttachments.createWindow([blob]);
                        } else {
                            broadcastAttachments.createErrorWindow(result);
                        }
                    } else {
                        // Изображения не найдены, заберём текст
                        var text = window.clipboardData.getData("text");
                        $(broadcastAttachments.broadcastMsgElem).val(text);
                        $(broadcastAttachments.broadcastMsgElem).focus();
                    }
                }
                $(broadcastAttachments.contentEditableDiv).empty();
            }, 1);
        }

    },
    /**
     * Конвертирует строку dataURI в blob-представление
     * @param dataURI
     * @returns {Blob}
     */
    dataURItoBlob: function (dataURI) {
        var byteString = atob(dataURI.split(',')[1]);
        var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
        var ab = new ArrayBuffer(byteString.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
        return new Blob([ab], {type: mimeString});
    },
};

以上是关于javascript Примерприкрепленияизображений的主要内容,如果未能解决你的问题,请参考以下文章

javascript Анимациячиселприпрокрутке

javascript Активацияэлементовменюприпрокрутке

css 1)Примеркрасивойтениподблоком。其他2,Примертенидлятекста。

javascript Экземплярформыпоидентификатору#ExtJS

javascript ОтменяемкликпоВСЕМссылкам,скриптдляверстки

text Микроразметкадляпоисковиковпример