`
lujar
  • 浏览: 512818 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

编写HtmlArea控件的插件:经典教程

阅读更多

HtmlArea是一个强大的wysiwyg的html编辑器。它的强大不仅体现在它的功能的完善和成熟上,还体现在它为开发者提供了一个灵活的架构来编写你自己需要的插件!下面本文通过一个实际的例子来讲解插件的开发过程。

1首先在其plugin目录下为你的插件建立一个目录,例如FormControl,这个插件的作用是在页面中插入html表单元素,本例中我们只实现最简单的文本输入框的插入。

2 接下来,建立form-control.js文件。

// Object that will insert form control into HTMLArea-3.0
function FormControl(editor) {
 this.editor = editor;

 var cfg = editor.config;
 var tt = FormControl.I18N;
 var bl = FormControl.btnList;
 var self = this;

 // register the toolbar buttons provided by this plugin
 var toolbar = ["linebreak"];

 for (var i in bl) {
  var btn = bl[i];
  if (!btn) {
   toolbar.push("separator");
  } else {
   var id = "TO-" + btn[0];
   cfg.registerButton(id, tt[id], editor.imgURL(btn[0] + ".gif", "FormControl"), false,
        function(editor, id) {
         // dispatch button press event
         self.buttonPress(editor, id);
        });
   toolbar.push(id);
  }
 }

 // add a new line in the toolbar
 cfg.toolbar.push(toolbar);
};

FormControl._pluginInfo = {
 name          : "FormControl",
 version       : "1.0",
 developer     : "Daniel Summer",
 developer_url : "http://www.exoplatform.com",
 c_owner       : "Daniel Summer",
 sponsor       : "eXo Platform SARL",
 sponsor_url   : "http://www.exoplatform.com",
 license       : "htmlArea"
};


FormControl.prototype.buttonPress = function(editor, button_id) {
 this.editor = editor;
 var mozbr = HTMLArea.is_gecko ? "<br />" : "";
 var i18n = FormControl.I18N;

    switch (button_id) {
     case "TO-insert-input":
      this._insertInput(editor);
      break;
     case "insertCombo":
    }
   
}

// this function requires the file PopupDiv/PopupWin to be loaded from browser
// Called when the user clicks the Insert Input button
FormControl.prototype._insertInput = function(editor) {
 var sel = editor._getSelection();
 var range = editor._createRange(sel);
 var editor = editor; // for nested functions
 editor._popupDialog("insert_input.html", function(param) {
  if (!param) { // user must have pressed Cancel
   return false;
  }
  var doc = editor._doc;
  // create the table element
  var input = doc.createElement("input");
  // assign the given arguments
  for (var field in param) {
   var value = param[field];
   if (!value) {
    continue;
   }
   switch (field) {
       case "f_name"   : input.name = value; break;
   }
  }
  
  if (HTMLArea.is_ie) {
   range.pasteHTML(input.outerHTML);
  } else {
   // insert the input
   editor.insertNodeAtSelection(input);
  }
  return true;
 }, null);
};

FormControl.btnList = [
 // basic controls
 ["insert-input"],
 null,   // separator

 // macro controls
 ["insert-date"]

 ];

3 接下来在lang目录下建立一个en.js的资源文件

FormControl.I18N = {
 // Items that appear in menu.  Please note that an underscore (_)
 // character in the translation (right column) will cause the following
 // letter to become underlined and be shortcut for that menu option.

 "TO-insert-input"                                            : "Insert Input",
 "TO-insert-date"                                        : "Insert Date Macro",
 
 dialogs: {
  "You must enter the name of the input field"  : "You must enter the name of the input field"
 }
};

4 建立两张图片,放在img目录下insert-date.gif insert-input.gif

5 在popups目录下,建立insert_input.html

<html>

<head>
  <title>Insert/Modify Link</title>
  <script type="text/javascript" src="popup.js"></script>
  <script type="text/javascript">
    window.resizeTo(400, 200);

I18N = window.opener.FormControl.I18N.dialogs;

function i18n(str) {
  return (I18N[str] || str);
};

function onTargetChanged() {
  var f = document.getElementById("f_other_target");
  if (this.value == "_other") {
    f.style.visibility = "visible";
    f.select();
    f.focus();
  } else f.style.visibility = "hidden";
};

function Init() {
  __dlg_translate(I18N);
  __dlg_init();
  var param = window.dialogArguments;
  document.getElementById("f_name").focus();
  document.getElementById("f_name").select();
};

function onOK() {
  var required = {
    "f_name": i18n("You must enter the name of the input field")
  };
  for (var i in required) {
    var el = document.getElementById(i);
    if (!el.value) {
      alert(required[i]);
      el.focus();
      return false;
    }
  }
  // pass data back to the calling window
  var fields = ["f_name"];
  var param = new Object();
  for (var i in fields) {
    var id = fields[i];
    var el = document.getElementById(id);
    param[id] = el.value;
  }
  __dlg_close(param);
  return false;
};

function onCancel() {
  __dlg_close(null);
  return false;
};

</script>

<style type="text/css">
html, body {
  background: ButtonFace;
  color: ButtonText;
  font: 11px Tahoma,Verdana,sans-serif;
  margin: 0px;
  padding: 0px;
}
body { padding: 5px; }
table {
  font: 11px Tahoma,Verdana,sans-serif;
}
select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
button { width: 70px; }
table .label { text-align: right; width: 8em; }

.title { background: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px;
border-bottom: 1px solid black; letter-spacing: 2px;
}

#buttons {
      margin-top: 1em; border-top: 1px solid #999;
      padding: 2px; text-align: right;
}
</style>

</head>

<body onload="Init()">
<div class="title">Insert Input</div>

<table border="0" style="width: 100%;">
  <tr>
    <td class="label">Name:</td>
    <td><input type="text" id="f_name" style="width: 100%" /></td>
  </tr>
</table>

<div id="buttons">
  <button type="button" name="ok" onclick="return onOK();">OK</button>
  <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
</div>

</body>
</html>

6 在example目录下,建立一个测试文件

在相应位置加入以下代码

<script type="text/javascript">
HTMLArea.loadPlugin("FormControl");

var editor = null;
function initEditor() {
  editor = new HTMLArea("ta");

  // register the FormControl plugin with our editor
  editor.registerPlugin("FormControl");

到此为止,整个插件就可以正常工作了。这只是开发插件的一种形式,另外你还可以覆盖原有的按钮的功能。或者参考它自带的插件来了解更复杂的插件编写方法。

分享到:
评论

相关推荐

    PyQt5控件详解:QLabel实例代码

    在Python的GUI编程中,PyQt5是一个非常强大的库,它提供了丰富的界面控件和功能。本篇文章将深入探讨PyQt5中的一个基础且重要的控件——`QLabel`,并展示如何通过代码实例实现其各种功能,如显示文本、处理超链接、...

    HTMLArea-3.0

    8. **插件系统**:HTMLArea可能有一个插件系统,允许开发者添加额外的功能,扩展编辑器的可用性。 9. **更新与维护**:作为“rc1”版本,HTMLArea-3.0-rc1代表了发布候选版本1,意味着这个版本已经接近最终正式版,...

    htmlarea

    5. **插件系统**:HTMLArea可能有一个插件系统,使得开发者能够轻松添加自定义功能或扩展编辑器的能力。这些插件可能包含额外的编辑选项、格式化规则,甚至是集成其他服务,如图像上传或实时预览。 6. **与服务器...

    Area-Selector:仿淘宝配送区域选择控件

    【标题】"Area-Selector:仿淘宝配送区域选择控件" 涉及的主要知识点是JavaScript编程和前端交互设计,具体来说,这是一个用于实现类似淘宝购物时选择收货地址的区域选择器组件。在电子商务网站中,用户需要精确地...

    HTMLArea在线编辑器中文版3.0RC1

    8. **扩展性**:HTMLArea可以通过自定义插件进行扩展,以增加新的功能或改进现有功能,适应不断变化的项目需求。 9. **安全考虑**:在实际应用中,需要注意XSS(跨站脚本)和CSRF(跨站请求伪造)等安全问题,确保...

    HTMLArea-3.0-rc1多国语言

    4. **插件扩展**:HTMLArea的架构允许开发者通过编写插件来扩展其功能,满足特定项目或用户的定制需求。这使得它更加灵活,能够适应不断变化的技术环境和业务需求。 5. **API接口**:HTMLArea提供了一个API接口,...

    HTMLArea2.03

    2. **插件系统**:HTMLArea 支持插件扩展,用户可以根据需求安装或开发各种插件来增强编辑器的功能,例如添加表格编辑、代码高亮等。 3. **事件处理**:HTMLArea 提供了丰富的事件接口,开发者可以通过监听和处理...

    遍历窗体中的所有控件

    在Windows编程领域,遍历窗体中的所有控件是一项常见的任务,特别是在开发用户界面时,我们需要获取或操作界面上的各个元素。这个压缩包提供的源码实现了一个实用工具,允许用户通过输入窗体标题的部分字符来查找并...

    省市联动控件JS控件

    这个控件被称为PCAS(Province City Area Selector),其版本为2.02,提供了完整的功能集。在本文中,我们将详细探讨这种控件的工作原理、使用方法以及它在实际开发中的应用。 1. **工作原理**: 省市级联动控件...

    HTML 类似word编辑器 3.0版本

    1. 完全开源:HTMLArea 3.0遵循开源协议,用户可以免费使用、修改和分发代码,这对于开发者来说是一大优势,因为它提供了高度的定制性和透明度。 2. 富文本编辑:它支持多种格式化的文本操作,如字体样式、大小、...

    HtmlArea3.0 rc1下载

    4. **插件系统**:HTMLArea支持通过插件扩展其功能,例如添加表格编辑、代码高亮、拼写检查等高级特性。 5. **API接口**:HTMLArea提供了丰富的JavaScript API,允许开发者与其他JavaScript库和服务器端技术如PHP、...

    HTMLArea 网页编辑器 v3.0.rar

    在HTMLArea中,用户可以直接输入文字、插入图像、设置字体样式、调整段落格式等,而无需编写HTML代码。这对于非技术人员或者对HTML不熟悉的人来说尤其方便。它支持UBB(Unified BBCode)语法,这是一种类似于HTML的...

    citySelect:省市区选择控件

    area: "涡阳县", area_num: "涡阳县_341621", area_val: "341621", city: "亳州市", city_num: "亳州市_341600", city_val: "341600", prov: "安徽省", prov_num: "安徽省_340000", prov_val: "340000" } ...

    html在线编辑器HTMLArea3

    3. **插件系统**:HTMLArea3支持扩展,开发者可以根据需求编写插件,添加自定义功能,如图片上传、代码高亮等。 4. **兼容性**:它在多种浏览器环境下运行良好,包括Internet Explorer、Firefox、Chrome和Safari等...

    CAN经典教程.rar

    CAN(Controller Area Network)经典教程主要涵盖了CAN BUS 2.0B协议的详细内容,这是一种广泛应用的车辆网络通信协议,尤其在汽车电子设备之间。STM32是CAN接口的常见微控制器,它支持多种通信协议,包括CAN。下面...

    《Oracle经典教程》PDF

    《Oracle经典教程》是一本专为想要深入了解Oracle数据库系统的学习者设计的专业教程。Oracle数据库是全球广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。本教程旨在帮助读者从基础到高级全面掌握...

    Chart控件的多种用法

    ### Chart控件的多种用法 #### 一、概述 Chart 控件是.NET Framework中用于图形数据展示的强大工具,能够帮助开发者快速实现各种图表的显示功能。本文将详细介绍Chart控件的基本使用方法,并通过示例代码来展示...

    kc_ckeditor:在 ckeditor 的基础上增加了自定义插件:超链接插件,图片上传插件,代码显示插件

    在 ckeditor 的基础上增加了自定义插件:超链接插件,图片上传插件,代码显示插件 安装 gem 'kc_ckeditor', :github =&gt; "kc-train/kc_ckeditor", :tag =&gt; "0.0.1" 然后执行: $ bundle 使用 import styles 到 app/...

Global site tag (gtag.js) - Google Analytics