【问题标题】:How to use innerHTML with JavaScript if/else statement and Bootstrap 4 dropdown menu如何在 JavaScript if/else 语句和 Bootstrap 4 下拉菜单中使用 innerHTML
【发布时间】:2018-06-26 08:17:34
【问题描述】:

我的应用程序几乎完成了,当用户没有从我的两个下拉菜单中选择一个项目时,我只是无法合并 innerHTML 语句。我目前知道如何使用警报来执行此操作,但我希望在用户不进行选择时消息显示在页面本身上。我是 JS 的初学者-我知道这会将 innerHTML 与 if/else 语句结合起来,但是我在找到完成此操作的正确方法时遇到了一些麻烦。

目标:如果用户在单击提交按钮时未从下拉菜单中选择眼睛颜色,innerHTML 消息应显示“请选择眼睛颜色”。

否则,如果, 如果用户在单击提交按钮时未从下拉菜单中选择肤色,innerHTML 消息应显示“请选择肤色”。

否则,如果用户在单击提交按钮时未从下拉菜单中选择眼睛颜色和肤色,innerHTMl 消息应显示“请选择眼睛颜色和肤色”。

这是我的 HTML 和 JS code:

        <h3 class="display-4" style="font-size: 1.5rem;">What is your eye color</h3>
    <div class="dropdown">
        <div class="input-group justify-content-center">
            <div class="input-group-btn">
                <button class="btn btn-info btn-md dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" style="background-color: #588c7e;">
                    Eye Color

                </button>

                <div class="dropdown-menu" onchange="selectMenu1" aria-labelledby="dropdownMenuButton" id="eyeColor">
                    <a class="dropdown-item" href="#" data="brown" ><img src="img/brown_eye.jpg" class="rounded-circle"> Brown</a>
                    <a class="dropdown-item" href="#" data="blue" ><img src="img/blue_eye.jpg" class="rounded-circle" > Blue</a>
                    <a class="dropdown-item" href="#" data="green" ><img src="img/green_eye.jpg" class="rounded-circle" > Green</a>
                    <a class="dropdown-item" href="#" data="hazel" ><img src="img/hazel_eye.jpg" class="rounded-circle" > Hazel</a>
                </div>

            </div>
        </div>
    </div>

    <!--Drop down Item 2-->

    <h3 class="display-4" style="font-size: 1.5rem;"> What is your skin tone</h3>
    <div id="menu2" class="dropdown">
        <div class="input-group justify-content-center">
            <div class="input-group-btn">
                <button class="btn btn-info btn-md dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" style="background-color: #588c7e;">
                    Skin Tone
                </button>

                <div class="dropdown-menu" onchange="selectMenu2"  aria-labelledby="dropdownMenuButton">
                    <a class="dropdown-item" href="#" data="fair"><img src="img/fair.jpg" class="rounded-circle" > Fair</a>
                    <a class="dropdown-item" href="#" data="light"><img src="img/light.jpg" class="rounded-circle" > Light</a>
                    <a class="dropdown-item" href="#" data="medium"><img src="img/medium.jpg" class="rounded-circle" > Medium</a>
                    <a class="dropdown-item" href="#" data="bronze"><img src="img/bronze_dark.jpg" class="rounded-circle" > Bronze</a>
                    <a class="dropdown-item" href="#" data="tan"><img src="img/tan.jpg" class="rounded-circle" > Tan</a>
                    <a class="dropdown-item" href="#" data="rich"><img src="img/dark.jpg" class="rounded-circle" > Rich</a>
                </div>

            </div>
        </div>
    </div>

    <br>

    <!--Result Button-->

    <button type="button" class="btn btn-info btn-lg active" title ="Submit" style="background-color: #3e4444;" onclick="validate()" id="demo"><i class="fas fa-arrow-circle-right fa-lg"></i></button>

<script>
function validate() {
    var eyeColor;
    var skinTone;

    if(!eyeColor){
        document.getElementById("eyeColor").innerHTML = "Please select an eye color";
    } else if (!skinTone){
        document.getElementById("skinTone").innerHTML = "Please select a skin tone";
    }

}
</script>

【问题讨论】:

  • 如果用户没有选择眼睛颜色或肤色怎么办?
  • 如果你能在心里找到使用原生 HTML 选择和 HTML5 表单验证的方法,那么所有的工作都会为你完成。

标签: javascript jquery html bootstrap-4


【解决方案1】:

在您的validate() 方法中,您创建了两个变量,称为eyeColorskinTone,而无需设置它们的值,您的两个 if 语句也验证变量是否具有它们没有的值,因此 innerHTML 永远不会被击中。

您还需要创建一个应该放置消息的元素,因为您当前要覆盖所有子元素。

例如,在提交按钮之前创建一个标签元素。

<label id="error"></label>

您应该创建两个全局变量并将它们设置为空字符串。

var eyeColor = '';
var skinTone = '';

您缺少第二个下拉菜单的 ID。将id="skinTone" 添加到div 元素。

删除您的两个onchange 函数,因为它们不适用于&lt;div&gt; 元素:selectMenu1()selectMenu2()。但是,请创建一个附加函数来设置 eyeColorskinTone 变量的值。对于下拉菜单中的每个&lt;a&gt; 元素,将href 设置为href="javascript:setMenuValue(this)"

function setMenuValue(obj)
{
    if (obj !== undefined)
    {
        if (obj.parentElement.id == 'eyeColor')
        {
            // Update the global variable eyeColor
            eyeColor = obj.getAttribute('data');
        }
        else if (obj.parentElement.id == 'skinTone')
        {
            // Update the global variable skinTone
            skinTone = obj.getAttribute('data');
        }
    }
}

修改您的validate() 方法:

function validate() {   
      // Show error if the eyeColor or skinTone variables are still an empty string
      if(eyeColor == ''){
        document.getElementById("error").innerHTML = "Please select an eye color";
    } else if (skinTone == ''){
        document.getElementById("error").innerHTML = "Please select a skin tone";
    }

}

【讨论】:

  • 您好 MPaul,我更新了我的代码,但它无法正常工作。我想知道我是否将 eyeColor 和 skinTone id 放在不正确的位置 - 它们应该在按钮类中吗?我害怕这样做,因为按钮类已经有一个 id 名称。
  • 您好 MPaul - 我明白了。我正在使用引导下拉菜单,这就是为什么有锚标签。通过创建应用程序和根据我的研究,我现在相信我应该使用
  • 我已经修改了我的答案以考虑您的锚标签。在一个完美的语义世界中,&lt;select&gt; 标签是首选,但为了不改变你的代码,你可以把它们作为锚标签
  • 谢谢 Paul,很抱歉,我需要这两行的帮助:您应该创建 2 个全局变量并将它们设置为空字符串。您的 2 个函数 selectMenu1() 和 selectMenu2() 应该使用所选锚元素的基础数据属性分别更新全局变量 eyeColor 和 skinTone。我知道全局意味着什么,但我应该为它们命名吗?变种眼睛=“”;变种皮肤 = "";
  • @Alexandra 我已经修改了我的答案,以反映您一直在使用 div 元素作为下拉菜单的容器这一事实。再一次,由于您没有使用&lt;select&gt; 元素,您将失去依赖onchangeevent 的能力,因此为了解决这个问题,我简单地添加了一个additioanl 函数,它将根据任何一个设置您的javascript变量&lt;a&gt; 标签被点击。
【解决方案2】:

您在这里所做的是覆盖您的 div eyeColor 的 innerHTML,因此它将删除您的所有链接。要显示错误消息,只需在你的 div 下放一个 p 标签,里面什么都没有,然后覆盖他的内容。

【讨论】:

  • 嗨 Medrupaloscil,您能进一步解释一下吗 - “只需放一个 ....”您没有列出我应该在我的 div 下放什么。
  • 嗨,对不起,我刚刚编辑了它!我想说一个“p”标签。它会在您的 div 下方显示错误消息,而不是替换其内容。
【解决方案3】:

经过大量挖掘,我找到了一种无需更改任何代码的方法。事实上,我只需要添加更多代码。我实际上离我的原始代码并不太远:

HTML:

<div class ="dropdown-menu" id="eyeColor">

我将此添加到我的每个下拉菜单中

<div class="error" id="error"></div>

然后是我的 JS-

我摆脱了这个:

function validate() {
    var eyeColor;
    var skinTone;

并添加了这个:

if (!eyeColor){
  document.getElementById("error").innerHTML = "<span class='error'>Please choose an eye color</span>";
}
else if (!skinTone){
  document.getElementById("error").innerHTML = "<span class='error'>Please choose a skin tone</span>";
}

}

我决定稍微设计一下。我添加了一个带有“错误”类的跨度,并在我的 CSS 中这样做了:

.error {
  color: #000000;
  font-size: 20px;
  padding-top: 6px;
  padding-bottom: 5px;
}

像魅力一样工作!就像我希望的那样!

【讨论】:

  • 咦,你在两个下拉菜单中添加了两个相同id的标签元素?这不会同时在两个下拉菜单中放置相同的错误消息吗?如果您的var eyeColorvar skinTone 不存在,那么错误信息不会一直出现吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 2016-06-21
  • 2015-05-16
  • 1970-01-01
相关资源
最近更新 更多