的FileReader和codeMIRROR加载文件并发症 [英] FileReader and CodeMirror Load File Complication

查看:356
本文介绍了的FileReader和codeMIRROR加载文件并发症的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

默认codeMIRROR HTML编辑以preVIEW - http://jsfiddle.net/D9MvH/ 1 / - http://liveweave.com/zSqCfA

在的FileReader API codeMIRROR加载文件 - http://liveweave.com/VvsXN9

这里是什么我试图做一个很简单的例子。 (保存功能不会对这些网上的编辑工作,但导入文件函数可以使用这个简单的编辑器) - 的http:// liveweave .COM / MrUBfZ

我的问题是,当我点击我的输入文件的形式来浏览文件。我选择要打开HTML文件,它不会与/在codeMIRROR打开。我想我所知的一切并不能得到它的工作。任何人都可以帮助呢?

HTML

 <输入类型=文件的onchange =的loadFile(本)>

的JavaScript

  VAR延迟;//初始化codeMIRROR编辑器
VAR编辑= codeMirror.fromTextArea(的document.getElementById('code'){
    模式:text / html的',
    tabMode:缩进,
    lineNumbers:真实,
    lineWrapping:真实,
    autoCloseTags:真
});//直播preVIEW
editor.on(变,函数(){
    clearTimeout(延迟);
    延迟= setTimeout的(更新preVIEW,300);
});功能更新preVIEW(){
    VAR previewFrame =的document.getElementById('preVIEW');
    VAR preVIEW = previewFrame.contentDocument || previewFrame.contentWindow.document;
    preview.open();
    preview.write(editor.getValue());
    preview.close();
}
的setTimeout(更新preVIEW,300);功能saveTextAsFile(){
    。VAR textToWrite =的document.getElementById(code)的价值;
    VAR textFileAsBlob =新的Blob([textToWrite] {类型:text / plain的'});
    VAR fileNameToSaveAs =myfile.html;    变种downloadLink = document.createElement方法(一);
    downloadLink.download = fileNameToSaveAs;
    downloadLink.innerHTML =下载文件;
    如果(window.webkitUR​​L!= NULL)
    {
        //浏览器允许点击链接
        //而不实际将它添加到DOM。
        downloadLink.href = window.webkitUR​​L.createObjectURL(textFileAsBlob);
    }
    其他
    {
        //火狐要求的链路被添加到DOM
        //才可以点击。
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = destroyClickedElement;
        downloadLink.style.display =无;
        document.body.appendChild(downloadLink);
    }    downloadLink.click();}功能destroyClickedElement(事件){
    document.body.removeChild(event.target);}功能的loadFile(输入){
    VAR读卡器=新的FileReader()
    reader.onload =功能(E){
        editor.setValue = e.target.result;}
    reader.readAsText(input.files [0]);}    VAR输入=的document.getElementById(选择);    功能selectTheme(){
      VAR主题= input.options [input.selectedIndex] .innerHTML;
      editor.setOption(主旋律,主题);
    }    VAR的选择= document.location.search&放大器;&安培;
               德codeURIComponent(document.location.search.slice(1));
    如果(选择){
      input.value =选择;
      editor.setOption(主旋律,选择);
    }

展开code

 <!DOCTYPE HTML>
< HTML和GT;
< HEAD>
<间的charset =UTF-8>
<标题> codeMIRROR:HTML5 preVIEW< /标题>
<脚本的src =HTTP://$c$cmirror.net/lib/$c$cmirror.js'>< / SCRIPT>
<脚本的src =HTTP://$c$cmirror.net/mode/xml/xml.js'>< / SCRIPT>
<脚本的src =HTTP://$c$cmirror.net/mode/javascript/javascript.js'>< / SCRIPT>
<脚本的src =HTTP://$c$cmirror.net/mode/css/css.js'>< / SCRIPT>
<脚本的src =HTTP://$c$cmirror.net/mode/htmlmixed/htmlmixed.js'>< / SCRIPT>
<链接相对=样式HREF =HTTP://$c$cmirror.net/lib/$c$cmirror.css'>
<链接相对=样式HREF =HTTP://$c$cmirror.net/doc/docs.css'>
<风格类型='文字/ CSS'>
。$ C $ {CMIRROR
    浮动:左;
    宽度:50%;
    边框:1px的纯黑色;}IFRAME {
    宽度:49%;
    浮动:左;
    高度:300像素;
    边框:1px的纯黑色;
    左边框:0像素;}
< /风格>
< /头>
<身体GT;
    < textarea的ID =codeNAME =code><!DOCTYPE HTML>
< HTML和GT;
< HEAD>
<间的charset = UTF-8>
<标题> HTML5画布演示< /标题>
<花柱指p {FONT-FAMILY:等宽;}< /风格>
< /头>
<身体GT;
    < P>画布窗格放在这里:LT; / P>
    <画布ID =窗格WIDTH = 300 HEIGHT = 200>< /帆布>    <脚本>
      VAR帆布=的document.getElementById('窗格');
      VAR上下文= 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>
< /身体GT;
< / HTML>< / textarea的>    < IFRAME ID =preVIEW>< / IFRAME>    <输入类型=文件的onchange =的loadFile(本)>
    < A HREF =#我的头的onclick ='saveTextAsFile()'>保存/下载< / A><脚本>
VAR延迟;//初始化codeMIRROR编辑器
VAR编辑= codeMirror.fromTextArea(的document.getElementById('code'){
    模式:text / html的',
    tabMode:缩进,
    lineNumbers:真实,
    lineWrapping:真实,
    autoCloseTags:真
});//直播preVIEW
editor.on(变,函数(){
    clearTimeout(延迟);
    延迟= setTimeout的(更新preVIEW,300);
});功能更新preVIEW(){
    VAR previewFrame =的document.getElementById('preVIEW');
    VAR preVIEW = previewFrame.contentDocument || previewFrame.contentWindow.document;
    preview.open();
    preview.write(editor.getValue());
    preview.close();
}
的setTimeout(更新preVIEW,300);功能saveTextAsFile(){
    。VAR textToWrite =的document.getElementById(code)的价值;
    VAR textFileAsBlob =新的Blob([textToWrite] {类型:text / plain的'});
    VAR fileNameToSaveAs =myfile.html;    变种downloadLink = document.createElement方法(一);
    downloadLink.download = fileNameToSaveAs;
    downloadLink.innerHTML =下载文件;
    如果(window.webkitUR​​L!= NULL)
    {
        //浏览器允许点击链接
        //而不实际将它添加到DOM。
        downloadLink.href = window.webkitUR​​L.createObjectURL(textFileAsBlob);
    }
    其他
    {
        //火狐要求的链路被添加到DOM
        //才可以点击。
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = destroyClickedElement;
        downloadLink.style.display =无;
        document.body.appendChild(downloadLink);
    }    downloadLink.click();}功能destroyClickedElement(事件){
    document.body.removeChild(event.target);}功能的loadFile(输入){
    VAR读卡器=新的FileReader();
    reader.onload =功能(E){
        的document.getElementById('code')值= e.target.result;}
    reader.readAsText(input.files [0]);}    VAR输入=的document.getElementById(选择);    功能selectTheme(){
      VAR主题= input.options [input.selectedIndex] .innerHTML;
      editor.setOption(主旋律,主题);
    }    VAR的选择= document.location.search&放大器;&安培;
               德codeURIComponent(document.location.search.slice(1));
    如果(选择){
      input.value =选择;
      editor.setOption(主旋律,选择);
    }
< / SCRIPT>
< /身体GT;
< / HTML>


解决方案

您只是简单地滥用codeMIRROR;当文件内容加载到读者,而不是分配 textarea元素的,例如:

reader.onload =功能(E){
    。的document.getElementById('code')值= e.target.result;
}

…使用codeMIRROR API和插入通过的编辑器实例内容的setValue()方法,像这样:

reader.onload =功能(E){
    editor.setValue(e.target.result);
}

查看 codeMIRROR为 doc.setValue文档(内容:字符串) 和这里的更新,工作演示 说明这一点。

Default CodeMirror HTML Editor with Preview - http://jsfiddle.net/D9MvH/1/ - http://liveweave.com/zSqCfA

Load File in CodeMirror with FileReader API - http://liveweave.com/VvsXN9

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

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);
    }

Full Code

<!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>

解决方案

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;
}

… use the CodeMirror API and insert content via the editor instance setValue() method, like so:

reader.onload = function(e) {
    editor.setValue(e.target.result);
}

See the CodeMirror docs for doc.setValue(content: string), and here's the updated, working demo illustrating this.

这篇关于的FileReader和codeMIRROR加载文件并发症的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆