美文网首页
fixed base64-encoded image is no

fixed base64-encoded image is no

作者: 许一沐 | 来源:发表于2018-04-25 12:37 被阅读204次

    项目中使用 http://github.com/mindmup/bootstrap-wysiwyg 作为邮件内容模版的编辑器,在国内邮箱网页端查看html格式的邮件均无问题,但是在gmail中却出现图片显示不了的问题,谷嫂之后,发现

    base64 encoded image is not showing in gmail 的问题由来已久

    想着换个编辑器,通读bootstrap-wysiwyg代码后发现,其实修改也很简单,替换下内置函数即可,索性操刀进行修改:

    /* http://github.com/mindmup/bootstrap-wysiwyg */
    /*global jQuery, $, FileReader*/
    /*jslint browser:true*/
    (function ($) {
        'use strict';
        
        var readFileIntoDataUrl = function (fileInfo) {
            var loader = $.Deferred(),
                fReader = new FileReader();
            fReader.onload = function (e) {
                loader.resolve(e.target.result);
            };
            fReader.onerror = loader.reject;
            fReader.onprogress = loader.notify;
            fReader.readAsDataURL(fileInfo);
            return loader.promise();
        };
    
        var uploadFile = function (fileInfo) {
            var form = new FormData();
            form.append('xtype', 'emails');
            form.append('file', fileInfo);
            var loader = $.Deferred();
            M.loadingStart('Uploading, please wait a moment ..');
    
            $.ajax({
                type: "POST",
                url: '/ajax/file/upload',
                data: form,
                processData: false,
                contentType: false,
                dataType: "json",
                complete: function (xhr, status, et) {
                    M.loadingStop();
                },
                error: function (xhr, status, et) {
                    console.log(status, et);
                },
                success: function(res){
                    loader.resolve(res);
                }
            });
                
                return loader.promise();
        }; 
    
    
        $.fn.cleanHtml = function () {
            var html = $(this).html();
            return html && html.replace(/(<br>|\s|<div><br><\/div>|&nbsp;)*$/, '');
        };
        $.fn.wysiwyg = function (userOptions) {
            var editor = this,
                selectedRange,
                options,
                toolbarBtnSelector,
                updateToolbar = function () {
                    if (options.activeToolbarClass) {
                        $(options.toolbarSelector).find(toolbarBtnSelector).each(function () {
                            var command = $(this).data(options.commandRole);
                            if (document.queryCommandState(command)) {
                                $(this).addClass(options.activeToolbarClass);
                            } else {
                                $(this).removeClass(options.activeToolbarClass);
                            }
                        });
                    }
                },
                execCommand = function (commandWithArgs, valueArg) {
                    var commandArr = commandWithArgs.split(' '),
                        command = commandArr.shift(),
                        args = commandArr.join(' ') + (valueArg || '');
                    document.execCommand(command, 0, args);
                    updateToolbar();
                },
                bindHotkeys = function (hotKeys) {
                    $.each(hotKeys, function (hotkey, command) {
                        editor.keydown(hotkey, function (e) {
                            if (editor.attr('contenteditable') && editor.is(':visible')) {
                                e.preventDefault();
                                e.stopPropagation();
                                execCommand(command);
                            }
                        }).keyup(hotkey, function (e) {
                            if (editor.attr('contenteditable') && editor.is(':visible')) {
                                e.preventDefault();
                                e.stopPropagation();
                            }
                        });
                    });
                },
                getCurrentRange = function () {
                    var sel = window.getSelection();
                    if (sel.getRangeAt && sel.rangeCount) {
                        return sel.getRangeAt(0);
                    }
                },
                saveSelection = function () {
                    selectedRange = getCurrentRange();
                },
                restoreSelection = function () {
                    var selection = window.getSelection();
                    if (selectedRange) {
                        try {
                            selection.removeAllRanges();
                        } catch (ex) {
                            document.body.createTextRange().select();
                            document.selection.empty();
                        }
                        selection.addRange(selectedRange);
                    }
                },
                insertFiles = function (files) {
                    editor.focus();
                    $.each(files, function (idx, fileInfo) {
                        if (/^image\//.test(fileInfo.type)) {
                            /*
                            POST /ajax/file/upload
                            Content-Disposition: form-data; name="file"; filename=
                            success: 
                            {"link":"http:\/\/me.co\/images\/\/bsfiles\/24-1ff1\/sm\/eac.jpeg"}
                            failed:
                            {"error": "error msg"}
                             */
                            $.when(uploadFile(fileInfo)).done(function(res){
                                console.warn(res)
                                if (res.error) {
                                    alert(res.error);
                                }else {
                                    execCommand('insertimage', res.link);
                                }
    
                            }).fail(function (e) {
                                options.fileUploadError("file-reader", e);
                            });
    
                            // $.when(readFileIntoDataUrl(fileInfo)).done(function (dataUrl) {
                                // 调用
                                // execCommand('insertimage', dataUrl);
                            // }).fail(function (e) {
                            //  options.fileUploadError("file-reader", e);
                            // });
                        } else {
                            options.fileUploadError("unsupported-file-type", fileInfo.type);
                        }
                    });
                },
                markSelection = function (input, color) {
                    restoreSelection();
                    if (document.queryCommandSupported('hiliteColor')) {
                        document.execCommand('hiliteColor', 0, color || 'transparent');
                    }
                    saveSelection();
                    input.data(options.selectionMarker, color);
                },
                bindToolbar = function (toolbar, options) {
                    toolbar.find(toolbarBtnSelector).click(function () {
                        restoreSelection();
                        editor.focus();
                        execCommand($(this).data(options.commandRole));
                        saveSelection();
                    });
                    toolbar.find('[data-toggle=dropdown]').click(restoreSelection);
    
                    toolbar.find('input[type=text][data-' + options.commandRole + ']').on('webkitspeechchange change', function () {
                        var newValue = this.value; /* ugly but prevents fake double-calls due to selection restoration */
                        this.value = '';
                        restoreSelection();
                        if (newValue) {
                            editor.focus();
                            execCommand($(this).data(options.commandRole), newValue);
                        }
                        saveSelection();
                    }).on('focus', function () {
                        var input = $(this);
                        if (!input.data(options.selectionMarker)) {
                            markSelection(input, options.selectionColor);
                            input.focus();
                        }
                    }).on('blur', function () {
                        var input = $(this);
                        if (input.data(options.selectionMarker)) {
                            markSelection(input, false);
                        }
                    });
    
                    toolbar.find('a.salution-text').click(function(){
                        restoreSelection();
    
                        editor.focus();
    
                        execCommand('insertText', $(this).attr('data-text'));
    
                        saveSelection();
                    });
    
                    toolbar.find('input[type=file][data-' + options.commandRole + ']').change(function () {
                        restoreSelection();
                        if (this.type === 'file' && this.files && this.files.length > 0) {
                            insertFiles(this.files);
                        }
                        saveSelection();
                        this.value = '';
                    });
                },
                initFileDrops = function () {
                    editor.on('dragenter dragover', false)
                        .on('drop', function (e) {
                            var dataTransfer = e.originalEvent.dataTransfer;
                            e.stopPropagation();
                            e.preventDefault();
                            if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) {
                                insertFiles(dataTransfer.files);
                            }
                        });
                };
            options = $.extend({}, $.fn.wysiwyg.defaults, userOptions);
            toolbarBtnSelector = 'a[data-' + options.commandRole + '],button[data-' + options.commandRole + '],input[type=button][data-' + options.commandRole + ']';
            bindHotkeys(options.hotKeys);
            if (options.dragAndDropImages) {
                initFileDrops();
            }
            bindToolbar($(options.toolbarSelector), options);
            editor.attr('contenteditable', true)
                .on('mouseup keyup mouseout', function () {
                    saveSelection();
                    updateToolbar();
                });
            $(window).bind('touchend', function (e) {
                var isInside = (editor.is(e.target) || editor.has(e.target).length > 0),
                    currentRange = getCurrentRange(),
                    clear = currentRange && (currentRange.startContainer === currentRange.endContainer && currentRange.startOffset === currentRange.endOffset);
                if (!clear || isInside) {
                    saveSelection();
                    updateToolbar();
                }
            });
            return this;
        };
        $.fn.wysiwyg.defaults = {
            hotKeys: {
                'ctrl+b meta+b': 'bold',
                'ctrl+i meta+i': 'italic',
                'ctrl+u meta+u': 'underline',
                'ctrl+z meta+z': 'undo',
                'ctrl+y meta+y meta+shift+z': 'redo',
                'ctrl+l meta+l': 'justifyleft',
                'ctrl+r meta+r': 'justifyright',
                'ctrl+e meta+e': 'justifycenter',
                'ctrl+j meta+j': 'justifyfull',
                'shift+tab': 'outdent',
                'tab': 'indent'
            },
            toolbarSelector: '[data-role=editor-toolbar]',
            commandRole: 'edit',
            activeToolbarClass: 'btn-info',
            selectionMarker: 'edit-focus-marker',
            selectionColor: 'darkgrey',
            dragAndDropImages: true,
            fileUploadError: function (reason, detail) { console.log("File upload error", reason, detail); }
        };
    }(window.jQuery));
    
    

    相关文章

      网友评论

          本文标题:fixed base64-encoded image is no

          本文链接:https://www.haomeiwen.com/subject/ingelftx.html