common.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. export function setAttributeInner(node, field, value, ns) {
  2. const name = field;
  3. if (ns === "style") {
  4. // ????? why do we need to do this
  5. if (node.style === undefined) {
  6. node.style = {};
  7. }
  8. node.style[name] = value;
  9. } else if (!!ns) {
  10. node.setAttributeNS(ns, name, value);
  11. } else {
  12. switch (name) {
  13. case "value":
  14. if (value !== node.value) {
  15. node.value = value;
  16. }
  17. break;
  18. case "initial_value":
  19. node.defaultValue = value;
  20. break;
  21. case "checked":
  22. node.checked = truthy(value);
  23. break;
  24. case "initial_checked":
  25. node.defaultChecked = truthy(value);
  26. break;
  27. case "selected":
  28. node.selected = truthy(value);
  29. break;
  30. case "initial_selected":
  31. node.defaultSelected = truthy(value);
  32. break;
  33. case "dangerous_inner_html":
  34. node.innerHTML = value;
  35. break;
  36. default:
  37. // https://github.com/facebook/react/blob/8b88ac2592c5f555f315f9440cbb665dd1e7457a/packages/react-dom/src/shared/DOMProperty.js#L352-L364
  38. if (!truthy(value) && bool_attrs.hasOwnProperty(name)) {
  39. node.removeAttribute(name);
  40. } else {
  41. node.setAttribute(name, value);
  42. }
  43. }
  44. }
  45. }
  46. const bool_attrs = {
  47. allowfullscreen: true,
  48. allowpaymentrequest: true,
  49. async: true,
  50. autofocus: true,
  51. autoplay: true,
  52. checked: true,
  53. controls: true,
  54. default: true,
  55. defer: true,
  56. disabled: true,
  57. formnovalidate: true,
  58. hidden: true,
  59. ismap: true,
  60. itemscope: true,
  61. loop: true,
  62. multiple: true,
  63. muted: true,
  64. nomodule: true,
  65. novalidate: true,
  66. open: true,
  67. playsinline: true,
  68. readonly: true,
  69. required: true,
  70. reversed: true,
  71. selected: true,
  72. truespeed: true,
  73. webkitdirectory: true,
  74. };
  75. function truthy(val) {
  76. return val === "true" || val === true;
  77. }