choice.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import $ from '../util/dom-core.js';
  2. import { getParentByClassname, isEmptyElement } from '../util/util.js';
  3. const _mapOptionNum = [
  4. 'A', 'B', 'C', 'D', 'E', 'F',
  5. 'G', 'H', 'I', 'J', 'K', 'L',
  6. 'M', 'N', 'O', 'P', 'Q', 'R',
  7. 'S', 'T', 'U', 'V', 'W', 'X',
  8. 'Y', 'Z'
  9. ];
  10. /**
  11. * function 添加选择题
  12. * @param $border {DomElement} 需要添加题的框
  13. * @param data {JSON} 题目数据
  14. * @param editor {Objec} 编辑器对象
  15. */
  16. let generateChoice = function ($border, data, editor) {
  17. // 1、判断框是主观题框还是客观题框
  18. let proId = data.proId;
  19. let quId = data.quId;
  20. let type = parseInt($border.attr('data-type'));
  21. let nums = parseInt(data.nums);
  22. let pnum = data.pnum;
  23. let $questionItem = $('<div class="lsiten-question-choice js-lsiten-question"></div>');
  24. $questionItem.attr('data-type', 1);
  25. $questionItem.attr('data-pid', proId);
  26. $questionItem.attr('data-qid', quId);
  27. $questionItem.css('margin', '8px 0')
  28. .css('outline', 'none')
  29. .css('overflow', 'hidden')
  30. .css('position', 'relative');
  31. let mergePnum = data.proData.pnum;
  32. if (mergePnum && mergePnum.length > 0) {
  33. pnum = mergePnum +''+ pnum;
  34. }
  35. let $span = $('<span class = "lsiten-pnum-box"> ' + pnum + ' </span>');
  36. $span.css('min-width', '25px')
  37. .css('height', 'auto')
  38. .css('width', 'auto')
  39. .css('line-height', '14px')
  40. .css('display', 'inline-block')
  41. .css('text-align', 'right')
  42. .css('float', 'left')
  43. .css('margin-right', '0');
  44. let $optionBox = generateOptions(nums);
  45. $questionItem.append($span);
  46. $questionItem.append($optionBox);
  47. if (type === 1) {
  48. // 在客观题里添加
  49. let currentRow = parseInt($border.attr('data-current-row'));
  50. let row = parseInt($border.attr('data-row'));
  51. let column = parseInt($border.attr('data-column'));
  52. let $currentRow = null;
  53. try {
  54. $currentRow = $($border.find('.js-options-row')[currentRow]);
  55. } catch (err) {
  56. console.log("%c" + err, "color:red");
  57. return '';
  58. }
  59. if(!$currentRow.length) {
  60. return '';
  61. }
  62. let currentColumn = parseInt($currentRow.attr('data-current-column'));
  63. let $currentColumn = null;
  64. try {
  65. $currentColumn = $($currentRow.find('.js-option-column')[currentColumn]);
  66. } catch (err) {
  67. console.log("%c" + err, "color:red");
  68. return '';
  69. }
  70. let questionCount = parseInt($currentColumn.attr('data-question-count'));
  71. if (questionCount === 5) {
  72. // 下一栏
  73. if (currentColumn === (column - 1)) {
  74. // 下一行
  75. $border.attr('data-current-row', ++currentRow);
  76. let nextRowNode = $currentRow[0].nextSibling;
  77. if (nextRowNode) {
  78. $currentColumn = $(nextRowNode.firstChild);
  79. } else {
  80. console.log("%c该框问题个数已满了,请再添加框", "color:red");
  81. return '';
  82. }
  83. } else {
  84. $currentRow.attr('data-current-column', ++currentColumn);
  85. let nextColumnNode = $currentColumn[0].nextSibling;
  86. if (nextColumnNode) {
  87. $currentColumn = $(nextColumnNode);
  88. }
  89. }
  90. questionCount = 0;
  91. }
  92. $($currentColumn[0].firstChild).append($questionItem);
  93. $currentColumn.attr('data-question-count', ++questionCount);
  94. let size = $currentColumn.getSizeData();
  95. $currentRow.find('.js-option-column').css('min-height', size.height + 'px');
  96. } else {
  97. // 在主观题内添加
  98. let $selectionElem = editor.selection.getSelectionContainerElem();
  99. let $borderContent = getParentByClassname($selectionElem, 'border-content');
  100. if (!$borderContent) {
  101. console.log("%c请在框内添加该题!", "color:red");
  102. return '';
  103. }
  104. $borderContent.append($questionItem);
  105. if ( isEmptyElement($borderContent[0].firstChild) ) {
  106. $borderContent[0].removeChild($borderContent[0].firstChild);
  107. }
  108. editor.selection.getRange().setStartAfter($questionItem[0]);
  109. if (editor.selection.getRange()) {
  110. editor.selection.restoreSelection();
  111. }
  112. editor.selection.saveRange();
  113. editor.selection.collapseRange();
  114. }
  115. }
  116. /**
  117. * function 根据选项个数生产选项
  118. * @param num {int} 选项个数
  119. */
  120. function generateOptions (num) {
  121. let $box = $('<div class="lsiten-options-box"></div>');
  122. $box.css('display', 'inline-block').css('float', 'left').css('width', 'auto').css('font-size', '0');
  123. for (let i = 0; i < num; i++) {
  124. let $option = $('<div class="lsiten-option">' + _mapOptionNum[i] + '</div>');
  125. $option.css('border', '1px solid #000')
  126. .css('text-align', 'center')
  127. .css('width', '19px')
  128. .css('height', 'auto')
  129. .css('box-sizing', 'border-box')
  130. .css('font-size', '12px')
  131. .css('display', 'inline-block')
  132. .css('line-height', '0.95')
  133. .css('margin', '0 0 0 5px');
  134. $box.append($option);
  135. }
  136. return $box;
  137. }
  138. export default {
  139. generateChoice: generateChoice
  140. }