Отображение дублированного кода

105
27 декабря 2020, 03:30

имеется функции загрузки модели

   var canvas = document.querySelectorAll(".cv").forEach(el => 
   el.addEventListener('click',loadModel(), false));
    var viewer = new JSC3D.Viewer(canvas);
    var logoTimerID = 0;

function loadModel() {
    if(logoTimerID > 0) {
        clearInterval(logoTimerID);
        logoTimerID = 0;
        viewer.enableDefaultInputHandler(true);
    }
    var models = document.getElementById('model_list');
    viewer.replaceSceneFromUrl('models/' + models[models.selectedIndex].innerHTML);
    viewer.update();
}

она выводит модель без проблем, но при дублировании html-кода по выводу модели,

            <div class=”Area”  id="main_frame">
              <div id="statistics"></div>
              <div style="text-align:center;">
                <div id="loading" style="position:absolute;top: 45%; margin-left: 40%; "></div>
              </div>
              <canvas  id="cv" width="1100";  height=550"></canvas>
              <div style="float:left; display:none;">
                <select id="model_list">
                  <option>dragon.stl</option>
                </select>
                <button id="load" onclick="loadModel();">Load</button>
              </div>   
                <div id="position">
                    <select  id="render_mode_list" id="change" onclick="setRenderMode();">
                      <option>сглаживание</option>
                      <option>каркас</option>
                      <option>плоская</option>
                      <option>вершины</option>
                      <option>освещение OFF</option>
                    </select>
                </div>
            </div>

выводится только одна модель, в дублированную часть кода она отказывается загружаться(в дублированом option находится другая модель)

Answer 1

Не используйте на странице повторяющиеся id.

function loadModel(btn) { 
  /* what is this timer? if(logoTimerID > 0) { 
      clearInterval(logoTimerID); 
      logoTimerID = 0; 
      viewer.enableDefaultInputHandler(true); 
  }*/ 
  var area = btn.closest(".Area"); 
  var models = area.querySelector('.model_list'); 
  var viewer = area.viewer; 
  if (!viewer) { 
    var canvas = area.querySelector('canvas');; 
    viewer = new JSC3D.Viewer(canvas); 
    area.viewer = viewer; 
  } 
   
  viewer.replaceSceneFromUrl('models/' + models[models.selectedIndex].innerHTML); 
  viewer.update(); 
}
<div class=”Area”> 
  <div class="statistics"></div> 
  <div style="text-align:center;"> 
    <div class="loading" style="position:absolute;top: 45%; margin-left: 40%; "></div> 
  </div> 
  <canvas class="cv" width="1100" height="550"></canvas> 
  <div style="float:left; display:none; "> 
    <select class="model_list"> 
      <option>dragon.stl</option> 
    </select> 
    <button class="load" onclick="loadModel(this);">Load</button> 
  </div> 
  <div class="position"> 
    <select class="render_mode_list " id="change " onclick="setRenderMode(); "> 
      <option>сглаживание</option> 
      <option>каркас</option> 
      <option>плоская</option> 
      <option>вершины</option> 
      <option>освещение OFF</option> 
    </select> 
  </div> 
</div>

пришлось столкнуться с такой ошибкой:

var canvas = document.getElementsByClassName('cv');
this.canvas.addEventListener is not a function

Вот так:

document.querySelectorAll(".cv").forEach(el =>
  el.addEventListener('click', function() { loadModel(el); }, false)
);
READ ALSO
Регулярное исключение

Регулярное исключение

Дано: любая строка содержащая любые символы (asdfaslcvbieubcasku)

122
Как сверстать такой график?

Как сверстать такой график?

подскажите пожалуйста каким образом можно сделать такой круг? Требуется сделать такой графикПроблема в том что надо удобно менять значения?...

121
on(&ldquo;mouseover&#39;) и on(&rdquo;mouseout&#39;) jquery

on(“mouseover') и on(”mouseout') jquery

Как сделать так, чтоб при наведении на некоторый текст, он изменялся, а при уходе курсора с него он становился таким, каким был до наведения...

91