holder.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // 添加 Holder 插件
  2. KindEditor.plugin('holder', function(K)
  3. {
  4. var self = this;
  5. if (!self.options.htmlTags)
  6. {
  7. self.options.htmlTags = {};
  8. }
  9. if (!self.options.htmlTags.div)
  10. {
  11. self.options.htmlTags.div = [];
  12. }
  13. if (!self.options.htmlTags.span)
  14. {
  15. self.options.htmlTags.span = [];
  16. }
  17. self.options.htmlTags.div.push('data-holder', 'data-holder-edit', 'contenteditable');
  18. self.options.htmlTags.span.push('data-holder', 'data-holder-edit', 'contenteditable');
  19. self.afterCreate(function()
  20. {
  21. $(self.edit.doc.head).append([
  22. '<style>',
  23. '.holder-element {border: 1px solid #ea644a; background: #ffe5e0; border-radius: 4px; padding: 0 5px; cursor: pointer; color: #ea644a; position: relative; min-width: 50px; text-align: center}',
  24. '.holder-value {width: 20px; font-size: 0; position: absolute; top: 0; right: 0; bottom: 0;}',
  25. '.holder-element:before {content: attr(data-holder)}',
  26. '.holder-block {display: block; text-align: center}',
  27. '.holder-span {display: inline-block; line-height: 1}',
  28. '.holder-value:after {content: "X"; display: block; position: absolute; right: 0; top: 0; bottom: 0; border-radius: 0 3px 3px 0; background: #ffe5e0; text-align: center; font-size: 14px; display: flex; justify-content: center; align-items: center; width: 20px; border-left: 1px solid #ea644a; opacity: 0}',
  29. '.holder-element:hover .holder-value:after {opacity: 1}',
  30. '.holder-value:hover:after {background: #ea644a; color: #fff}',
  31. '</style>'
  32. ].join('\n'));
  33. $(self.edit.doc).find('.holder-element[contenteditable="true"]').attr('contenteditable', false);
  34. if (self.options.holderEdit)
  35. {
  36. $(self.edit.doc).on('click', '.holder-element', function(e)
  37. {
  38. var $ele = $(this);
  39. if($(e.target).is('.holder-value'))
  40. {
  41. $ele.remove();
  42. self.sync();
  43. return;
  44. }
  45. showHolderEditModal($ele.attr('data-holder'), $ele.find('.holder-value').text(), $ele.hasClass('holder-block'), function(text, value, asBlock)
  46. {
  47. var $holderElement = $(asBlock ? '<div>' : '<span>').attr('data-holder', text).attr('contenteditable', false).addClass(asBlock ? 'holder-block' : 'holder-span').addClass('holder-element');
  48. $holderElement.append($(asBlock ? '<div>' : '<span>').addClass('holder-value').text(value));
  49. if (self.options.holderEditText)
  50. {
  51. $holderElement.attr('data-holder-edit', self.options.holderEditText);
  52. }
  53. $ele.replaceWith($holderElement);
  54. self.edit.focus();
  55. self.sync();
  56. });
  57. });
  58. }
  59. });
  60. // 点击图标时执行
  61. self.clickToolbar('holder', function()
  62. {
  63. showHolderEditModal('', '', false, function(text, value, asBlock)
  64. {
  65. if(text)
  66. {
  67. var $holderElement = $(asBlock ? '<div>' : '<span>').attr('data-holder', text).attr('contenteditable', false).addClass(asBlock ? 'holder-block' : 'holder-span').addClass('holder-element');
  68. $holderElement.append($(asBlock ? '<div>' : '<span>').addClass('holder-value').text(value));
  69. if(self.options.holderEditText)
  70. {
  71. $holderElement.attr('data-holder-edit', self.options.holderEditText);
  72. }
  73. self.insertHtml($holderElement[0].outerHTML + '&nbsp;' + (asBlock ? '<br>' : ''));
  74. }
  75. });
  76. });
  77. });
  78. function showHolderEditModal(placeholder, value, asBlock, callback)
  79. {
  80. if(typeof placeholder === 'function')
  81. {
  82. callback = placeholder;
  83. placeholder = '';
  84. value = '';
  85. asBlock = false;
  86. }
  87. placeholder = placeholder || '';
  88. value = value || '';
  89. $('#holderText').val(placeholder);
  90. $('#holderValue').val(value);
  91. $('#holderAsBlock').prop('checked', !!asBlock);
  92. $('#holderModal').modal('show');
  93. if(typeof afterHolderShow == 'function') afterHolderShow(value);
  94. $('#holderSaveBtn').off('click').on('click', function()
  95. {
  96. if(callback)
  97. {
  98. callback($('#holderText').val(), $('#holderValue').val(), $('#holderAsBlock').is(':checked'))
  99. }
  100. $('#holderModal').modal('hide');
  101. });
  102. };