margox / braft-editor

美观易用的React富文本编辑器,基于draft-js开发
MIT License
4.61k stars 593 forks source link

initialContent为HTML内容时,并且存在img标签时会报错 #8

Closed miser closed 7 years ago

miser commented 7 years ago

initialContent为HTML内容时,并且存在img标签时会报错,如下

const editorProps = {
            height: 500,
            contentFormat: 'html',
            initialContent: '<div><img /></div><p></p>',
            onHTMLChange: this.handleHTMLChange,
            media: {
                image: true, // 开启图片插入功能
                video: false, // 开启视频插入功能
                audio: false, // 开启音频插入功能
                validateFn: null, // 指定本地校验函数,说明见下文
                uploadFn: this.uploadFn.bind(this) // 指定上传函数,说明见下文
            },
            controls: [
                'bold', 'italic', 'underline', 'strike-through', 'text-align', 'split',
                'headings', 'list_ul', 'list_ol', 'blockquote', 'split',
                'link', 'media'
            ]
        }

vendor.bundle.js:392 Uncaught Error: Unknown DraftEntity key: 1. at invariant (vendor.bundle.js:392) at Object.__get (app.bundle.js:7263) at ContentState.getEntity (app.bundle.js:7933) at app.bundle.js:51105 at findRangesImmutable (app.bundle.js:7004) at ContentBlock.findEntityRanges (app.bundle.js:6281) at r (app.bundle.js:51104) at app.bundle.js:53940 at Array.forEach () at CompositeDraftDecorator.getDecorations (app.bundle.js:53928)

margox commented 7 years ago

是直接报错导致编辑器不能显示出来,还是编辑器能显示出来,之后执行了例如插入图片、粘贴等的操作之后报错的? 我这边用你的配置,没出现报错。 handleHTMLChange这个方法的内容是什么? 另外你试试给img指定一个src试试?

miser commented 7 years ago

@margox 加载初始内容的时候就报错了。 相关版本: braft-editor v1.1.4 react v15.6.2 draft-js v0.10.2 draft-convert v2.0.0

指定src貌似也没用,我刚刚试了试在初始化内容时加入link,也会有报错

import React from 'react'
import ReactDOM from 'react-dom'

// 引入编辑器以及编辑器样式
// import BraftEditor from 'braft-editor/src/index.jsx';
import  BraftEditor  from 'braft-editor';
require('braft-editor/dist/braft.css');

class MyEditor extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            content: null
        }
    }
    uploadFn(param) {
        const { uploadEditorImageToServer } = this.props;
        const { dispatch } = this.props.store;
        uploadEditorImageToServer(param, dispatch)
    }
    render() {
        var { content } = this.props;
        const editorProps = {
            height: 500,
            contentFormat: 'html',
            initialContent: '<p>1<a href="dada" target="">3</a>2</p>',
            onChange: this.handleChange,
            // onHTMLChange: this.handleHTMLChange,
            media: {
                image: true, // 开启图片插入功能
                video: false, // 开启视频插入功能
                audio: false, // 开启音频插入功能
                validateFn: null, // 指定本地校验函数,说明见下文
                uploadFn: this.uploadFn.bind(this) // 指定上传函数,说明见下文
            },
            controls: [
                'bold', 'italic', 'underline', 'strike-through', 'text-align', 'split',
                'headings', 'list_ul', 'list_ol', 'blockquote', 'split',
                'link', 'media'
            ]
        }

        return (
            <div className="editor-desc">
                <BraftEditor {...editorProps} />
            </div>
        )

    }
    handleChange = (content) => {
        console.log(content)
    }
    // handleHTMLChange = (html) => {
    //     console.log(html)
    //     const { changeEditor, dispatch } = this.props
    //     changeEditor(html, dispatch);
    // }

}
export default MyEditor;

我把 initialContent 改为 initialContent :'<p>1<a href="dada" target=""></a>2</p>' 就不报错了

miser commented 7 years ago

用raw格式就一切没问题

margox commented 7 years ago

我这边完全粘贴你的代码,然后安装跟你一样版本的依赖,也没出现报错,没法排查原因,略尴尬。 你试试升级draft-js到0.10.3试试? 另外你已经fork了这个项目,如果方便的话,能直接引用开发环境的braft-editor来看看报错是在哪里产生的吗?

margox commented 7 years ago

刚才修改了一下对draft-convert的调用逻辑,发布了1.1.5版本,你更新一下看看能不能解决问题?

miser commented 7 years ago

神奇般的好了,谢谢。 很奇怪,我在 example 里面 <p>1<a href="dada" target="">3</a>2</p> 貌似也不报错,但是放到项目中就有问题,可能我遗漏了什么细节。

对draft-js不懂,帮不上什么忙。