【问题标题】:Multiple modes Codemirror多种模式 Codemirror
【发布时间】:2012-07-18 17:59:28
【问题描述】:

我希望我的 TextArea 能够支持多种 CodeMirror 模式。现在我希望它支持 json 和 xml。这可能吗? 另外,是否可以自动检测用户在区域中放置的是json还是xml?

谢谢。

【问题讨论】:

    标签: javascript xml json textarea codemirror


    【解决方案1】:

    CodeMirror 实际上有一个非常接近您正在寻找的示例here

    这是一个更具体的示例,可以满足您的需求。

    1. 创建一个 CodeMirror 实例。
    2. 当内容发生变化时,我们决定是否应该切换模式。

    我用于确定您处于哪种模式的逻辑非常简单,可以重构以支持您认为适合任何一种模式的稳健检查。 (如果你想花哨的话,正则表达式非常适合进行复杂的检查......即使在我的简单示例中,这也是我使用它的唯一原因)目前,我的示例代码只检查第一个非空格字符为“

    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Code Mirror Example</title>
    <script src="lib/codemirror.js"></script>
    <link rel="stylesheet" href="lib/codemirror.css">
    <script src="mode/javascript/javascript.js"></script>
    <script src="mode/xml/xml.js"></script>
    <style type="text/css">.CodeMirror{border:1px solid black;}</style>
    </head>
    <body>
        <div><span>Mode: </span><span id="modeType">JSON</span></div>
        <textarea class='codeEditor'></textarea>
    
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
        <script type="text/javascript">
        function determineCodeMirrorType(cm)
        {
            if (cm.getMode().name == 'javascript')
            {
                checkAndSwitchToXML(cm, cm.getValue());
            }
            else if (cm.getMode().name == 'xml')
            {
                checkAndSwitchToJSON(cm, cm.getValue());
            }
        }
    
        function checkAndSwitchToXML(cm, val)
        {
            if (/^\s*</.test(val))
            {
                cm.setOption("mode", "xml");
                $('#modeType').html("XML");
            }
        }
        function checkAndSwitchToJSON(cm, val)
        {
            if (!/^\s*</.test(val) && val.match(/\S/))
            {
                cm.setOption("mode", "javascript");
                $('#modeType').html("JSON");
            }
        }
    
        function buildCMInstance(mode, value)
        {
            var cm = CodeMirror.fromTextArea($('.codeEditor')[0], {
                mode:mode,
                value:value,
                lineNumbers:true,
                onChange:function(cmInstance){
                    determineCodeMirrorType(cmInstance);
                }
            });
            return cm;
        }
        $(document).ready(function(){
            //mode changing demo:  "http://codemirror.net/demo/changemode.html";
            var cm = buildCMInstance("javascript");
        });
        </script>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多