【问题标题】:Javascript onclick, onmouseout conflict, loopJavascript onclick、onmouseout 冲突、循环
【发布时间】:2016-07-20 09:41:45
【问题描述】:

我是新来的,这是我在 stackflow 中的第一次“询问” :) 这是我的代码。 主要思想是:

  1. 图标默认为白色
  2. mouseover 和 mouseout,它们一起工作就像 CSS 中的“悬停”。我不能将悬停与 css 一起使用,因为图像是 .png,所以必须使用 js。
  3. 图标 onclick 变为灰色,看起来像是被激活了。

虽然我以一种不聪明的方式让它变得非常复杂,但代码仍然有效。有没有办法让它更简单?使用循环??但是怎么做?提前致谢!

var clickedWalk = false;
var clickedBicycle = false;
var clickedCar = false;
var clickedBus = false;
var clickedParkAndRide = false;

function mouseOverWalk() {
    document.getElementById("walk").src="images/Walk-gray.png";
}

function mouseOverBicycle() {
    document.getElementById("bicycle").src="images/Biking-gray.png";
}

function mouseOverCar() {
    document.getElementById("car").src="images/Car-gray.png";
}

function mouseOverBus() {
    document.getElementById("bus").src="images/Bus-gray.png";
}

function mouseOverParkAndRide() {
    document.getElementById("park-and-ride").src="images/PPlusBus-gray.png";
}



function mouseOutWalk() {
    if (clickedWalk == false) {
        document.getElementById("walk").src = "images/Walk.png"; //mouseout works
    }
    clickedWalk = false;      
}

function mouseOutBicycle() {
    if (clickedBicycle == false) { //no click
        document.getElementById("bicycle").src = "images/Biking.png"; //mouseout works
    }
    clickedBicycle = false;
}

function mouseOutCar() {
    if (clickedCar == false) { //no click
        document.getElementById("car").src = "images/Car.png"; //mouseout works
    }
    clickedCar = false;
}

function mouseOutBus() {
    if (clickedBus == false) { //no click
        document.getElementById("bus").src = "images/Bus.png"; //mouseout works
    }
    clickedBus = false;
}

function mouseOutParkAndRide() {
    if (clickedParkAndRide == false) { //no click
        document.getElementById("park-and-ride").src = "images/PPlusBus.png"; //mouseout works
    }
    clickedParkAndRide = false;
}

function clickWalk() {
    document.getElementById("walk").src="images/Walk-gray.png";  //gray
    document.getElementById("bicycle").src="images/Biking.png"; //white
    document.getElementById("car").src="images/Car.png"; //white
    document.getElementById("bus").src="images/Bus.png"; //white
    document.getElementById("park-and-ride").src="images/PPlusBus.png"; //white
    
    clickedWalk = true;
}

function clickBicycle() {
    
    document.getElementById("walk").src="images/Walk.png"; //white
    document.getElementById("bicycle").src="images/Biking-gray.png"; //gray
    document.getElementById("car").src="images/Car.png"; //white
    document.getElementById("bus").src="images/Bus.png"; //white
    document.getElementById("park-and-ride").src="images/PPlusBus.png"; //white
    
    clickedBicycle = true;
}

function clickCar() {
    document.getElementById("walk").src="images/Walk.png"; //white
    document.getElementById("bicycle").src="images/Biking.png"; //white
    document.getElementById("car").src="images/Car-gray.png"; //gray
    document.getElementById("bus").src="images/Bus.png"; //white
    document.getElementById("park-and-ride").src="images/PPlusBus.png"; //white

    clickedCar = true;
}

function clickBus() {
    document.getElementById("walk").src="images/Walk.png"; //white
    document.getElementById("bicycle").src="images/Biking.png"; //white
    document.getElementById("car").src="images/Car.png"; //white
    document.getElementById("bus").src="images/Bus-gray.png"; //gray
    document.getElementById("park-and-ride").src="images/PPlusBus.png"; //white

    clickedBus = true;
}

function clickParkAndRide() {
    document.getElementById("walk").src="images/Walk.png"; //white
    document.getElementById("bicycle").src="images/Biking.png"; //white
    document.getElementById("car").src="images/Car.png"; //white
    document.getElementById("bus").src="images/Bus.png"; //white
    document.getElementById("park-and-ride").src="images/PPlusBus-gray.png"; //gray

    clickedParkAndRide = true;
}
<div id="modeListBoxSelect">
        <ul>
            <li onclick="travelMode.byWalk()"><img id="walk" onmouseover="mouseOverWalk()" onmouseout="mouseOutWalk()" onclick="clickWalk()" src="images/Walk.png" alt="walk"</li>
            <li onclick="travelMode.byBike()"><img id="bicycle" onmouseover="mouseOverBicycle()" onmouseout="mouseOutBicycle()" onclick="clickBicycle()" src="images/Biking.png" alt="bicycle"</li>
            <li onclick="travelMode.byCar()"><img id="car" onmouseover="mouseOverCar()" onmouseout="mouseOutCar()" onclick="clickCar()" src="images/Car.png" alt="car"</li>
            <li onclick="travelMode.byBus()"><img id="bus" onmouseover="mouseOverBus()" onmouseout="mouseOutBus()" onclick="clickBus()" src="images/Bus.png" alt="bus"</li>
            <li onclick="travelMode.byParkAndRide()"><img id="park-and-ride" onmouseover="mouseOverParkAndRide()" onmouseout="mouseOutParkAndRide()" onclick="clickParkAndRide()" src="images/PPlusBus.png" alt="park-and-ride"</li>
        </ul>
    </div>

【问题讨论】:

    标签: javascript css loops onclick hover


    【解决方案1】:

    实际上,您可以在 css 中使用“悬停”。简单地说,将“li”设置为具有适当高度和宽度的块元素,并向其添加“id”属性,就像使用“img”一样。 然后删除'img'元素并使用css设置'li'的样式。

    <div id="modeListBoxSelect">
        <ul>
            <li onclick="travelMode.byWalk()" id="walk"></li>
        </ul>
    </div>
    

    和css:

    #walk {
    display: block;
    width: XXXpx;
    height: YYYpx; // size of the image
    background-image: url('your-image.png');
    }
    #walk:hover {
    background-image: url('your-image-after-hover.png');
    }
    

    【讨论】:

      【解决方案2】:

      一种简化代码的可能方法可以这样进行:

        var imagesSrc = {
          'walk': {
            'white': 'images/Walk.png',
            'gray': 'images/Walk-gray.png'
          },
          'bicycle': {
            'white': 'images/Biking.png',
            'gray': 'images/Biking-gray.png'
          },
          'car': {
            'white': 'images/Car.png',
            'gray': 'images/Car-gray.png'
          },
          'bus': {
            'white': 'images/Car.png',
            'gray': 'images/Car-gray.png'
          },
          'park-and-ride': {
            'white': 'images/PPlusBus.png',
            'gray': 'images/PPlusBus-gray.png'
          }
        };
      
        //Save the clicked image into this variable
        var clickedImage;
      
        function mouseOver(img) {
          img.src = imagesSrc[img.id].gray;
        }
      
        function mouseOut(img) {
          if(img !== clickedImage) {
            img.src = imagesSrc[img.id].white;
          }
        }
      
        function click(img) {
          //previous clicked image back to white
          clickedImage.src = imagesSrc[clickedImage.id].white;
          //current clicked image to gray
          img.src = imagesSrc[img.id].gray;
          //save the current clicked image
          clickedImage = img;
        }
      

      那么你的html应该是这样的:

       <div id="modeListBoxSelect">
          <ul>
          <li onclick="travelMode.byWalk()"><img id="walk" onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" onclick="click(this)" src="images/Walk.png" alt="walk"</li>
          <li onclick="travelMode.byBike()"><img id="bicycle" onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" onclick="click(this)" src="images/Biking.png" alt="bicycle"</li>
          <li onclick="travelMode.byCar()"><img id="car" onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" onclick="click(this)" src="images/Car.png" alt="car"</li>
          <li onclick="travelMode.byBus()"><img id="bus" onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" onclick="click(this)" src="images/Bus.png" alt="bus"</li>
          <li onclick="travelMode.byParkAndRide()"><img id="park-and-ride" onmouseover="mouseOver(this)" onmouseout="mouseOut(this)" onclick="click(this)" src="images/PPlusBus.png" alt="park-and-ride"</li>
          </ul>
        </div>
      

      我没有尝试,也许我犯了一些错误,但我想你明白了

      【讨论】:

        猜你喜欢
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多