2013-09-24 10 views
0

我正在使用代碼鏡像構建代碼遊樂場。我的問題是,我無法從html,css和js的textarea元素中獲取內容。除了textarea元素之外,我還創建了一個textarea,以查看從textarea獲取內容的代碼是否有問題。所以在我的html中,當然我有textarea標籤。我給了這個新的textarea一個類名「txtb」,並且我爲一個叫做「AlertContent()」的函數創建了一個onclick屬性的鏈接。 這裏是JavaScript的功能:需要幫助弄清楚爲什麼我無法使用Javascript爲我的代碼操場獲取某個textarea元素的內容

function AlertContent(){ 

alert(document.getElementsByClassName('txtb')[0].value); 

} 

並猜測它是什麼,它的工作原理。當我輸入具有類「txtb」的textarea元素,然後單擊調用我創建的函數AlertContent()的鏈接時,我看到一個消息框出現,顯示我輸入到該textarea中的文本。有用。然而,當我嘗試給我使用的代碼鏡像的textarea元素的類,並使用相同的功能從這些textarea元素獲取值或內容時,我最終得到一個空白的消息框,即使有文本(HTML ,CSS,JS)在這些textarea元素。我想要做的就是創建一個函數,它將獲取textarea元素(html,css,js)的內容,然後將其保存到我的數據庫中。我真的很感謝幫助。這是我用於代碼鏡像的代碼。

<!-- Code Editors --> 
<section id="code_editors"> 
<div id="html" class="code_box"> 
<h3>HTML</h3> 
<form><textarea class="MyHtml" name="htmlcode"></textarea></form> 
</div> 
<div id="css" class="code_box"> 
<h3>CSS</h3> 
<textarea class="MyCss" name="css"></textarea> 
</div> 
<div id="js" class="code_box"> 
<h3>JavaScript</h3> 
<textarea class="MyJs" name="js"></textarea> 
</div> 
</section> 
</div> 
<script src="http://codemirror.net/lib/codemirror.js"></script> 
<!-- For HTML/XML --> 
<script src="http://codemirror.net/mode/xml/xml.js"></script> 
<script src="http://codemirror.net/mode/htmlmixed/htmlmixed.js"></script> 
<!-- For CSS --> 
<script src="http://codemirror.net/mode/css/css.js"></script> 
<!-- For JS --> 
<script src="http://codemirror.net/mode/javascript/javascript.js"></script> 
</div> 
</div> 

<script>  
(function() { 

// Base template 
var base_tpl = 
"<!doctype html>\n" + 
"<html>\n\t" + 
"<head>\n\t\t" + 
"<meta charset=\"utf-8\">\n\t\t" + 
"<title>Test</title>\n\n\t\t\n\t" + 
"</head>\n\t" + 
"<body>\n\t\n\t" + 
"</body>\n" + 
"</html>"; 

var prepareSource = function() { 
var html = html_editor.getValue(), 
css = css_editor.getValue(), 
js = js_editor.getValue(), 
src = ''; 
// HTML 
src = base_tpl.replace('</body>', html + '</body>'); 

// CSS 
css = '<style>' + css + '</style>'; 
src = src.replace('</head>', css + '</head>'); 
// Javascript 
js = '<script>' + js + '<\/script>'; 
src = src.replace('</body>', js + '</body>'); 
return src; 
}; 
var render = function() { 
var source = prepareSource(); 
var iframe = document.querySelector('#output iframe'), 
iframe_doc = iframe.contentDocument; 
iframe_doc.open(); 
iframe_doc.write(source); 
iframe_doc.close(); 
}; 
// EDITORS 
// CM OPTIONS 
var cm_opt = { 
mode: 'text/html', 
gutter: true, 
lineNumbers: true, 
}; 
// HTML EDITOR 
var html_box = document.querySelector('#html textarea'); 
var html_editor = CodeMirror.fromTextArea(html_box, cm_opt); 

html_editor.on('change', function (inst, changes) { 
render(); 
}); 

// CSS EDITOR 
cm_opt.mode = 'css'; 
var css_box = document.querySelector('#css textarea'); 
var css_editor = CodeMirror.fromTextArea(css_box, cm_opt); 

css_editor.on('change', function (inst, changes) { 
render(); 
}); 

// JAVASCRIPT EDITOR 
cm_opt.mode = 'javascript'; 
var js_box = document.querySelector('#js textarea'); 
var js_editor = CodeMirror.fromTextArea(js_box, cm_opt); 

js_editor.on('change', function (inst, changes) { 
render(); 
}); 

// SETTING CODE EDITORS INITIAL CONTENT 
html_editor.setValue('<p>Empty Room</p>'); 
css_editor.setValue('body { color: gray; }'); 
// RENDER CALL ON PAGE LOAD 
// NOT NEEDED ANYMORE, SINCE WE RELY 
// ON CODEMIRROR'S onChange OPTION THAT GETS 
// TRIGGERED ON setValue 
// render(); 
// NOT SO IMPORTANT - IF YOU NEED TO DO THIS 
// THEN THIS SHOULD GO TO CSS 
/* 
Fixing the Height of CodeMirror. 
You might want to do this in CSS instead 
of JS and override the styles from the main 
codemirror.css 
*/ 
var cms = document.querySelectorAll('.CodeMirror'); 
for (var i = 0; i < cms.length; i++) { 
cms[i].style.position = 'absolute'; 
cms[i].style.top = '30px'; 
cms[i].style.bottom = '0'; 
cms[i].style.left = '0'; 
cms[i].style.right = '0'; 
cms[i].style.height = '100%'; 
} 
/*cms = document.querySelectorAll('.CodeMirror-scroll'); 
for (i = 0; i < cms.length; i++) { 
cms[i].style.height = '100%'; 
}*/ 
}()); 
// Basically adding to the CM Options 
cm_opt['extraKeys'] = { 
Tab: function(instance) { 
if (inst.somethingSelected()) 
CodeMirror.commands.indentMore(inst); 
else 
CodeMirror.commands.insertTab(inst); 
} 
} 
</script> 
+0

我想CodeMirror並沒有真正使用原始的textareas,而是用其他HTML內容取代它們,以便能夠實現它的所有功能。例如,您不能在常規textarea中使用不同顏色的文本。 –

回答

1

爲什麼不使用編輯器上提供的get_value()?例如,html_editor.getValue()

下面是一個示例頁面,用於在單擊相應編輯器按鈕時警告您在CodeMirror textarea中編寫的內容。

<!DOCTYPE html> 
<html> 
<head> 
    <title>CodeMirror</title> 
    <link rel="stylesheet" href="http://codemirror.net/lib/codemirror.css"> 
</head> 
<body> 
    <!-- Code Editors --> 
    <section id="code_editors"> 
     <div id="html" class="code_box"> 
      <h3>HTML</h3> 
      <form><textarea class="MyHtml" name="htmlcode"></textarea></form> 
      <button onclick="viewHTML()">Alert this HTML</button> 
     </div> 
     <div id="css" class="code_box"> 
      <h3>CSS</h3> 
      <textarea class="MyCss" name="css"></textarea> 
      <button onclick="viewCSS()">Alert this CSS</button> 
     </div> 
     <div id="js" class="code_box"> 
      <h3>JavaScript</h3> 
      <textarea class="MyJs" name="js"></textarea> 
      <button onclick="viewJS()">Alert this JS</button> 
     </div> 
    </section> 

    <div id="output"> 
     <iframe></iframe> 
    </div> 

    <script src="http://codemirror.net/lib/codemirror.js"></script> 
    <!-- For HTML/XML --> 
    <script src="http://codemirror.net/mode/xml/xml.js"></script> 
    <script src="http://codemirror.net/mode/htmlmixed/htmlmixed.js"></script> 
    <!-- For CSS --> 
    <script src="http://codemirror.net/mode/css/css.js"></script> 
    <!-- For JS --> 
    <script src="http://codemirror.net/mode/javascript/javascript.js"></script> 

    <script>  
    (function() { 
     // Base template 
     var base_tpl = 
     "<!doctype html>\n" + 
     "<html>\n\t" + 
     "<head>\n\t\t" + 
     "<meta charset=\"utf-8\">\n\t\t" + 
     "<title>Test</title>\n\n\t\t\n\t" + 
     "</head>\n\t" + 
     "<body>\n\t\n\t" + 
     "</body>\n" + 
     "</html>"; 

     window.viewHTML = function() { 
      alert(html_editor.getValue()); 
     } 

     window.viewCSS = function() { 
      alert(css_editor.getValue()); 
     } 

     window.viewJS = function() { 
      alert(js_editor.getValue()); 
     } 

     var prepareSource = function() { 
      var html = html_editor.getValue(), 
       css = css_editor.getValue(), 
       js = js_editor.getValue(), 
       src = ''; 

      // HTML 
      src = base_tpl.replace('</body>', html + '</body>'); 

      // CSS 
      css = '<style>' + css + '</style>'; 
      src = src.replace('</head>', css + '</head>'); 

      // Javascript 
      js = '<script>' + js + '<\/script>'; 
      src = src.replace('</body>', js + '</body>'); 

      return src; 
     }; 

     var render = function() { 
      var source = prepareSource(); 
      var iframe = document.querySelector('#output iframe'), 
      iframe_doc = iframe.contentDocument; 

      iframe_doc.open(); 
      iframe_doc.write(source); 
      iframe_doc.close(); 
     }; 

     // EDITORS 
     // CM OPTIONS 
     var cm_opt = { 
      mode: 'text/html', 
      gutter: true, 
      lineNumbers: true, 
     }; 

     // HTML EDITOR 
     var html_box = document.querySelector('#html textarea'); 
     var html_editor = CodeMirror.fromTextArea(html_box, cm_opt); 

     html_editor.on('change', function (inst, changes) { 
      render(); 
     }); 

     // CSS EDITOR 
     cm_opt.mode = 'css'; 
     var css_box = document.querySelector('#css textarea'); 
     var css_editor = CodeMirror.fromTextArea(css_box, cm_opt); 

     css_editor.on('change', function (inst, changes) { 
      render(); 
     }); 

     // JAVASCRIPT EDITOR 
     cm_opt.mode = 'javascript'; 
     var js_box = document.querySelector('#js textarea'); 
     var js_editor = CodeMirror.fromTextArea(js_box, cm_opt); 

     js_editor.on('change', function (inst, changes) { 
      render(); 
     }); 

     // SETTING CODE EDITORS INITIAL CONTENT 
     html_editor.setValue('<p>Empty Room</p>'); 
     css_editor.setValue('body { color: gray; }'); 
     js_editor.setValue('var x = \'10\';'); 
     // RENDER CALL ON PAGE LOAD 
     // NOT NEEDED ANYMORE, SINCE WE RELY 
     // ON CODEMIRROR'S onChange OPTION THAT GETS 
     // TRIGGERED ON setValue 
     // render(); 
     // NOT SO IMPORTANT - IF YOU NEED TO DO THIS 
     // THEN THIS SHOULD GO TO CSS 
     /* 
     Fixing the Height of CodeMirror. 
     You might want to do this in CSS instead 
     of JS and override the styles from the main 
     codemirror.css 
     */ 
     /* 
     var cms = document.querySelectorAll('.CodeMirror'); 
     for (var i = 0; i < cms.length; i++) { 
      cms[i].style.position = 'absolute'; 
      cms[i].style.top = '30px'; 
      cms[i].style.bottom = '0'; 
      cms[i].style.left = '0'; 
      cms[i].style.right = '0'; 
      cms[i].style.height = '100%'; 
     } 
     */ 
     /*cms = document.querySelectorAll('.CodeMirror-scroll'); 
     for (i = 0; i < cms.length; i++) { 
      cms[i].style.height = '100%'; 
     }*/ 

     // Basically adding to the CM Options 
     cm_opt['extraKeys'] = { 
      Tab: function(instance) { 
      if (inst.somethingSelected()) 
       CodeMirror.commands.indentMore(inst); 
      else 
       CodeMirror.commands.insertTab(inst); 
      } 
     } 
    }()); 

    </script> 
</body> 
</html> 
+0

非常感謝湯姆。它的工作原理:) – user2801524

+0

沒問題,如果足夠的話,不要忘記接受答案。 – Tom

相關問題