うしブログ

うしブログ

趣味で運営する、GeoGebraの専門ブログ。

(作業メモ)StartPoint要検証(2行の場合;テキスト変更時未定義問題)

(要修復)ToggleButton・RollPolygonWithoutSlipping・貯金時計・直感力トレーニング

webページにJavaScriptエディタを生成する

ドラッグで移動可能、ダブルクリックでコードを整形

function makeJsEditor() {

    //インポートしたいJSのURL
    const scriptUrl1 = "https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ace.js";
    const scriptUrl2 = "https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-language_tools.min.js";
    const scriptUrl3 = "https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/theme-sqlserver.min.js";
    const scriptUrl4 = "https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/mode-javascript.min.js";
    const scriptUrl5 = "https://cdnjs.cloudflare.com/ajax/libs/ace/1.4.12/ext-beautify.min.js";

    var el1 = document.createElement('script');
    el1.src = scriptUrl1;
    document.body.appendChild(el1);

    var el2 = document.createElement('script');
    el2.src = scriptUrl2;
    document.body.appendChild(el2);

    var el3 = document.createElement('script');
    el3.src = scriptUrl3;
    document.body.appendChild(el3);

    var el4 = document.createElement('script');
    el4.src = scriptUrl4;
    document.body.appendChild(el4);

    var el5 = document.createElement('script');
    el5.src = scriptUrl5;
    document.body.appendChild(el5);

    var resizable = document.createElement('div');
    resizable.id = "resizable";
    var wrp = document.createElement('div');
    wrp.id = "usiwrapper";
    var edt = document.createElement('div');
    edt.id = "editor";
    wrp.appendChild(edt);
    resizable.appendChild(wrp);
    document.body.appendChild(resizable);

    document.getElementById("resizable").style.width = "200px";
    document.getElementById("resizable").style.height = "100px";
    document.getElementById("resizable").style.textAlign = "left";
    document.getElementById("resizable").style.position = "fixed";
    document.getElementById("resizable").style.top = "10px";
    document.getElementById("resizable").style.left = "10px";
    document.getElementById("resizable").style.zIndex = "2147483647";
    document.getElementById('resizable').style.backgroundColor = "rgba(200,200,200,1)";
    document.getElementById("resizable").style.padding = "0px";
    document.getElementById("resizable").style.resize = "both";
    document.getElementById("resizable").style.overflow = "scroll";

    document.getElementById("usiwrapper").style.position = "relative";
    document.getElementById('usiwrapper').style.width = "100%";
    document.getElementById('usiwrapper').style.height = "100%";

    document.getElementById('editor').style.position = "relative";
    document.getElementById('editor').style.width = "100%";
    document.getElementById('editor').style.height = "100%";

    document.getElementById('editor').addEventListener("mouseover", setEditorScript);

    function setEditorScript() {
        var editor = ace.edit("editor");
        editor.setTheme("ace/theme/sqlserver");
        editor.getSession().setMode("ace/mode/javascript");
        editor.setFontSize(12);
        document.getElementById("editor").ondblclick = function () {
            var beautify = ace.require("ace/ext/beautify"); // get reference to extension
            var editor = ace.edit("editor"); // get reference to editor
            beautify.beautify(editor.session);
        };
        editor.setOptions({
            enableBasicAutocompletion: false,
            enableSnippets: false,
            enableLiveAutocompletion: true
        });

        //要素を指定
        var targetElement = document.getElementById("usiwrapper");

        //dragstartイベント不使用
        targetElement.ondragstart = function (event) {
            return false;
        };

        var offx;
        var offy;

        // ドラッグ・ドロップ時のイベント登録
        targetElement.onmousedown = function (e) {
            offx = e.offsetX;
            offy = e.offsetY;
            document.addEventListener("mousemove", onMouseMove);
        };
        var onMouseMove = function (event) {
            var x = event.clientX;
            var y = event.clientY;
            var extraTop = document.getElementById("resizable").offsetTop;
            var extraLeft = document.getElementById("resizable").offsetLeft;
            var arrange = document.getElementsByClassName("ace_gutter")[0].offsetWidth;
            var paddingTop = document.getElementById("resizable").style.paddingTop;
            var paddingLeft = document.getElementById("resizable").style.paddingLeft;
            targetElement.style.removeProperty('bottom');
            targetElement.style.removeProperty('right');
            targetElement.style.top = (y - offy - extraTop - parseInt(paddingTop)) + "px";
            targetElement.style.left = (x - offx - extraLeft - arrange - parseInt(paddingLeft)) + "px";

            document.getElementById("resizable").style.top = (parseInt(document.getElementById("resizable").style.top) + parseInt(targetElement.style.top)) + "px";
            document.getElementById("resizable").style.left = (parseInt(document.getElementById("resizable").style.left) + parseInt(targetElement.style.left)) + "px";
        };
        targetElement.onmouseup = function () {
            document.removeEventListener("mousemove", onMouseMove);
        };
        // document.getElementById('editor').removeEventListener("mouseover", setEditorScript);
    }
}