自己写一个网页版的Markdown实时编辑
2018-01-02 23:34
274 查看
(1)自己写一个网页版的Markdown实时编辑:器http://blog.csdn.net/Marksinoberg/article/details/51648929
(2)js字符串截取函数slice()、substring()、substr():https://www.cnblogs.com/lmsblogs/p/5876384.html
(3)markdown语法说明:http://markdown.tw/#list
(4)javascript控制在光标位置插入文字:http://blog.csdn.net/gisredevelopment/article/details/29255147
(5)纯前端打造一个简易实时预览的markdown编辑器:https://www.jianshu.com/p/d0eed194db65
(6)div实现拖拽效果,宽度发生变化:http://blog.csdn.net/bei_fang_du_lang/article/details/50707484
(7)editor.md实现Markdown编辑器:http://www.cnblogs.com/Leo_wl/p/5763491.html
(8)JavaScript标准Selection操作:http://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html
输入性元素selection起点的位置,可读写。
输入性元素selection结束点的位置,可读写。
(2)js字符串截取函数slice()、substring()、substr():https://www.cnblogs.com/lmsblogs/p/5876384.html
(3)markdown语法说明:http://markdown.tw/#list
(4)javascript控制在光标位置插入文字:http://blog.csdn.net/gisredevelopment/article/details/29255147
(5)纯前端打造一个简易实时预览的markdown编辑器:https://www.jianshu.com/p/d0eed194db65
(6)div实现拖拽效果,宽度发生变化:http://blog.csdn.net/bei_fang_du_lang/article/details/50707484
(7)editor.md实现Markdown编辑器:http://www.cnblogs.com/Leo_wl/p/5763491.html
(8)JavaScript标准Selection操作:http://www.cnblogs.com/rainman/archive/2011/02/27/1966482.html
oninput 事件
当用户向 中尝试输入时执行 JavaScript:<input type="text" oninput="myFunction()">
selection
selection是对当前激活选中区(即高亮文本)进行操作。selectionStart
输入性元素selection起点的位置,可读写。
selectionEnd
输入性元素selection结束点的位置,可读写。
我自己写的Markdown实时编辑
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="js/jquery.min.js"></script> <link href='./images/bbs.ico' rel='icon' type='image/x-icon' /> <link rel="stylesheet" href="css/bootstrap.css"> <script src="js/bootstrap.min.js"></script> <style> .row{ margin:0; } .myform{ padding:0; } .myhead{ float:left; line-height:4em; /* 设置行高 */ } input:focus{ outline:none; /* 去除Bootstrap输入框聚焦时的边框轮廓 */ } .mytitle{ width:100%; font-size:3em; font-weight:2em; border:0; } .mybtn{ width:100%; line-height:2em; } .mytool{ background-color:lightgray; border:0; } .btn-group{ padding-top:1em; padding-bottom:1em; padding-left:2em; } .btn-group button{ background-color:lightgray; border:0.1em solid white; } .mycontent div{ float:left; padding:0; } .preview{ position:absolute; overflow:auto; height:576px; background-color:lightyellow; } </style> <script src="js/ajaxfileupload.js"></script> <script type="text/javascript"> function ajaxFileUpload(){ var basepath=$("#BasePath").val(); //效验上传图片类型 var file=$("#myupload"); if(file.val().length<=0){ alert("请上传图片"); return false; }else if(!/\.(gif|jpg|jpeg|png|GIF|JPG|PNG)$/.test(file.val())){ alert("图片类型必须是.gif,jpeg,jpg,png中的一种"); file.val(""); return false; } //效验成功调用异步上传函数 $.ajaxFileUpload({ url:'BBS/myUpload!upload.action', //发出请求 secureuri:false,//是否用安全提交,默认为false fileElementId:'myupload',//file选择文件的框的id dataType:'json',//数据返回格式,如果用json,需要修改ajaxfileupload.js中的内容 eval("data = " + data ); -->data = jQuery.parseJSON(jQuery(data).text()); success:function(data){ //jQuery.parseJSON()函数用于将格式完好的JSON字符串转为与之对应的JavaScript对象。 //获得json格式数据的值,并转换显示图片在页面上,data是一个jsonObject对象,path是它的一个键值对元素的键名 $("#viewImg").attr("src",basepath + data.path); alert("上传成功!"); }, error:function(data){ alert("上传失败!"); } }); } function ajaxAddPost(){ var content=$("#content").val(); var brief=$("#brief").val(); if(brief.length<=0||content.length<=0){ alert("简介/文章不能为空!"); return false; } var postName=$("#title").val(); var bid=$("#bid").val(); var mydata={'brief':brief,'content':content,'postName':postName,'bid':bid}; $.ajax({ type:"POST", url:'BBS/post!addPost.action', data:mydata, dataType:"json", success:function(data){ alert(data.msg); window.location.href='<%=request.getContextPath() %>'+"/post!loadPost.action?pid="+data.myPostId; }, error:function(){ alert("网络异常超时!"); } }); } </script> <title>写博客</title> </head> <body> <div class="row clearfix"> <!-- <form class="col-md-12 column myform" action="" method="post"> --> <!-- 标题栏 --> <div class="row clearfix"> <div class="col-md-12 column myhead"> <div class="col-md-11 column"><input type="text" id="title" class="mytitle" value="标题写在这里" /></div> <div class="col-md-1 column"><button type="button" class="btn btn-primary btn-lg mybtn" href="#addPostDialog" data-toggle="modal">发表</button></div> </div> </div> <!-- 工具栏 --> <div class="row clearfix"> <div class="col-md-12 column mytool"> <div class="btn-group btn-group-sm"> <button class="btn btn-default" type="button" onclick="insertText('#')"><em class="glyphicon glyphicon-header"></em>标题</button> <button class="btn btn-default" type="button" onclick="insertText('**')"><em class="glyphicon glyphicon-bold"></em>加粗</button> <button class="btn btn-default" type="button" onclick="insertText('``')"><em class="glyphicon glyphicon-flag"></em>代码</button> <button class="btn btn-default" type="button" onclick="insertText(' ')"><em class="glyphicon glyphicon-flag"></em>代码区块</button> <button class="btn btn-default" type="button" onclick="insertText('1. ')"><em class="glyphicon glyphicon-th-list"></em>有序列表</button> <button class="btn btn-default" type="button" onclick="insertText('+ ')"><em class="glyphicon glyphicon-list"></em>无序列表</button> <button class="btn btn-default" type="button" href="#uploadImgDialog" data-toggle="modal"><em class="glyphicon glyphicon-picture"></em>图片</button> <button class="btn btn-default" type="button" onclick="insertText('[]')"><em class="glyphicon glyphicon-link"></em>链接</button> <button class="btn btn-default" type="button" onclick="insertText('*')"><em class="glyphicon glyphicon-italic"></em>斜体</button> <button class="btn btn-default" type="button" onclick="insertText('---')"><em class="glyphicon glyphicon-leaf"></em>分割线</button> <button class="btn btn-default" type="button" onclick="insertText(' ')"><em class="glyphicon glyphicon-star"></em>换行</button> <button class="btn btn-default" type="button" onclick="insertText('#')"><em class="glyphicon glyphicon-arrow-left"></em>返回</button> </div> </div> </div> <!-- 内容-预览栏 --> <div class="row clearfix mycontent"> <!-- 内容 --> <div class="col-md-6 column "> <textarea rows="30" class="col-md-12" oninput="this.editor.update();" id="content" name="content"></textarea> </div> <!-- 预览栏 --> <div class="col-md-6 column"> <div class="col-md-12 preview" id="preview"></div> </div> </div> <!-- </form> --> </div> <!-- 图片上传对话框--> <div class="modal fade" id="uploadImgDialog" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">插入图片</h4> </div> <div class="modal-body"> <!--为了jquery获得basePath的值,必须写(如果没有更好的办法) --> <input type="hidden" value="<%=request.getContextPath() %>" id="BasePath"/> <input type="file" id="myupload" name="file" class="form-control" /> <button type="button" class="btn btn-primary" onclick="ajaxFileUpload()">上传</button> <button type="reset" class="btn btn-default">重置</button> <img id="viewImg" alt="上传的图片在这里显示"/> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">取消</button> <button type="button" class="btn btn-primary" onclick="insertText('!')" data-dismiss="modal">确定</button> </div> </div> </div> </div> <!-- 发表博客对话框--> <div class="modal fade" id="addPostDialog" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">文章设置</h4> </div> <div class="modal-body"> <label for="brief">文章简介</label><input name="brief" type="text" class="form-control" id="brief" /> <label for="type">文章分类</label> <select name="bid" class="form-control" id="bid"> <s:iterator id="bl" value="boardList"> <option value="<s:property value="#bl.id"/>"><s:property value="#bl.name"/></option> </s:iterator> </select> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">取消</button> <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="ajaxAddPost()">发布</button> </div> </div> </div> </div> <script src="js/markdown.min.js"></script> <script> /* 预览 */ function Editor(input, preview) { input.editor = this; //为input对象创建一个editor对象,将Editor(input, preview)对象赋给editor对象,利用input对象所对应的标签的属性oninput调用input对象的editor对象的update()方法 this.update = function () { //this指的是Editor(input, preview),也是input.editor setInterval(function(){ preview.innerHTML = markdown.toHTML(input.value); },6000); }; } var E = function (id) { return document.getElementById(id); }; new Editor(E("content"), E("preview")); /* 插入格式 */ function insertText(val){ var input = E("content"); var inputlen = input.value.length; if(typeof document.selection != "undefined") { //当input对象中没有激活选区时,在最后面插入val document.selection.createRange().text = val; } //当input对象中有激活选区时,按情况插入val else { var left = input.value.substring(0,input.selectionStart); var midd = input.value.substring(input.selectionStart,input.selectionEnd); var right = input.value.substring(input.selectionEnd,inputlen); if(val=='#'){ //标题 input.value =left + val + midd + right; } if(val=='**'){ //加粗 input.value = left + '**' + midd + '**' + right; } if(val=='*'){ //斜体 input.value = left + '*' + midd + '*' + right; } if(val=='---'){ //分割线 input.value =left + val + "\n" + right; } if(val=='+ '||val=='1. '){ //无序和有序,加号加上空格、数字加上字母点加上空格 input.value =left + val + midd + right; } if(val==' '){ //换行 input.value =left + midd + val + "\n" + right; } if(val=='``'){ //代码 input.value =left + '``' + midd + '``' + right; } if(val==' '){ input.value =left + ' ' + midd + right; } if(val=='!'){ input.value = left + '![Alt text](' + E("viewImg").src + ')' + right; } if(val=='[]'){ input.value = left + '[Alt text](http://)' + right; } input.focus();//使得textarea获取焦点 } } </script> </body> </html>
相关文章推荐
- 自己写一个网页版的Markdown实时编辑器
- 自己写一个网页版的Markdown实时编辑器
- 自己写一个网页版的Markdown实时编辑器
- RxMarkdown 是一个运用 RxJava API 在 TextView 或 EditText 中编辑和(实时)预览基本 markdown 语法的 Android 库
- 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”
- 学习x86时,自己写的一个引导,从实时模式到保护模式
- 使用正则表达式写一个网页爬虫案例获取指定文档中的邮件地址保存到自己指定的文件夹中
- 受够了 windows 下的 markdown 软件的话,自己写一个吧!
- 实时编辑网页网页文字实时编辑,如同TEXTBOX一般
- 如何为自己的网页实现一个“回到顶部”的链接?
- 【图文教程】五分钟内搞一个双十一数据大屏_实时看到自己的业务访问情况
- 自己MarkDown编辑中使用的一些东西
- Puer是一个可以实时编辑刷新的前端服务器
- 发布一个编辑预览markdown格式的小软件MEditor,纯开源
- 近期做了一个自己主动纠错演示网页
- 完成一个应用,用户可以根据自己输入的地址下载网络上的图片和网页信息
- 专升本第七讲(做一个自己网页,了解黑客)
- webView 无限进入,点击返回,返回到网页的上一个页面,当无返回时,返回到自己的页面
- 一个支持实时预览的在线 Markdown 编辑器 - Markdoc
- 黑马程序员——自己写的一个网页版简易账本