MavonEditor——使用自定义工具栏按钮插入文本片段

需求
我需要快速且便利的在文章中插入一个视频
直接将视频上传至我的服务器不现实,硬盘资源很宝 贵的
然后我想到了图床的应用方法,同样可以套用到视频存储上
即:将视频上传至视频网站,然后引用网站的链接
优点:省时、省力、省资源、省钱
缺点:不稳定,视频有随时被删除的风险

目标平台:优酷、B站等

如何在Markdown中插入视频

这里参考了:Markdown中如何插入视频 > iframe?
视频都是在首页随便找的,而且CSDN已经不支持这种方式
Blibili

<div align=center width=100%>
	<iframe 
	    height=500
	    width=80% 
	    src='//player.bilibili.com/player.html?aid=845937343&bvid=BV1V54y157Vm&cid=349069295&page=1' 
	    frameborder=0 
	    'allowfullscreen'>
	</iframe>
</div>

优酷

<div align=center width=100%>
	<iframe 
	    height=500
	    width=80% 
	    src='https://player.youku.com/embed/XNTE2Mjc0Njg0MA==' 
	    frameborder=0 
	    'allowfullscreen'>
	</iframe>
</div>

关于MavonEditor自定义工具栏

官方给出的只有一点点的 相关例子只有一个图片上传功能,且实现的方法并没有涉及自定义工具栏
所以可以参考:mavon-editor 自定义工具栏按钮,实现文件上传功能(或其他自定义功能)。
以下是完整代码

<template>
  <div class="editor-box">
  	<!--mavon-editor的主体-->
    <mavon-editor  
      :toolbars="toolbars"   
      :ishljs="true"    
      style="height:100%"   
      v-model="value"       
      @change="change"   
      ref=md
    >
      <!-- 引用视频链接的自定义按钮 -->
      <template v-slot:left-toolbar-after>
      <!--点击按钮触发的事件是打开表单对话框-->
        <el-button type="text" @click="dialogFormVisible=true" aria-hidden="true" class="op-icon fa" title="插入视频资源">
          <i class="el-icon-video-camera-solid" />
        </el-button>
      </template>
    </mavon-editor>

    <!-- 插入视频链接的dialog提示框,表单对话框 -->
    <el-dialog title="插入视频资源" :visible.sync="dialogFormVisible">
      <el-form :model="form">
        <el-form-item label="视频链接" :label-width="formLabelWidth">
          <el-input v-model="form.link" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="链接类型" :label-width="formLabelWidth">
          <el-select v-model="form.region" placeholder="请选择链接类型">
            <el-option label="iframe标签" value="iframe"></el-option>
            <el-option label="url链接" value="url"></el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <!--单机确定按钮后触发 videoLink事件函数,开始格式化链接格式并插入到文本域-->
        <el-button type="primary" @click="videoLink">确 定</el-button>
      </div>
    </el-dialog>

    <!-- 错误提示框 -->
    <el-dialog
      title="提示"
      :visible.sync="dialogVisible"
      width="30%"
      id="link-error">
      <span>视频链接格式错误,请重新确认后再输入!</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
      </span>
    </el-dialog>
  
  </div>
</template>

<script>
export default {
  data() {
    return {
        toolbars: {
        // 工具栏设定可以参考官方文档
        },
        value: '',	// 存放 mavon-editor 文本域的内容
        dialogFormVisible: false,	// 用于控制表单对话框的开启和关闭
        dialogVisible: false,		// 用于控制错误提示对话框的开启和关闭
        formLabelWidth: '120px',	// 设定表单对话框内表单是宽度
        form: {		// 表单对话框内表单的数据
          link: '',
          region: ''
        }
    }
  },
  methods: {
  	// 格式化视频链接并插入到文本域的函数
    videoLink() {
    	// 准备链接模板
      let linkFrame = '';
      let linkFrameStart = "<div align=center width=100%><iframe height=500 width=80% src='"
      let linkFrameEnd = "' frameborder=0 'allowfullscreen'></iframe></div>"
      // 创建一个div盒子,为提取src做准备
      var box = document.createElement("div");
      // 将原始链接插入到盒子中
      box.innerHTML=this.form.link;
      // 判断不同的视频原链接类型
      if(this.form.region == "url"){
        linkFrame = linkFrameStart + this.form.link + linkFrameEnd;
      }else if(this.form.region == "iframe" && box.getElementsByTagName("iframe").length > 0) {
        // 从iframe标签中提取src属性
        linkFrame = linkFrameStart + box.getElementsByTagName("iframe")[0].getAttribute("src") + linkFrameEnd;
      }else {
        // 原始链接格式错误时弹出错误提示
        this.dialogFormVisible=false;
        this.dialogVisible=true;
      }
      // 复原表单文本框内容
      this.form.link = '';
      this.form.region = '';

      // 获取文本域中当前光标起始位置、结束位置以及滚动条位置(滚动条位置我认为没有必要,如有需要可以自己取消注释)
      let textarea = document.getElementsByClassName("auto-textarea-input")[0];
      let posStart = textarea.selectionStart;
      let posEnd = textarea.selectionEnd;
      // let posScroll = document.getElementsByClassName("v-note-edit")[0].scrollTop;
      // 获取文本域中未选中的的前半部分和后半部分,以被选中内容起始和结束位置做分割点
      let subStart = this.$refs.md.d_value.substring(0, posStart);
      let subEnd = this.$refs.md.d_value.substring(posEnd, this.$refs.md.d_value.length);
      // 拼接并替换文本域内容
      this.$refs.md.d_value = subStart + '\n' + linkFrame + '\n' + subEnd;
      // document.getElementsByClassName("v-note-edit")[0].scrollTop = posScroll;
      
      // 关闭对话框
      this.dialogFormVisible = false;
    }
  },

}
</script>

<style>
</style>

效果展示





————————————————
版权声明:本文为CSDN博主「voidplus」的原创文章,遵循CC 4.0 BY-SA版权协议
原文链接:https://blog.csdn.net/qq_39909290/article/details/117642129

posted @ 2022-03-02 16:17  seekHelp  阅读(646)  评论(0编辑  收藏  举报