问题描述
带预览的默认 CodeMirror HTML 编辑器 - http://jsfiddle.net/D9MvH/1/- http://liveweave.com/zSqCfA
Default CodeMirror HTML Editor with Preview - http://jsfiddle.net/D9MvH/1/ - http://liveweave.com/zSqCfA
使用 FileReader API 在 CodeMirror 中加载文件 - http://liveweave.com/VvsXN9
Load File in CodeMirror with FileReader API - http://liveweave.com/VvsXN9
这是我正在尝试做的一个非常简单的例子.(保存功能不适用于这些在线编辑器,但导入文件功能适用于这个简单的编辑器) - http://liveweave.com/MrUBfZ
Here's a very simple example of what I'm trying to do. (Save function don't work on these online editors, but the import file function works on this simple editor) - http://liveweave.com/MrUBfZ
我的问题是当我单击我的输入文件表单来浏览文件时.我选择要打开的 HTML 文档,它不会使用/在 CodeMirror 中打开.我尝试了我所知道的一切,但无法让它发挥作用.有人可以帮忙吗?
My problem is when I click my input file form to browse for a file. I choose the HTML document to be opened and it won't open with/in CodeMirror. I tried everything of my knowledge and can't get it to work. Can anyone help with this?
HTML:
<input type="file" onchange="loadfile(this)">
JavaScript:
var delay;
// Initialize CodeMirror editor
var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
mode: 'text/html',
tabMode: 'indent',
lineNumbers: true,
lineWrapping: true,
autoCloseTags: true
});
// Live preview
editor.on("change", function() {
clearTimeout(delay);
delay = setTimeout(updatePreview, 300);
});
function updatePreview() {
var previewFrame = document.getElementById('preview');
var preview = previewFrame.contentDocument || previewFrame.contentWindow.document;
preview.open();
preview.write(editor.getValue());
preview.close();
}
setTimeout(updatePreview, 300);
function saveTextAsFile() {
var textToWrite = document.getElementById("code").value;
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs = "myfile.html";
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
// Chrome allows the link to be clicked
// without actually adding it to the DOM.
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
else
{
// Firefox requires the link to be added to the DOM
// before it can be clicked.
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = destroyClickedElement;
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();}
function destroyClickedElement(event) {
document.body.removeChild(event.target);}
function loadfile(input){
var reader = new FileReader()
reader.onload = function(e) {
editor.setValue = e.target.result;}
reader.readAsText(input.files[0]);}
var input = document.getElementById("select");
function selectTheme() {
var theme = input.options[input.selectedIndex].innerHTML;
editor.setOption("theme", theme);
}
var choice = document.location.search &&
decodeURIComponent(document.location.search.slice(1));
if (choice) {
input.value = choice;
editor.setOption("theme", choice);
}
完整代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>CodeMirror: HTML5 preview</title>
<script src='http://codemirror.net/lib/codemirror.js'></script>
<script src='http://codemirror.net/mode/xml/xml.js'></script>
<script src='http://codemirror.net/mode/javascript/javascript.js'></script>
<script src='http://codemirror.net/mode/css/css.js'></script>
<script src='http://codemirror.net/mode/htmlmixed/htmlmixed.js'></script>
<link rel='stylesheet' href='http://codemirror.net/lib/codemirror.css'>
<link rel='stylesheet' href='http://codemirror.net/doc/docs.css'>
<style type='text/css'>
.CodeMirror {
float: left;
width: 50%;
border: 1px solid black;}
iframe {
width: 49%;
float: left;
height: 300px;
border: 1px solid black;
border-left: 0px;}
</style>
</head>
<body>
<textarea id="code" name="code"><!doctype html>
<html>
<head>
<meta charset=utf-8>
<title>HTML5 canvas demo</title>
<style>p {font-family: monospace;}</style>
</head>
<body>
<p>Canvas pane goes here:</p>
<canvas id=pane width=300 height=200></canvas>
<script>
var canvas = document.getElementById('pane');
var context = canvas.getContext('2d');
context.fillStyle = 'rgb(250,0,0)';
context.fillRect(10, 10, 55, 50);
context.fillStyle = 'rgba(0, 0, 250, 0.5)';
context.fillRect(30, 30, 55, 50);
</script>
</body>
</html></textarea>
<iframe id="preview"></iframe>
<input type="file" onchange="loadfile(this)">
<a href="#my-header" onclick='saveTextAsFile()'>Save/Download</a>
<script>
var delay;
// Initialize CodeMirror editor
var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
mode: 'text/html',
tabMode: 'indent',
lineNumbers: true,
lineWrapping: true,
autoCloseTags: true
});
// Live preview
editor.on("change", function() {
clearTimeout(delay);
delay = setTimeout(updatePreview, 300);
});
function updatePreview() {
var previewFrame = document.getElementById('preview');
var preview = previewFrame.contentDocument || previewFrame.contentWindow.document;
preview.open();
preview.write(editor.getValue());
preview.close();
}
setTimeout(updatePreview, 300);
function saveTextAsFile() {
var textToWrite = document.getElementById("code").value;
var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'});
var fileNameToSaveAs = "myfile.html";
var downloadLink = document.createElement("a");
downloadLink.download = fileNameToSaveAs;
downloadLink.innerHTML = "Download File";
if (window.webkitURL != null)
{
// Chrome allows the link to be clicked
// without actually adding it to the DOM.
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
}
else
{
// Firefox requires the link to be added to the DOM
// before it can be clicked.
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
downloadLink.onclick = destroyClickedElement;
downloadLink.style.display = "none";
document.body.appendChild(downloadLink);
}
downloadLink.click();}
function destroyClickedElement(event) {
document.body.removeChild(event.target);}
function loadfile(input){
var reader = new FileReader();
reader.onload = function(e) {
document.getElementById('code').value = e.target.result;}
reader.readAsText(input.files[0]);}
var input = document.getElementById("select");
function selectTheme() {
var theme = input.options[input.selectedIndex].innerHTML;
editor.setOption("theme", theme);
}
var choice = document.location.search &&
decodeURIComponent(document.location.search.slice(1));
if (choice) {
input.value = choice;
editor.setOption("theme", choice);
}
</script>
</body>
</html>
推荐答案
你只是在滥用 CodeMirror;当文件内容加载到阅读器中时,而不是为 textarea 元素分配一个value
,例如:
You're simply misusing CodeMirror; when the file content is loaded into the reader, instead of assigning a value
to the textarea element, e.g.:
reader.onload = function(e) {
document.getElementById('code').value = e.target.result;
}
…使用 CodeMirror API 并通过 editor instance setValue()
方法插入内容,如下所示:
… use the CodeMirror API and insert content via the editor instance setValue()
method, like so:
reader.onload = function(e) {
editor.setValue(e.target.result);
}
请参阅 CodeMirror 文档以了解 doc.setValue(content: string)
,这是说明这一点的更新的工作演示.
这篇关于FileReader 和 CodeMirror 加载文件复杂化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!