W3 modal closes automatically after executing an onclick JavaScript

Viewed 30

I have created a W3 modal which encompasses a JavaScript picture framing calculator. The problem I'm running into is that while the calculator works - the result only stays visible for a split second, then the modal automatically closes.

I've attempted F12 tools, but the error clears in a split second when the modal closes so I can't see it unless I'm missing something.

Here's my code, and you can enter the following into the calculator to test it:

  1. Frame Width = 16
  2. Frame Height = 20
  3. Picture Width = 11
  4. Picture Height = 17
  5. Bottom Mat = 1

function calc()

{

  var frameWidth = document.getElementById('frameWidth').value
  frameWidth = parseInt(frameWidth)

  var frameWidthFraction = document.getElementById('frameWidthFraction').value
  frameWidthFraction = parseFloat(frameWidthFraction)

  var frameHeight = document.getElementById('frameHeight').value
  frameHeight = parseInt(frameHeight)

  var frameHeightFraction = document.getElementById('frameHeightFraction').value
  frameHeightFraction = parseFloat(frameHeightFraction)

  var pictureWidth = document.getElementById('pictureWidth').value
  pictureWidth = parseInt(pictureWidth)

  var pictureWidthFraction = document.getElementById('pictureWidthFraction').value
  pictureWidthFraction = parseFloat(pictureWidthFraction)

  var pictureHeight = document.getElementById('pictureHeight').value
  pictureHeight = parseInt(pictureHeight)

  var pictureHeightFraction = document.getElementById('pictureHeightFraction').value
  pictureHeightFraction = parseFloat(pictureHeightFraction)

  var bottomMat = document.getElementById('bottomMat').value
  bottomMat = parseInt(bottomMat)

  var bottomMatFraction = document.getElementById('bottomMatFraction').value
  bottomMatFraction = parseFloat(bottomMatFraction)

  if (isNaN(frameWidth) || isNaN(frameHeight) || isNaN(pictureWidth) || isNaN(pictureHeight) || isNaN(bottomMat)) {
    alert('All fields are required!')
    return false;
  }

  var widthdoubletop = ((frameHeight + frameHeightFraction) - (pictureHeight + pictureHeightFraction)) / 2;
  var heightdoubletop = ((frameWidth + frameWidthFraction) - (pictureWidth + pictureWidthFraction)) / 2;
  var widthdoublebottom = ((frameHeight + frameHeightFraction) - (pictureHeight + pictureHeightFraction)) / (2) + (bottomMat + bottomMatFraction);
  var heightdoublebottom = ((frameWidth + frameWidthFraction) - (pictureWidth + pictureWidthFraction)) / (2) + (bottomMat + bottomMatFraction);

  document.getElementById('widthdoubletop').innerHTML = new Fraction(widthdoubletop).toString() + '"';
  document.getElementById('heightdoubletop').innerHTML = new Fraction(heightdoubletop).toString() + '"';
  document.getElementById('widthdoublebottom').innerHTML = new Fraction(widthdoublebottom).toString() + '"';
  document.getElementById('heightdoublebottom').innerHTML = new Fraction(heightdoublebottom).toString() + '"';

  return false;

}

function resetOutput() {
  document.getElementById('widthdoubletop').innerHTML = ""
  document.getElementById('heightdoubletop').innerHTML = ""
  document.getElementById('widthdoublebottom').innerHTML = ""
  document.getElementById('heightdoublebottom').innerHTML = ""
}
.square-container-double {
  display: flex;
  flex-wrap: wrap;
}

.square-double {
  position: relative;
  flex-basis: calc(50% - 10px);
  margin: 5px;
  margin-bottom: 40px;
  border: 5px solid;
  box-sizing: border-box;
  background-color: gray;
}

.square-double::before {
  content: '';
  display: block;
  padding-top: 100%;
}

.square-double .content-double {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  display: inline-block;
  justify-content: right;
  align-items: top;
}
<!DOCTYPE html>
<html lang="en">

<head>
  <title>I Was Framed</title>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">


</head>

<body>

  <div class="w3-third w3-margin-bottom">
    <div class="w3-container w3-white">
      <button class="w3-button w3-black w3-margin-bottom" onclick="document.getElementById('doubleMatModal').style.display='block'">Calculator</button>
    </div>
  </div>
  </div>
  </div>
  </div>
  <!-- Double Mat Modal -->
  <div id="doubleMatModal" class="w3-modal">
    <div class="w3-modal-content w3-animate-zoom w3-card-4">
      <header class="w3-container w3-teal w3-center w3-padding-32">
        <span onclick="document.getElementById('doubleMatModal').style.display='none'" class="w3-button w3-teal w3-xlarge w3-display-topright">×</span>
        <h2 class="w3-wide"><i class="fa fa-calculator w3-margin-right"></i>Double Mat</h2>
      </header>
      <div class="w3-container">

        <form id="singlematcalculator" onreset="resetOutput()">
          <div class="w3-section">

            <label>Frame Width</label>
            <input class="w3-input" style="width:100%;" type="number" title="numbers should be in inches" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" step="any" min="0"
              name="frameWidth" id="frameWidth">
            <span class="inline">
                          <select class="w3-input w3-round" style="width:100%;" name="frameWidthFraction" id="frameWidthFraction">
                              <option value="0">0</option>
                                  <option value="0.0625">1/16</option>
                                      <option value="0.0125">1/8</option>
                                          <option value="0.1875">3/16</option>
                                          <option value="0.25">1/4</option>
                                          <option value="0.3125">5/16</option>
                                          <option value="0.375">3/8</option>
                                          <option value="0.4375">7/16</option>
                                          <option value="0.50">1/2</option>
                                          <option value="0.5625">9/16</option>
                                          <option value="0.625">5/8</option>
                                          <option value="0.6875">11/16</option>
                                          <option value="0.75">3/4</option>
                                          <option value="0.8125">3/16</option>
                                          <option value="0.875">7/8</option> 
                                          <option value="0.9375">15/16</option>
                          </select>
                      </span>
          </div>

          <div class="w3-section">
            <label>Frame Height</label>
            <input class="w3-input" style="width:100%;" type="number" title="numbers should be in inches" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" step="any" min="0"
              name="FrameHeight" id="frameHeight">
            <span class="inline">
                          <select class="w3-input w3-round" style="width:100%;" name="frameHeightFraction" id="frameHeightFraction">
                              <option value="0">0</option>
                                  <option value="0.0625">1/16</option>
                                      <option value="0.0125">1/8</option>
                                          <option value="0.1875">3/16</option>
                                          <option value="0.25">1/4</option>
                                          <option value="0.3125">5/16</option>
                                          <option value="0.375">3/8</option>
                                          <option value="0.4375">7/16</option>
                                          <option value="0.50">1/2</option>
                                          <option value="0.5625">9/16</option>
                                          <option value="0.625">5/8</option>
                                          <option value="0.6875">11/16</option>
                                          <option value="0.75">3/4</option>
                                          <option value="0.8125">3/16</option>
                                          <option value="0.875">7/8</option> 
                                          <option value="0.9375">15/16</option>
                          </select>
                      </span>
          </div>

          <div class="w3-section">
            <label>Picture Width</label>
            <input class="w3-input" style="width:100%;" type="number" title="numbers should be in inches" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" step="any" min="0"
              name="pictureWidth" id="pictureWidth">
            <span class="inline">
                          <select class="w3-input w3-round" style="width:100%;" name="pictureWidthFraction" id="pictureWidthFraction">
                              <option value="0">0</option>
                                  <option value="0.0625">1/16</option>
                                      <option value="0.0125">1/8</option>
                                          <option value="0.1875">3/16</option>
                                          <option value="0.25">1/4</option>
                                          <option value="0.3125">5/16</option>
                                          <option value="0.375">3/8</option>
                                          <option value="0.4375">7/16</option>
                                          <option value="0.50">1/2</option>
                                          <option value="0.5625">9/16</option>
                                          <option value="0.625">5/8</option>
                                          <option value="0.6875">11/16</option>
                                          <option value="0.75">3/4</option>
                                          <option value="0.8125">3/16</option>
                                          <option value="0.875">7/8</option> 
                                          <option value="0.9375">15/16</option>
                          </select>
                      </span>
          </div>

          <div class="w3-section">
            <label>Picture Height</label>
            <input class="w3-input" style="width:100%;" type="number" title="numbers should be in inches" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" step="any" min="0"
              name="pictureHeight" id="pictureHeight">
            <span class="inline">
                          <select class="w3-input w3-round" style="width:100%;" name="pictureHeightFraction" id="pictureHeightFraction">
                              <option value="0">0</option>
                                  <option value="0.0625">1/16</option>
                                      <option value="0.0125">1/8</option>
                                          <option value="0.1875">3/16</option>
                                          <option value="0.25">1/4</option>
                                          <option value="0.3125">5/16</option>
                                          <option value="0.375">3/8</option>
                                          <option value="0.4375">7/16</option>
                                          <option value="0.50">1/2</option>
                                          <option value="0.5625">9/16</option>
                                          <option value="0.625">5/8</option>
                                          <option value="0.6875">11/16</option>
                                          <option value="0.75">3/4</option>
                                          <option value="0.8125">3/16</option>
                                          <option value="0.875">7/8</option> 
                                          <option value="0.9375">15/16</option>
                          </select>
                      </span>
          </div>

          <div class="w3-section">
            <label>Bottom Mat</label>
            <input class="w3-input" style="width:100%;" type="number" title="numbers should be in inches" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" step="any" min="0"
              name="bottomMat" id="bottomMat">
            <span class="inline">
                          <select class="w3-input w3-round" style="width:100%;" name="bottomMatFraction" id="bottomMatFraction">
                              <option value="0">0</option>
                                  <option value="0.0625">1/16</option>
                                      <option value="0.0125">1/8</option>
                                          <option value="0.1875">3/16</option>
                                          <option value="0.25">1/4</option>
                                          <option value="0.3125">5/16</option>
                                          <option value="0.375">3/8</option>
                                          <option value="0.4375">7/16</option>
                                          <option value="0.50">1/2</option>
                                          <option value="0.5625">9/16</option>
                                          <option value="0.625">5/8</option>
                                          <option value="0.6875">11/16</option>
                                          <option value="0.75">3/4</option>
                                          <option value="0.8125">3/16</option>
                                          <option value="0.875">7/8</option> 
                                          <option value="0.9375">15/16</option>
                          </select>
                      </span>
          </div>

          <button class="w3-button w3-block w3-teal w3-padding-16 w3-section w3-right" onclick="calc();return false;" value="Calculate" name="cmdCalc">CALCULATE<i class="fa fa-check"></i></button>
          <input type="reset" onclick="resetOutput()" class="w3-button w3-block w3-teal w3-padding-16 w3-section w3-right" value="RESET">
          <button class="w3-button w3-red w3-section" onclick="document.getElementById('doubleMatModal').style.display='none'">Close <i class="fa fa-remove"></i></button>
          <p class="w3-right">Need <a href="#" class="w3-text-blue">help?</a></p>

          <script src="https://iwasframed.com/calculator/fraction.js/index.js"></script>

          <div class="square-container-double">

            <div class="square-double">
              <div class="content-double">
                <span><div id="widthdoubletop"></div>
                <div class="content-double spread">
              <div id="heightdoubletop"></div>
            </div>
                
                </span>

              </div>
            </div>
            <div class="square-double">
              <div class="content-double spread">
                <div id="widthdoublebottom"></div>
              </div>
            </div>



          </div>

As you can see - after you click Calculate - the JavaScript executes, but then the modal instantly closes

Can someone provide some guidance as to why my modal automatically closes when my JavaScript is executed?

0 Answers
Related