⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htmlarea.js

📁 網葉編輯器 ?W葉編輯器 網葉編輯器
💻 JS
📖 第 1 页 / 共 5 页
字号:
    if (cmd) {
      // execute simple command
      this.execCommand(cmd, false, value);
      HTMLArea._stopEvent(ev);
    }
  }
  /*
  else if (keyEvent) {
    // other keys here
    switch (ev.keyCode) {
        case 13: // KEY enter
      // if (HTMLArea.is_ie) {
      this.insertHTML("<br />");
      HTMLArea._stopEvent(ev);
      // }
      break;
    }
  }
  */
  // update the toolbar state after some time
  if (editor._timerToolbar) {
    clearTimeout(editor._timerToolbar);
  }
  editor._timerToolbar = setTimeout(function() {
    editor.updateToolbar();
    editor._timerToolbar = null;
  }, 50);
};

// retrieve the HTML
HTMLArea.prototype.getHTML = function() {
  switch (this._editMode) {
    case "wysiwyg"  : return HTMLArea.getHTML(this._doc.body, false);
    case "textmode" : return this._textArea.value;
    default      : alert("Mode <" + mode + "> not defined!");
  }
  return false;
};

// retrieve the HTML (fastest version, but uses innerHTML)
HTMLArea.prototype.getInnerHTML = function() {
  switch (this._editMode) {
    case "wysiwyg"  : return this._doc.body.innerHTML;
    case "textmode" : return this._textArea.value;
    default      : alert("Mode <" + mode + "> not defined!");
  }
  return false;
};

// completely change the HTML inside
HTMLArea.prototype.setHTML = function(html) {
  switch (this._editMode) {
    case "wysiwyg"  : this._doc.body.innerHTML = html; break;
    case "textmode" : this._textArea.value = html; break;
    default      : alert("Mode <" + mode + "> not defined!");
  }
  return false;
};

/***************************************************
 *  Category: UTILITY FUNCTIONS
 ***************************************************/

// browser identification

HTMLArea.agt = navigator.userAgent.toLowerCase();
HTMLArea.is_ie = ((HTMLArea.agt.indexOf("msie") != -1) && (HTMLArea.agt.indexOf("opera") == -1));
HTMLArea.is_opera = (HTMLArea.agt.indexOf("opera") != -1);
HTMLArea.is_mac = (HTMLArea.agt.indexOf("mac") != -1);
HTMLArea.is_mac_ie = (HTMLArea.is_ie && HTMLArea.is_mac);
HTMLArea.is_win_ie = (HTMLArea.is_ie && !HTMLArea.is_mac);
HTMLArea.is_gecko = (navigator.product == "Gecko");

// variable used to pass the object to the popup editor window.
HTMLArea._object = null;

// FIXME!!! this should return false for IE < 5.5
HTMLArea.checkSupportedBrowser = function() {
  if (HTMLArea.is_gecko) {
    if (navigator.productSub < 20021201) {
      alert("You need at least Mozilla-1.3 Alpha.\n" +
            "Sorry, your Gecko is not supported.");
      return false;
    }
    if (navigator.productSub < 20030210) {
      alert("Mozilla < 1.3 Beta is not supported!\n" +
            "I'll try, though, but it might not work.");
    }
  }
  return HTMLArea.is_gecko || HTMLArea.is_ie;
};

// selection & ranges

// returns the current selection object
HTMLArea.prototype._getSelection = function() {
  if (HTMLArea.is_ie) {
    return this._doc.selection;
  } else {
    return this._iframe.contentWindow.getSelection();
  }
};

// returns a range for the current selection
HTMLArea.prototype._createRange = function(sel) {
  if (HTMLArea.is_ie) {
    return sel.createRange();
  } else {
    this.focusEditor();
    if (typeof sel != "undefined") {
      return sel.getRangeAt(0);
    } else {
      return this._doc.createRange();
    }
  }
};

// event handling

HTMLArea._addEvent = function(el, evname, func) {
  if (HTMLArea.is_ie) {
    el.attachEvent("on" + evname, func);
  } else {
    el.addEventListener(evname, func, true);
  }
};

HTMLArea._addEvents = function(el, evs, func) {
  for (var i in evs) {
    HTMLArea._addEvent(el, evs[i], func);
  }
};

HTMLArea._removeEvent = function(el, evname, func) {
  if (HTMLArea.is_ie) {
    el.detachEvent("on" + evname, func);
  } else {
    el.removeEventListener(evname, func, true);
  }
};

HTMLArea._removeEvents = function(el, evs, func) {
  for (var i in evs) {
    HTMLArea._removeEvent(el, evs[i], func);
  }
};

HTMLArea._stopEvent = function(ev) {
  if (HTMLArea.is_ie) {
    ev.cancelBubble = true;
    ev.returnValue = false;
  } else {
    ev.preventDefault();
    ev.stopPropagation();
  }
};

HTMLArea._removeClass = function(el, className) {
  if (!(el && el.className)) {
    return;
  }
  var cls = el.className.split(" ");
  var ar = new Array();
  for (var i = cls.length; i > 0;) {
    if (cls[--i] != className) {
      ar[ar.length] = cls[i];
    }
  }
  el.className = ar.join(" ");
};

HTMLArea._addClass = function(el, className) {
  // remove the class first, if already there
  HTMLArea._removeClass(el, className);
  el.className += " " + className;
};

HTMLArea._hasClass = function(el, className) {
  if (!(el && el.className)) {
    return false;
  }
  var cls = el.className.split(" ");
  for (var i = cls.length; i > 0;) {
    if (cls[--i] == className) {
      return true;
    }
  }
  return false;
};

HTMLArea.isBlockElement = function(el) {
  var blockTags = " body form textarea fieldset ul ol dl li div " +
                  "p h1 h2 h3 h4 h5 h6 quote pre table thead " +
                  "tbody tfoot tr td iframe address ";
  return (blockTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
};

HTMLArea.needsClosingTag = function(el) {
  var closingTags = " script style div span tr td tbody table em strong font a ";
  return (closingTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
};

// performs HTML encoding of some given string
HTMLArea.htmlEncode = function(str) {
  // we don't need regexp for that, but.. so be it for now.
  str = str.replace(/&/ig, "&amp;");
  str = str.replace(/</ig, "&lt;");
  str = str.replace(/>/ig, "&gt;");
  str = str.replace(/\x22/ig, "&quot;");
  // \x22 means '"' -- we use hex reprezentation so that we don't disturb
  // JS compressors (well, at least mine fails.. ;)
  return str;
};

// Retrieves the HTML code from the given node.	 This is a replacement for
// getting innerHTML, using standard DOM calls.
HTMLArea.getHTML = function(root, outputRoot) {
  var html = "";
  switch (root.nodeType) {
    case 1: // Node.ELEMENT_NODE
    case 11: // Node.DOCUMENT_FRAGMENT_NODE
      var closed;
      var i;
      if (outputRoot) {
        closed = (!(root.hasChildNodes() || HTMLArea.needsClosingTag(root)));
        html = "<" + root.tagName.toLowerCase();
        var attrs = root.attributes;
        for (i = 0; i < attrs.length; ++i) {
          var a = attrs.item(i);
          if (!a.specified) {
            continue;
          }
          var name = a.nodeName.toLowerCase();
          if (/_moz/.test(name)) {
            // Mozilla reports some special tags
            // here; we don't need them.
            continue;
          }
          var value;
          if (name != "style") {
            // IE5.5 reports 25 when cellSpacing is
            // 1; other values might be doomed too.
            // For this reason we extract the
            // values directly from the root node.
            // I'm starting to HATE JavaScript
            // development.  Browser differences
            // suck.
            if (typeof root[a.nodeName] != "undefined") {
              value = root[a.nodeName];
            } else {
              value = a.nodeValue;
            }
          } else { // IE fails to put style in attributes list
            // FIXME: cssText reported by IE is UPPERCASE
            value = root.style.cssText;
          }
          if (/_moz/.test(value)) {
            // Mozilla reports some special tags
            // here; we don't need them.
            continue;
          }
          html += " " + name + '="' + value + '"';
        }
        html += closed ? " />" : ">";
      }
      for (i = root.firstChild; i; i = i.nextSibling) {
        html += HTMLArea.getHTML(i, true);
      }
      if (outputRoot && !closed) {
        html += "</" + root.tagName.toLowerCase() + ">";
      }
      break;
    case 3: // Node.TEXT_NODE
      html = HTMLArea.htmlEncode(root.data);
      break;
    case 8: // Node.COMMENT_NODE
      html = "<!--" + root.data + "-->";
      break;    // skip comments, for now.
  }
  return html;
};

// creates a rgb-style color from a number
HTMLArea._makeColor = function(v) {
  if (typeof v != "number") {
    // already in rgb (hopefully); IE doesn't get here.
    return v;
  }
  // IE sends number; convert to rgb.
  var r = v & 0xFF;
  var g = (v >> 8) & 0xFF;
  var b = (v >> 16) & 0xFF;
  return "rgb(" + r + "," + g + "," + b + ")";
};

// returns hexadecimal color representation from a number or a rgb-style color.
HTMLArea._colorToRgb = function(v) {
  // returns the hex representation of one byte (2 digits)
  function hex(d) {
    return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
  }
  ;

  if (typeof v == "number") {
    // we're talking to IE here
    var r = v & 0xFF;
    var g = (v >> 8) & 0xFF;
    var b = (v >> 16) & 0xFF;
    return "#" + hex(r) + hex(g) + hex(b);
  }

  if (v.substr(0, 3) == "rgb") {
    // in rgb(...) form -- Mozilla
    var re = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/;
    if (v.match(re)) {
      var r = parseInt(RegExp.$1);
      var g = parseInt(RegExp.$2);
      var b = parseInt(RegExp.$3);
      return "#" + hex(r) + hex(g) + hex(b);
    }
    // doesn't match RE?!  maybe uses percentages or float numbers
    // -- FIXME: not yet implemented.
    return null;
  }

  if (v[0] == "#") {
    // already hex rgb (hopefully :D )
    return v;
  }

  // if everything else fails ;)
  return null;
};

// modal dialogs for Mozilla (for IE we're using the showModalDialog() call).

// receives an URL to the popup dialog and a function that receives one value;
// this function will get called after the dialog is closed, with the return
// value of the dialog.
HTMLArea.prototype._popupDialog = function(url, action, init) {
  Dialog(this.popupURL(url), action, init);
};

// paths

HTMLArea.prototype.imgURL = function(file, plugin) {
  if (typeof plugin == "undefined") {
    return this.config.editorURL + file;
  } else {
    return this.config.editorURL + "plugins/" + plugin + "/img/" + file;
  }
};

HTMLArea.prototype.popupURL = function(file) {
  return this.config.editorURL + this.config.popupURL + file;
};
// EOF
// Local variables: //
// c-basic-offset:8 //
// indent-tabs-mode:t //
// End: //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -