Simple createElement implementation

A simple implementation of React createElement using raw DOM.

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/382761/696167/Simple%20createElement%20implementation.js

  1. var h = (function () {
  2. function deref(fn) {
  3. return Function.call.bind(fn);
  4. }
  5.  
  6. var slice = deref(Array.prototype.slice);
  7.  
  8. // Lodash code starts here
  9. var MAX_SAFE_INTEGER = 9007199254740991;
  10.  
  11. function isObject(value) {
  12. var type = typeof value;
  13. return value != null && (type == 'object' || type == 'function');
  14. }
  15.  
  16. function isLength(value) {
  17. return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
  18. }
  19.  
  20. function isArrayLike(value) {
  21. return value != null && isLength(value.length) && !isFunction(value);
  22. }
  23.  
  24. function isObjectLike (value) {
  25. return value != null && typeof value == "object";
  26. }
  27. // Lodash code ends here
  28.  
  29. function isFunction(value) {
  30. return value instanceof Function;
  31. }
  32.  
  33. function makeArray(v) {
  34. return (isArrayLike(v) && typeof v !== "string") ? slice(v) : [v];
  35. }
  36.  
  37. function isNode(el) {
  38. return el instanceof Node;
  39. }
  40.  
  41. function isObjectLikeNotArray(value) {
  42. return isObjectLike(value) && !isArrayLike(value);
  43. }
  44.  
  45. /**
  46. * 深度对象合并
  47. * @param {Object} src 需要扩展的对象。
  48. * @param {Object} [...ext] 待扩展的属性。
  49. */
  50. function merge(src) {
  51. slice(arguments, 1).forEach(function (ext) {
  52. if (isObjectLikeNotArray(ext)) {
  53. Object.keys(ext).forEach(function (key) {
  54. var value = ext[key];
  55. if (isObjectLikeNotArray(value)) {
  56. if (!src[key]) {
  57. src[key] = {};
  58. }
  59. merge(src[key], value);
  60. } else {
  61. src[key] = value;
  62. }
  63. });
  64. }
  65. });
  66.  
  67. return src;
  68. }
  69.  
  70. /**
  71. * 建立一个 HTML 元素
  72. * @param {String|Function} tag 元素标签,或传入 Stateless 组件函数。
  73. * @param {Object.<String.String|Bool|Number>} [attrs = {}] 元素属性集合。
  74. * @param {Array.<String|Node>|String|Node} [...children] 子元素集合。
  75. */
  76. function h(tag, attrs) {
  77. var children = slice(arguments, 2);
  78.  
  79. // Stateless 组件建立
  80. if (isFunction(tag)) {
  81. return tag(Object.assign({ children }, attrs));
  82. }
  83.  
  84. var el = merge(document.createElement(tag), attrs);
  85. children.forEach(function (children) {
  86. makeArray(children).forEach(function (child) {
  87. el.appendChild(isNode(child) ? child : document.createTextNode(child));
  88. });
  89. });
  90. return el;
  91. }
  92.  
  93. return h;
  94. })();
  95.  
  96. /**
  97. * 将建立的元素挂载到一个 HTML 节点 (会先暴力清空节点内容)。
  98. * @param {HTMLElement} mnt 挂载点。
  99. * @param {Node} node HTML 元素或节点。
  100. */
  101. function mount(mnt, node) {
  102. mnt.innerHTML = "";
  103. mnt.appendChild(node);
  104. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址