javascript - 如何使用 SimpleMDE 和 Qooxdoo 获取滚动容器?

标签 javascript qooxdoo simplemde

我真的很感谢你的帮助,你看:我正在尝试获得一个构建 SimpleMDE 的 qooxdoo 小部件。编辑。你可以在playground查看我的测试代码:

qx.Class.define("MdEditor", {
  extend: qx.ui.core.Widget,

  construct: function() {
    this.base(arguments);
    this.addListenerOnce("appear", this.__appearRenderer, this);
  },

  members: {
    __appearRenderer: function() {

      qx.bom.Stylesheet.includeFile('https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css');

      var dynLoader = new qx.util.DynamicScriptLoader (
        ["https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.js"]
      );

      dynLoader.addListenerOnce("ready", function(e) {
        this.debug("Simple MDE editor loaded");

        var contentEl = this.getContentElement();

        var editor = new SimpleMDE({
          element: contentEl.getDomElement(),
          spellChocker: false
        });

      }, this);

      dynLoader.start();
    },

    _createContentElement: function() {
      return new qx.html.Input("textarea");
    }
  }
});

var win = new qx.ui.window.Window("Simple MDE");
win.setWidth(400);
win.setHeight(280);
win.setShowMinimize(false);
win.setLayout(new qx.ui.layout.Grow());

var compo = new qx.ui.container.Scroll();
compo.add(new MdEditor());

win.add(compo);

this.getRoot().add(win, {left:20, top:20});


win.open();

实际上实例已创建并显示,但是当您在可见空间之外写入文本时,“预期”滚动条不会显示,并且在控制台我收到此错误 类 qx.ui.core 的属性 scrollY 中的错误带有传入值“131”的方法 setScrollY 中的 .scroll.ScrollPane:无效!

我尝试显示 SimpleMDE 的原生滚动条,但没有成功。现在,我想显示由 qooxdoo 管理的滚动条,但不知道如何存档。

最佳答案

SimpleMDE 编辑器是一个封装的 CodeMirror 编辑器,其功能与其他编辑器(如 CKEditor)相同:它将自己的 div 作为给定文本区域元素的父 div 的子元素。

要使其工作并使 div 作为 qooxdoo 小部件内容元素的子元素,您必须创建一个 div 作为内容元素,并将 textarea 作为该 div 的子元素:

_createContentElement: function() {
  // create a div content element which will be the parent for
  // the editor div
  var ce = new qx.html.Element("div");

  // and add a textarea as a child to the former div
  // as the editor only sets the textarea to display:none
  this.__textareaContentElement = new qx.html.Input("textarea");

  ce.add(this.__textareaContentElement);

  return ce;
}

第二件事是你必须主动手动设置编辑器的高度,因为它没有用于此的 API,通过检索编辑器的顶部 div 和滚动条 div,这可以用

this.__cm = qx.bom.Selector.query(".CodeMirror", content_element)[0];
this.__cmscroll = qx.bom.Selector.query(".CodeMirror-scroll", content_element)[0];

其中 content_element 是我们包装器小部件的(好)内容元素。 现在,您可以最初设置 CodeMirror 和 CodeMirror-scroll 的高度,并在包装​​器的调整大小监听器中设置它以使其适合。

var hint = this.getBounds();
var height = (hint.height-83-22-22-12)+"px";
this.__cm.style.height = height;
this.__cm.style.minHeight = height;
this.__cmscroll.style.minHeight = height;

请注意,应该通过检索工具栏和编辑器状态栏的实际高度来优化高度的“魔法”计算。我在下面的 Playground 示例中扩展了这些计算,以计算元素的实际高度,并添加了一个用于调整工具栏大小的监听器,这可能会根据可以在一行或多行中显示多少个图标来改变它的高度。

请看一下这个可行的 playground 示例,但应该对其进行改进:

http://tinyurl.com/zn7on7l(请去掉http://后面的空格)

另请注意,SimpleMDE 和 codemirror 在 API 中似乎受到限制,因为它们具有设置编辑器部件/元素高度的方法。

关于javascript - 如何使用 SimpleMDE 和 Qooxdoo 获取滚动容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40556764/

相关文章:

angular - SimpleMDE 与 Angular 6 获取组件中编辑器的引用

javascript - `:empty:hover` 未更新

javascript - 将 jquery-csv 与 webpack 一起使用?

mobile - Qooxdoo 手机 : multiple selection in form

javascript - 在 qooxdoo 中为图像添加 CSS 类

webpack - 如何在 ES6 中导入 SimpleMDE

jquery - 使用 SimpleMDE 禁用调整文本区域的大小

javascript - 使用 async/await 组合并发和顺序请求

javascript - 向下滚动时 Angular 隐藏标题,向上滚动时显示