lsiten 6 jaren geleden
bovenliggende
commit
1d72865c6c
1 gewijzigde bestanden met toevoegingen van 224 en 73 verwijderingen
  1. 224 73
      src/js/yzPage.js

+ 224 - 73
src/js/yzPage.js

@@ -304,16 +304,22 @@ yzPage.prototype = {
          contentIndex++;
        });
        // 更新栏高 结束    
-       let rowIndex = 0;
-       $(updateNextPara).find('.js-options-row').forEach(row => {
-         if (rowIndex > 0) {
-           $(row).css('border-top', '1px solid #000');
-         }
-         rowIndex++;
-       })
+       this._updateObjectColumnBorder(updateNextPara);
      }
   },
   /**
+  * function 更新客观题栏行线
+  */
+  _updateObjectColumnBorder: function (border) {
+    let rowIndex = 0;
+    $(border).find('.js-options-row').forEach(row => {
+      if (rowIndex > 0) {
+        $(row).css('border-top', '1px solid #000');
+      }
+      rowIndex++;
+    })
+  },
+  /**
    * function 插入段落
   * @param {DomElement}  $insertParagraph 需要插入的段落
    * @param {DomElement}  $firsParagraph 插入该段之前
@@ -386,9 +392,11 @@ yzPage.prototype = {
               $(objectLastRow).remove();
               this._insertDomBeforeByFirst($(insertLast), objectFirstRow);
             } else {
-              this._insertDomBeforeByFirst($(insertLast), objectFirstRow);
+              if (!this.isObjectEmpty(insertLast)) {
+                this._insertDomBeforeByFirst($(insertLast), objectFirstRow);
+              }
             }
-          } else {
+          } else if (borderType === 2) {
             let insertLastQuestion = insertLast.firstChild.lastChild;
             let firstFirstQuestion = firstFirst.firstChild.firstChild;
             this._mergeSplitBorder(insertLastQuestion, firstFirstQuestion, $(insertLast));
@@ -410,6 +418,33 @@ yzPage.prototype = {
     }
   },
   /**
+   * function 判断客观题框是否为空
+   * @param {node} object 客观题框
+   */
+  isObjectEmpty: function (object) {
+    let $object = $(object);
+    $object.childNodes().forEach(row => {
+      if(this.isObjectRowEmpty(row)) {
+        $(row).remove();
+      }
+    })
+    return isEmptyElement(object);
+  },
+  /**
+   * function 判断客观题框行是否为空
+   * @param {node} objectRow 客观题行
+   */
+  isObjectRowEmpty: function (objectRow) {
+    let $objectRow = $(objectRow);
+    let status = true;
+    $objectRow.childNodes().forEach(colum => {
+      if (!isEmptyElement(colum.firstChild)) {
+        status = false;
+      }
+    })
+    return status;
+  },
+  /**
    * function 合并框
    * @param {node} lQuestion 上一段最后一个问题
    * @param {node} fQuestion 下一段第一个问题
@@ -593,75 +628,103 @@ yzPage.prototype = {
                     let currentBorderId = $item.attr('data-id');
 
                     if (currentBorderId === borderId) {
-                      $($item[0].firstChild).childNodes().forEach(borderItem => {
-                        if (borderItem.className) {
-                          if (borderItem.className.indexOf('js-lsiten-question') > -1) {
-                            let qustionType = parseInt(borderItem.getAttribute('data-type'));
-                            let lastQuestionItem = lastBorderItem.lastChild;
-                            let lastQuestionId = lastQuestionItem.getAttribute('data-id');
-                            let currentQuestionId = borderItem.getAttribute('data-id');
-                            if (lastQuestionId && currentQuestionId && currentQuestionId === lastQuestionId) {
-                              if (qustionType === 3) {
-                                $(borderItem).childNodes().forEach(subjectItem => {
-                                  lastQuestionItem.appendChild(subjectItem);
-                                })
-
-                              } else if (qustionType === 4) {
-                                $(borderItem).childNodes().forEach(writtingItem => {
-                                  if (writtingItem.className.indexOf('lsiten-title') > -1) {
-                                    let $prevWrittingTitleItem = $(lastQuestionItem).find('.lsiten-title');
-                                    let needMergeItem = true;
-                                    if (!$prevWrittingTitleItem.length) {
-                                      needMergeItem = false;
-                                      $prevWrittingTitleItem = $($prevWrittingTitleItem);
-                                    } else {
-                                      needMergeItem = false;
-                                      $prevWrittingTitleItem = $(writtingItem).clone(false);
-                                    }
-                                    $(writtingItem).childNodes().forEach(writtingTitleItem => {
-                                      $prevWrittingTitleItem[0].appendChild(writtingTitleItem);
-                                    })
-
-                                    if (needMergeItem && !isEmptyElement($prevWrittingTitleItem[0])) {
-                                      lastQuestionItem.appendChild($prevWrittingTitleItem[0]);
-                                    }
-                                  } else if (writtingItem.className.indexOf('lsiten-border-box') > -1) {
-                                    let $prevWrittingRowsItem = $(lastQuestionItem).find('.lsiten-border-box');
-                                    let needMergeItem = true;
-                                    if (!$prevWrittingRowsItem.length) {
-                                      needMergeItem = false;
-                                      $prevWrittingRowsItem = $($prevWrittingRowsItem);
-                                    } else {
-                                      needMergeItem = false;
-                                      $prevWrittingRowsItem = $(writtingItem).clone(false);
-                                    }
-                                    $(writtingItem).childNodes().forEach(writtingRowItem => {
-                                      $prevWrittingRowsItem[0].appendChild(writtingRowItem);
-                                    })
-
-                                    if (needMergeItem && !isEmptyElement($prevWrittingRowsItem[0])) {
-                                      lastQuestionItem.appendChild($prevWrittingRowsItem[0]);
+                      let borderType = parseInt($item.attr('data-id'));
+                      if (borderType === 1) {
+                        // 客观题处理
+                        $item.childNodes().forEach(objectRow => {                        
+                          if (!objectRow.previousSibling) {
+                            let lastRow = lastBorderItem.lastChild;
+                            let firstRowId = objectRow.getAttribute('data-id');
+                            let lastRowId = lastRow.getAttribute('data-id');
+                            if (firstRowId === lastRowId) {
+                              let objectColumns = $(objectRow).find('.js-option-column');
+                              // 以第一栏的为基准
+                              let objectFirstColumn = objectColumns[0];
+                              let questionIndex = 0;
+                              $(objectFirstColumn.firstChild).childNodes().forEach(objectQuestion => {
+                                if (!objectQuestion.previousSibling) {
+                                  this._mergeObjectRow(questionIndex, objectFirstColumn, lastRow);
+                                }
+                                questionIndex++;
+                              })
+                            } else {
+                              lastBorderItem.append(objectRow);
+                            }
+                          }
+                        })
+                        $item.remove();
+                        this._updateObjectColumnBorder(lastBorderItem);
+                      } else if (borderType === 2) {
+                        $($item[0].firstChild).childNodes().forEach(borderItem => {
+                          if (borderItem.className) {
+                            if (borderItem.className.indexOf('js-lsiten-question') > -1) {
+                              let qustionType = parseInt(borderItem.getAttribute('data-type'));
+                              let lastQuestionItem = lastBorderItem.lastChild;
+                              let lastQuestionId = lastQuestionItem.getAttribute('data-id');
+                              let currentQuestionId = borderItem.getAttribute('data-id');
+                              if (lastQuestionId && currentQuestionId && currentQuestionId === lastQuestionId) {
+                                if (qustionType === 3) {
+                                  $(borderItem).childNodes().forEach(subjectItem => {
+                                    lastQuestionItem.appendChild(subjectItem);
+                                  })
+  
+                                } else if (qustionType === 4) {
+                                  $(borderItem).childNodes().forEach(writtingItem => {
+                                    if (writtingItem.className.indexOf('lsiten-title') > -1) {
+                                      let $prevWrittingTitleItem = $(lastQuestionItem).find('.lsiten-title');
+                                      let needMergeItem = true;
+                                      if (!$prevWrittingTitleItem.length) {
+                                        needMergeItem = false;
+                                        $prevWrittingTitleItem = $($prevWrittingTitleItem);
+                                      } else {
+                                        needMergeItem = false;
+                                        $prevWrittingTitleItem = $(writtingItem).clone(false);
+                                      }
+                                      $(writtingItem).childNodes().forEach(writtingTitleItem => {
+                                        $prevWrittingTitleItem[0].appendChild(writtingTitleItem);
+                                      })
+  
+                                      if (needMergeItem && !isEmptyElement($prevWrittingTitleItem[0])) {
+                                        lastQuestionItem.appendChild($prevWrittingTitleItem[0]);
+                                      }
+                                    } else if (writtingItem.className.indexOf('lsiten-border-box') > -1) {
+                                      let $prevWrittingRowsItem = $(lastQuestionItem).find('.lsiten-border-box');
+                                      let needMergeItem = true;
+                                      if (!$prevWrittingRowsItem.length) {
+                                        needMergeItem = false;
+                                        $prevWrittingRowsItem = $($prevWrittingRowsItem);
+                                      } else {
+                                        needMergeItem = false;
+                                        $prevWrittingRowsItem = $(writtingItem).clone(false);
+                                      }
+                                      $(writtingItem).childNodes().forEach(writtingRowItem => {
+                                        $prevWrittingRowsItem[0].appendChild(writtingRowItem);
+                                      })
+  
+                                      if (needMergeItem && !isEmptyElement($prevWrittingRowsItem[0])) {
+                                        lastQuestionItem.appendChild($prevWrittingRowsItem[0]);
+                                      }
                                     }
-                                  }
-                                })
-                              } else {
+                                  })
+                                } else {
+                                  $(borderItem).remove();
+                                }
                                 $(borderItem).remove();
+                              } else {
+                                lastBorderItem.firstChild.appendChild(borderItem);
                               }
-                              $(borderItem).remove();
-                            } else {
+                            } else if (itemClass && itemClass.indexOf('js-lsiten-options-box') > -1) {
+                              // 选作题组【回退】
+                              lastBorderItem.firstChild.appendChild(borderItem);
+                            } else if (borderItem.className.indexOf('js-lsiten-line') > -1) {
                               lastBorderItem.firstChild.appendChild(borderItem);
+                            } else {
+                              $(borderItem).remove();
                             }
-                          } else if (itemClass && itemClass.indexOf('js-lsiten-options-box') > -1) {
-                            // 选作题组【回退】
-                            lastBorderItem.firstChild.appendChild(borderItem);
-                          } else if (borderItem.className.indexOf('js-lsiten-line') > -1) {
-                            lastBorderItem.firstChild.appendChild(borderItem);
-                          } else {
-                            $(borderItem).remove();
                           }
-                        }
-                      })
-                      $item.remove();
+                        })
+                        $item.remove();
+                      }
                     } else {
                       $lastParagraph.append($item);                      
                     }
@@ -681,6 +744,7 @@ yzPage.prototype = {
         // 跨栏符检测
         this._updateCrossColumn($column);
         this._updateCrossColumn(nextColumn.column);
+        this._updateObjectColumnHeight(nextColumn.column[0]); 
       }
     }
   },
@@ -815,7 +879,94 @@ yzPage.prototype = {
         let $prevBorder = $border.clone(false);
         if (isMerge) {
           $prevBorder = $($prevParagraph[0].lastChild);
-          
+        }
+
+        $border.childNodes().forEach(row => {
+          debugger;
+          if (!row.previousSibling) {
+            let lastRow = lastCentent.lastChild;
+            let firstRowId = row.getAttribute('data-id');
+            let lastRowId = lastRow.getAttribute('data-id');
+            if (firstRowId === lastRowId) {
+              let columns = $(row).find('.js-option-column');
+              // 以第一栏的为基准计算
+              let firstColumn = columns[0];
+              let questionIndex = 0;
+              $(firstColumn.firstChild).childNodes().forEach(question => {
+                if (!question.previousSibling) {
+                  let height = $(question).getSizeData().height;
+                  if (height < size.diff) {
+                    this._mergeObjectRow(questionIndex, columns, lastRow);
+                    size.diff -= height;
+                  }
+                }
+                questionIndex++;
+              })
+              if (isEmptyElement(firstColumn.firstChild)) {
+                $(row).remove();
+              }
+            } else {
+              // 客观题每一个row的高度
+              let rowOutsize = 24;
+              size.diff -= rowOutsize;
+              let columns = $(row).find('.js-option-column');
+              // 以第一栏的为基准计算
+              let firstColumn = columns[0];
+              let questionIndex = 0;
+              let prevRow = row.cloneNode(false)
+              $(firstColumn.firstChild).childNodes().forEach(question => {
+                if (!question.previousSibling) {
+                  let height = $(question).getSizeData().height;
+                  if (height < size.diff) {
+                    this._mergeObjectRow(questionIndex, columns, prevRow);
+                    size.diff -= height;
+                  }
+                }
+                questionIndex++;
+              })
+
+              if (!isEmptyElement(prevRow)) {
+                $prevBorder[0].appendChild(prevRow);
+              }
+              size.diff += rowOutsize;
+              if (isEmptyElement(firstColumn.firstChild)) {
+                $(row).remove();
+              }
+            }
+          }
+        })
+
+
+        if (!isMerge && !isEmptyElement($prevBorder[0])) {
+          $prevParagraph.append($prevBorder);
+        }
+
+        if (isEmptyElement($border[0])) {
+          $border.remove();
+        }
+        this._updateObjectColumnBorder(lastCentent);
+      }
+    }
+  },
+  /**
+   * function 合并主观题行
+   * @param {number} questionIndex 第几个question的index
+   * @param {Array} columns 需要处理的栏
+   * @param {node} lastRow 上一段最后一框最后一行
+   */
+  _mergeObjectRow: function (questionIndex, columns, lastRow) {
+    let lastColumns = $(lastRow).find('.js-option-column');
+    let length = columns.length;
+    for (let i =0; i < length; i++) {
+      if (columns[i].firstChild.childNodes[questionIndex]) {
+        if (lastColumns[i]) {
+          lastColumns[i].firstChild.appendChild(columns[i].firstChild.childNodes[questionIndex]);
+        } else {
+          let prevColumn = columns[i].cloneNode(false);
+          let prevColumnContent = columns[i].firstChild.cloneNode(false);
+          prevColumn.appendChild(prevColumnContent);
+          prevColumnContent.appendChild(columns[i].firstChild.childNodes[questionIndex]);
+          lastRow.appendChild(prevColumn);
         }
       }
     }