html
大约 7 分钟
css
样式排版
https://github.com/sofish/Typo.css
获取视频时长
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Title</title>
    <link rel="stylesheet" href="{{ mix("css/app.css") }}">
</head>
<body>
<div class="container">
    <div class="row">
        <div class="col-md-6">
            <form action="@">
                <input type="file" id="video">
                <div id="infos"></div>
{{--                <button type="button" id="submit" class="btn btn-success btn-block">上传</button>--}}
            </form>
        </div>
    </div>
</div>
<script src="{{ mix("/js/app.js") }}"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
    
    var myVideos = [];
    window.URL = window.URL || window.webkitURL;
    document.getElementById('video').onchange = setFileInfo;
    function setFileInfo() {
        var files = this.files;
        myVideos.push(files[0]);
        var video = document.createElement('video');
        video.preload = 'metadata';
        video.onloadedmetadata = function() {
            window.URL.revokeObjectURL(video.src);
            var duration = video.duration;
            myVideos[myVideos.length - 1].duration = duration;
            updateInfos();
        }
        video.src = URL.createObjectURL(files[0]);
    }
    function updateInfos() {
        var infos = document.getElementById('infos');
        infos.textContent = "";
        for (var i = 0; i < myVideos.length; i++) {
            infos.textContent += myVideos[i].name + " duration: " + (myVideos[i].duration/60).toPrecision(3) + '分\n';
        }
    }
</script>
</body>
</html>
手机播放m3u8视频
<video class="vjs-tech" width="100%" height="100%"
    controls="controls" autoplay="autoplay"
    x-webkit-airplay="true" x5-video-player-fullscreen="true"
    preload="auto" playsinline="true" webkit-playsinline
    x5-video-player-typ="h5">
    <source type="application/x-mpegURL" src="http://dlhls.cdn.zhanqi.tv/zqlive/22578_yKdJM.m3u8">
</video>
<iframe width="100%" height="100%" src="https://streamtape.com/e/LDjWpakZmpHRX9X" frameborder="0" border="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen="allowfullscreen" mozallowfullscreen="mozallowfullscreen" msallowfullscreen="msallowfullscreen" oallowfullscreen="oallowfullscreen" webkitallowfullscreen="webkitallowfullscreen" referrerpolicy="no-referrer"></iframe>
资源采集规则
列表接收参数
| key | value | 说明 | 
|---|---|---|
| ac | list / videolist | 视频列表 | 
| t | 类别ID | |
| wd | 搜索关键字 | |
| h | 几小时内的数据 | |
| pg | 页码 | 
TinyMCE配置基本使用
中文网站:http://tinymce.ax-z.cn/
入门案例
<script>
    tinymce.init({
        selector: '#mytextarea',
        mobile: {
            menubar: true
        },
        language:'zh_CN',//注意大小写
        language_url : 'tinymce/langs/zh_CN.js',
        // toolbar_mode: "wrap",
        statusbar: false, //编辑器底部隐藏状态栏
        toolbar: "undo redo emoticons| styleselect alignleft aligncenter alignright bold italic code | image media | preview forecolor ",
        plugins: "emoticons image imagetools media code preview autolink",
        preview_styles: false,
        contextmenu: "bold copy autolink", //编辑器里面右键操作
        draggable_modal: true,
        menubar:false,
        // 工具栏1
        // menu: {
        //     file: {title: '文件', items: 'newdocument'},
        //     edit: {title: '编辑', items: 'undo redo | cut copy paste pastetext | selectall'},
        //     insert: {title: '插入', items: 'link media | template hr'},
        //     view: {title: '查看', items: 'visualaid'},
        //     format: {title: '格式', items: 'bold italic underline strikethrough superscript subscript | formats | removeformat'},
        //     table: {title: '表格', items: 'inserttable tableprops deletetable | cell row column'},
        //     tools: {title: '工具', items: 'spellchecker code'}
        // }
    });
</script>
配置工具项
所属插件为核心的项为基本包里自带的功能,直接写在toolbar里就可以, 属于插件的项需要引入插件(plugins: '插件名')然后在toolbar中配置。
| 字段 | 说明字段 | 字段 | 说明 | 
|---|---|---|---|
| menubar | 是否显示顶部菜单栏 true / false | bold | 加粗 | 
| newdocument | 创建新文档 | italic | 斜体 | 
| alignnone | 清除 | alignjustify | 两端对齐 | 
| formatselect | 段落选择下拉框(段落、标题) | alignleft | 居左 | 
| fontselect | 字体选择下拉框 | aligncenter | 居中 | 
| fontsizeselect | 字号选择下拉框 | alignright | 居右 | 
| outdent | 减少缩进 | strikethrough | 删除线 | 
| indent | 增加缩进 | underline | 下划线 | 
| undo | 撤消 | ||
| redo | 恢复 | cut | 剪切 | 
| removeformat | 清除格式 | copy | 复制 | 
| subscript | 下标 | paste | 粘贴 | 
| superscript | 上标 | text_color | |
| visualaid | 网格线 | ||
| insert | 插入的集合按钮 | quickimage | 快捷插入图片 | 
| styleselect | 格式选择下拉框(缩进、行高) | 
一下字段需要插件,可前往官网下载
| 字段 | 插件 | 说明 | 
|---|---|---|
| hr | hr | 水平线 | 
| bullist | lists | 无序列表 | 
| numlist | lists | 有序列表 | 
| link | link | 添加和修改链接 | 
| unlink | link | 去除链接格式 | 
| openlink | link | 打开选中链接 | 
| image | image | 添加和修改图片 | 
| charmap | charmap | 特殊符号 | 
| pastetext | paste | 粘贴纯文本 | 
| 打印 | ||
| preview | preview | 预览 | 
| anchor | anchor | 作者 | 
| pagebreak | pagebreak | 分页符 | 
| spellchecker | spellchecker | 拼写检查 | 
| searchreplace | searchreplace | 搜索 | 
| visualblocks | visualblocks | 隐藏块级区域开关 | 
| visualchars | visualchars | 隐藏字符串开关. | 
| code | code | 代码 | 
| help | help | 帮助 | 
| fullscreen | fullscreen | 全屏 | 
| insertdatetime | insertdatetime | 插入时间 | 
| media | media | 插入/编辑媒体文件 | 
| nonbreaking | nonbreaking | 不间断空格 | 
| save | save | 保存(ajax) | 
| cancel | save | 取消保存 | 
| table | table | 插入/编辑表格 | 
| tabledelete | table | 删除表格 | 
| tablecellprops | table | 单元格属性 | 
| tablemergecells | table | 合并单元格 | 
| tablesplitcells | table | 拆分单元格 | 
| tableinsertrowbefore | table | 在当前行之前插入一个新行 | 
| tableinsertrowafter | table | 在当前行之后插入一个新行 | 
| tabledeleterow | table | 删除当前行 | 
| tablerowprops | table | 行属性 | 
| tablecutrow | table | 剪切选定行 | 
| tablecopyrow | table | 复制选定行 | 
| tablepasterowbefore | table | 在当前行之前粘贴行 | 
| tablepasterowafter | table | 在当前行之后粘贴行 | 
| tableinsertcolbefore | table | 在当前列之前插入一个列 | 
| tableinsertcolafter | table | 在当前列之后插入一个列. | 
| tabledeletecol | table | 删除当前列 | 
| rotateleft | imagetools | 逆时针旋转当前图像 | 
| rotateright | imagetools | 顺时针旋转当前图像 | 
| flipv | imagetools | 垂直翻转当前图像 | 
| fliph | imagetools | 水平翻转当前图像 | 
| editimage | imagetools | 打开图像编辑对话框 | 
| imageoptions | imagetools | 打开图像配置对话框 | 
| fullpage | fullpage | 完整页面的文档属性 | 
| ltr | directionality | 设置编写方向从左到右 | 
| rtl | directionality | 设置编写方向从右到左 | 
| emoticons | emoticons | 表情 | 
| template | template | 插入模板 | 
| forecolor | textcolor | 文本颜色 | 
| backcolor | textcolor | 背景颜色 | 
| restoredraft | restoredraft | 恢复到最新的自动保存草稿 | 
| insertfile | moxiemanager | 引入文件 | 
| a11ycheck | a11ychecker | 检查访问性 | 
| toc | toc | 插入目录 | 
| quickimage | inlite | 插入本地图像 | 
| quicktable | inlite | 插入2X2的表格 | 
| quicklink | inlite | 插入连接 | 
图片跨域
<meta name="referrer" content="no-referrer" />
网站优化配置
为了保护页面内容,或者是诱导用户注册,网站经常需要实现禁止用户复制剪切页面内容的操作,或者是登录之后才允许进行复制剪切操作的功能。我们分别从 JavaScript、CSS、HTML 标签属性三个方面来看看如何实现网页禁止复制的效果。
通过 JavaScript 实现
禁止网页复制,最直接的思路是将页面的复制事件跟剪切事件进行重写。除此之外,我们还能通过禁用鼠标右键菜单事件、禁止用户选中内容的方式去实现。相关代码如下所示:
// 禁止右键菜单
document.oncontextmenu = function(){ return false; };
// 禁止文字选择
document.onselectstart = function(){ return false; };
// 禁止复制
document.oncopy = function(){ return false; };
// 禁止剪切
document.oncut = function(){ return false; };
复制代码
通过 HTML 标签属性实现
上述提到的解决思路,除了通过 JS 代码实现外,也可以通过设置标签属性的方式直接禁用页面复制剪切操作,如下所示:
<body oncopy="return false" oncut="return false;" onselectstart="return false" oncontextmenu="return false">
<!--……-->
</body>
复制代码
该方法本质上与 JS 实现方式相同。当需要恢复页面的复制功能时(比如判断用户已经注册登录后),需要通过 JS 代码将页面复制、剪切及内容选中功能进行恢复,代码如下所示:
document.body.oncopy = null;
document.body.oncut = null;
document.body.onselectstart = null;
document.body.oncontextmenu = null;
复制代码
通过 CSS 实现
我们也可以通过 CSS 样式,禁止页面内容被选中,从而达到限制复制操作的目的。相关样式代码如下:
body {
  -moz-user-select:none; /* Firefox私有属性 */
  -webkit-user-select:none; /* WebKit内核私有属性 */
  -ms-user-select:none; /* IE私有属性(IE10及以后) */
  -khtml-user-select:none; /* KHTML内核私有属性 */
  -o-user-select:none; /* Opera私有属性 */
  user-select:none; /* CSS3属性 */
}
复制代码
而恢复页面内容选中功能,则需要通过 JS 代码标签样式进行修改实现,代码如下:
document.body.style.webkitUserSelect = 'auto'; // Firefox
document.body.style.userSelect = 'auto'; // Chrome
//......
