Three.js блокирует элемент <select>, а также щелчок левой кнопкой мыши - PullRequest
0 голосов
/ 07 мая 2019

Вы можете переключаться между визуализацией данных в веб-приложении.Сначала загружается карта в этом случае - это фото и изображение, когда вы впервые заходите на страницу.Как пользователь, вы можете выбирать между картой объекта, тем не менее, изображением и визуализацией данных three.js.Но когда я запускаю код three.js, как-то <select> с элементами <option> больше не отвечает.но <input class="form-check-input" type="checkbox" value="comp_exercise" id=""> все еще работает и в состоянии выбора.это произошло после того, как я использовал orbit control из библиотеки three.js.

До сих пор я пытался удалить все event.preventDefault();, но это не имело никакого значения.также я посмотрел в консоли, если холст перекрывал элемент select, чем он не был.консоль не возвращает никаких ошибок, и изменение css или позиции на веб-странице элемента select также не имеет значения.

ожидается, что <select> по-прежнему работает после запуска кодов three.js, так что вы можете изменить метрику, но она больше не активна и щелчок левой кнопкой мыши не работает

HTML-код, который больше не работает после запуска кодов three.js:

<div class="form-group">
<label for="exampleFormControlSelect1">Main metric</label>
<select class="form-control" id="exampleFormControlSelect1">
    <optgroup label = "Environmental factors">
        <option value="air">Air pollution</option>
        <option value="noise">Noise pollution</option>
    </optgroup>
</select>
</div>

как активируется код three.js

 <div class="float-left"><button class="btn btn-success btn-sm button_toggle_dataviz" onclick="toggle_toDataviz()">Dataviz</button></div>

 var displayMap = false;
 var display3dData = false;
 var displayStory = false;

function toggle_toDataviz() {
  document.getElementById("dataviz_charts").style.display = "block";
  document.getElementById("dataviz_map").style.display = "none";
  document.getElementById("form-container-share-story").style.display = 
"none";
  displayMap = false;
  display3dData = true;
  displayStory = false;
  start3DdataViz();
}

Я импортирую следующие ссылки:

Tweenmax.min.js

orbitcontrol.js

three.js

полный код three.js:

 var booleanCentrum = false;
 var booleanZuid = false;
 var booleanWest = false;
 var booleanOost = false;
 var booleanNoord = false;
 var booleanNieuwWest = false;
 var booleanZuidOost = false;
 var booleanWestpoort = false;

 function start3DdataViz() {
if(display3dData) {
    document.getElementById('data_viz_cubes_update').innerHTML = '';
    document.getElementById('data_viz_cubes_update').setAttribute("style", "height:500px");
    let a = window.getComputedStyle(document.getElementById("data_viz_cubes_update"), null);
    var canvasHeight = parseInt(a.getPropertyValue("height").substring(0, a.getPropertyValue("height").length - 2));
    var canvasWidth = parseInt(a.getPropertyValue("width").substring(0, a.getPropertyValue("width").length - 2));

    var scene = new THREE.Scene();
    var camera = new THREE.PerspectiveCamera(75, canvasWidth / canvasHeight, 0.1, 1000);
    var controls = new THREE.OrbitControls(camera);
    camera.position.z = 20;
    controls.update();

    $("#data_viz_cubes_update").hover(
        function () {
            noscroll()
        }
    );

    var noscroll_var;

    function noscroll() {
        if (noscroll_var) {
            document.getElementsByTagName("html")[0].style.overflowY = "";
            document.body.style.paddingRight = "0";
            controls.enableZoom = false;
            controls.enablePan = false;
            controls.enableRotate = false;
            noscroll_var = false
        } else {
            document.getElementsByTagName("html")[0].setAttribute('style', 'overflow-y: hidden !important');
            document.body.style.paddingRight = "17px";
            controls.enableZoom = true;
            controls.enablePan = true;
            controls.enableRotate = true;
            noscroll_var = true
        }
    }

    var renderer = new THREE.WebGLRenderer();
    renderer.setClearColor("#e3e0e5");
    renderer.setSize(canvasWidth, canvasHeight);
    var canvas = document.getElementById('data_viz_cubes_update');
    renderer.setSize($(canvas).width(), $(canvas).height());
    canvas.appendChild(renderer.domElement);

    var raycaster = new THREE.Raycaster();
    var mouse = new THREE.Vector2();

    var geometry = new THREE.BoxGeometry(1, 1, 1);
    var material = new THREE.MeshLambertMaterial({color: "red", transparent: true});

    for (let i = 0; i < 8; i++) {
        let b = "";
        0 === i ? b = "Centrum" : 1 === i ? b = "Zuid" : 2 === i ? b = "West" : 3 === i ? b = "Oost" : 4 === i ? b = "Noord" : 5 === i ? b = "NieuwWest" : 6 === i ? b = "ZuidOost" : 7 === i && (b = "Westpoort");
        var mesh = new THREE.Mesh(geometry, material);
        mesh.material.opacity = 1;
        mesh.name = b;
        mesh.position.x = (Math.random() - 0.5) * 20;
        mesh.position.y = (Math.random() - 0.5) * 20;
        mesh.position.z = (Math.random() - 0.5) * 20;
        scene.add(mesh);
    }

    var light = new THREE.PointLight('white', 1, 1000);
    light.position.set(0, 0, 0);
    scene.add(light);

    var render = function () {
        requestAnimationFrame(render);
        controls.update();
        renderer.render(scene, camera);
    };

    render();

    function onMouseMove(event) {
        event.preventDefault();

        var rect = event.target.getBoundingClientRect();
        mouse.x = ((event.clientX - rect.left) / canvasWidth) * 2 - 1;
        mouse.y = -((event.clientY - rect.top) / canvasHeight) * 2 + 1;
        raycaster.setFromCamera(mouse, camera);

        var intersects = raycaster.intersectObjects(scene.children, true);
        for (var i = 0; i < intersects.length; i++) {
            booleanCentrum = false;
            booleanZuid = false;
            booleanWest = false;
            booleanOost = false;
            booleanNoord = false;
            booleanNieuwWest = false;
            booleanZuidOost = false;
            booleanWestpoort = false;
            switch(intersects[i].object.name){
                case "Centrum":
                    booleanCentrum = true;
                    break;
                case "Zuid":
                    booleanZuid = true;
                    break;
                case "West":
                    booleanWest = true;
                    break;
                case "Oost":
                    booleanOost = true;
                    break;
                case "Noord":
                    booleanNoord = true;
                    break;
                case "NieuwWest":
                    booleanNieuwWest = true;
                    break;
                case "ZuidOost":
                    booleanZuidOost = true;
                    break;
                case "Westpoort":
                    booleanWestpoort = true;
                    break;
                default:
                    console.log('not on object');
            }
            this.tl = new TimelineMax();
            this.tl.to(intersects[i].object.scale, 1, {x: 2, ease: Expo.easeOut});
            this.tl.to(intersects[i].object.scale, .5, {x: 1, ease: Expo.easeOut});
        }
    }
    window.addEventListener('mousemove', onMouseMove);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...