【问题标题】:Browser compatibility issues Javascript浏览器兼容性问题 Javascript
【发布时间】:2014-09-12 23:17:12
【问题描述】:

我得到了以下 Javascript 代码,它在 Mozilla Firefox 中可以正常工作,但在 Google Chrome 中却不能。知道为什么会这样做吗? 即使值是 45,Chrome 中的总BMI(检查所有最后一个按钮会给你的值 45 大于 26 所以结果应该将 hRisk div 设置为display:-inline 而不是display:none,作为函数@987654325 @ 确实。)它仍然认为它是 0,因为它显示低风险消息。在 Firefox 中,它总是显示正确的答案。

Javascript 代码:

function CalculateValue()  {
var age = +getAgeValue('age'),
    bmi = +getBmiValue('bmi'),
    fami = +getFamValue('fam'),
    diet = +getDietValue('diet'),
    totalBMI = age + bmi + fami + diet;
    totalBMI = parseFloat(totalBMI); 
    alert(totalBMI);
if (totalBMI > 26) {
    function changeCSS() {           
        document.getElementById("btn").onclick = function() {
        var hMessage = document.getElementById("hRisk");
        hMessage.style.display = 'inline';
        /*var newSpan = document.createElement("span");
        var newSpanText = document.createTextNode("Your main factors risk are "  );
        newSpan.appendChild(newSpanText);
        var pElem = document.getElementById("space");
        pElem.appendChild(newSpan); */
        }
    } 
    changeCSS();

} else if (totalBMI > 16 ) {
    function changeCSS() {           
        document.getElementById("btn").onclick = function() {
        var mMessage = document.getElementById("mRisk");
        mMessage.style.display = 'inline';
        }
    } 
    changeCSS();
} else {
    function changeCSS() {           
        document.getElementById("btn").onclick = function() {
        var lMessage = document.getElementById("lRisk");
        lMessage.style.display = 'inline';
        }
    } 
    changeCSS();
}
}



function getAgeValue()
{
    for (var i = 0; i < document.getElementsByName('age').length; i++)
{
    if (document.getElementsByName('age')[i].checked)
    {
        return document.getElementsByName('age')[i].value;
    }
}
}

function getBmiValue()
{
    for (var i = 0; i < document.getElementsByName('bmi').length; i++)
    {
        if (document.getElementsByName('bmi')[i].checked)
        {
            return document.getElementsByName('bmi')[i].value;
        }
    }
}    


function getFamValue()
{
    for (var i = 0; i < document.getElementsByName('fam').length; i++)
    {
        if (document.getElementsByName('fam')[i].checked)
        {
            return document.getElementsByName('fam')[i].value;
        }
    }   
}

function getDietValue()
{
    for (var i = 0; i < document.getElementsByName('diet').length; i++)
    {
        if (document.getElementsByName('diet')[i].checked)
        {
            return document.getElementsByName('diet')[i].value;
        }
    }     
}

HTML 代码:

<script src="jsbmi4.js"></script>
<title>Java</title>
<body>
    <form method="post" action="process.php" id="radioForm">
        <fieldset>
            <div>
                <label for="age" class="lClass"> <span class="span1"> How old are you?     </span>
                <input type="radio" id="age1" name="age" value="0">0-25
                <input type="radio" id="age1" name="age" value="5">26-40
                <input type="radio" id="age1" name="age" value="8">41-60
                <input type="radio" id="age1" name="age" value="10">60+
                </label> 
            </div>
        <div>   
            <label for="bmi"> <span class="span1"> What is your BMI? </span>
                <input type="radio" id="bmi1" name="bmi" value="0">0-25
                <input type="radio" id="bmi1" name="bmi" value="0">26-30
                <input type="radio" id="bmi1" name="bmi" value="9">31-35
                <input type="radio" id="bmi1" name="bmi" value="10">35+
            </label>
        </div>
        <div>   
            <label for="fam"> <span class="span1"> Does anybody in your family have diabetes? </span>
                <input type="radio" id="fam1" name="fam" value="0">No
                <input type="radio" id="fam1" name="fam" value="7">Grandparent
                <input type="radio" id="fam1" name="fam" value="15">Sibling
                <input type="radio" id="fam1" name="fam" value="15">Parent
            </label>
        </div>
        <div>   
            <label for="diet"> <span class="span1"> How would you describe your diet? </span>
                <input type="radio" id="diet1" name="diet" value="0">Low sugar
                <input type="radio" id="diet1" name="diet" value="0">Normal sugar 
                <input type="radio" id="diet1" name="diet" value="7">Quite high sugar
                <input type="radio" id="diet1" name="diet" value="10">High sugar
            </label>
        </div>  
        <div class="button">
            <input id="btn" type="button" value="Calculate" onclick="CalculateValue()"> 
        <!--    <input id="submit" type"submit" value="submit"> -->
        </div>
    </fieldset>         
</form> 
<div id="lRisk">
    <h2> Your Result </h2>
    <p> Your results show that you currently have a low risk of developing diabetes.     However, it is important that you maintain a healty lifestyle in terms of diet and exercise. </p>
</div>
<div id="mRisk">
    <h2> Your Result </h2>
    <p> Your results show that you currently have a medium risk of developing diabetes. For more information on your risk factors, and what to do about them, please visit our diabetes advice website at <a href="http://www.zha.org.zd">http://www.zha.org.zd.</a> </p>
</div>       
<div id="hRisk">
    <h2> Your Result </h2>
    <p>Your results show that you currently have a HIGH risk of developing diabetes.<span id="space"></span> We advice that you contact the Health Authority to discuss your risk factors as soon as you can. Please fill in our <a href="index2.html"> contact form</a> and a member of the Health Authority Diabetes Team will be in contact with you. </p>
</div>  
</body> 

【问题讨论】:

  • 我还检查了 [quirksmode.org/dom/core/] DOM CORE,我使用的元素看起来没有任何问题。
  • 你试过在上面运行JSLint吗?
  • 已修复。就像 fuximus goe 所说的“删除 changeCSS 函数并立即执行它们的代码即可解决问题”,解决了浏览器兼容性问题。

标签: javascript cross-browser compatibility


【解决方案1】:

我必须做的唯一修改是删除函数 changeCSS() 并在 if 语句中添加内容。

感谢 Fuximus Foe。

JSCode 在这里。

 function getAgeValue()
{
for (var i = 0; i < document.getElementsByName('age').length; i++)
{
    if (document.getElementsByName('age')[i].checked)
    {
        return document.getElementsByName('age')[i].value;
    }
}
}

function getBmiValue()
{
for (var i = 0; i < document.getElementsByName('bmi').length; i++)
{
    if (document.getElementsByName('bmi')[i].checked)
    {
        return document.getElementsByName('bmi')[i].value;
    }
}
}    


function getFamValue()
{
for (var i = 0; i < document.getElementsByName('fam').length; i++)
{
    if (document.getElementsByName('fam')[i].checked)
    {
        return document.getElementsByName('fam')[i].value;
    }
}   
}

function getDietValue()
{
for (var i = 0; i < document.getElementsByName('diet').length; i++)
{
    if (document.getElementsByName('diet')[i].checked)
    {
        return document.getElementsByName('diet')[i].value;
    }
}      
}

function CalculateValue()  {
var age = +getAgeValue('age'),
    bmi = +getBmiValue('bmi'),
    fami = +getFamValue('fam'),
    diet = +getDietValue('diet'),
    totalBMI = age + bmi + fami + diet;
    totalBMI = parseFloat(totalBMI); 
    alert(totalBMI);
if (totalBMI > 26) {           
        document.getElementById("btn").onclick = function() {
        var hMessage = document.getElementById("hRisk");
        hMessage.style.display = 'inline';
        /*var newSpan = document.createElement("span");
        var newSpanText = document.createTextNode("Your main factors risk are "  );
        newSpan.appendChild(newSpanText);
        var pElem = document.getElementById("space");
        pElem.appendChild(newSpan); */
        }         
} else if (totalBMI > 16 ) {
        document.getElementById("btn").onclick = function() {
        var mMessage = document.getElementById("mRisk");
        mMessage.style.display = 'inline';
        } 
} else {
        document.getElementById("btn").onclick = function() {
        var lMessage = document.getElementById("lRisk");
        lMessage.style.display = 'inline';
        } 
    }
}

【讨论】:

    【解决方案2】:

    您还没有关闭任何input 标签考虑使用&lt;input ... /&gt; 自关闭标签。您错误地关闭了 &lt;/label&gt; 标签。

    您不应该只为了在下一行使用而重新声明一个函数。 不确定,为什么在你已经得到答案的情况下绑定到onclick 事件,这使得它只有在用户点击calculate 按钮两次时才起作用。

    在摆弄这个之后,删除 changeCSS 函数并直接执行它们的代码就可以解决问题。这是因为在 Chrome 中,无论光标是否到达,都会抓取函数的第一个定义,因此在所有三种情况下都只执行第一个 changeCSS 函数; firefox 读取正确的定义。

    JAVASCRIPT:

        function CalculateValue() {
        var totalBMI = 0+parseInt(getAgeValue('age'))
                +parseInt(getBmiValue('bmi'))
                +parseInt(getFamValue('fam'))
                +parseInt(getDietValue('diet'));
        alert(totalBMI);
        if (totalBMI > 26) {
            //function changeCSS(){
                //document.getElementById("btn").onclick = function () {
                    var hMessage = document.getElementById("hRisk");
                    hMessage.style.display = 'block';
                    /*var newSpan = document.createElement("span");
                    var newSpanText = document.createTextNode("Your main factors risk are "  );
                    newSpan.appendChild(newSpanText);
                    var pElem = document.getElementById("space");
                    pElem.appendChild(newSpan); */
                //}
            //}
            //changeCSS();
        } else if (totalBMI > 16) {
            //function changeCSS(){
                //document.getElementById("btn").onclick = function () {
                    var mMessage = document.getElementById("mRisk");
                    mMessage.style.display = 'block';
                //}
            //}
            //changeCSS();
        } else {
            //function changeCSS(){
                //document.getElementById("btn").onclick = function () {
                    var lMessage = document.getElementById("lRisk");
                    lMessage.style.display = 'block';
                //}
            //}
            //changeCSS();
        }
    }
    
    
    
    function getAgeValue() {
        for (var i = 0; i < document.getElementsByName('age').length; i++) {
            if (document.getElementsByName('age')[i].checked) {
                return document.getElementsByName('age')[i].value;
            }
        }
        return 0;
    }
    
    function getBmiValue() {
        for (var i = 0; i < document.getElementsByName('bmi').length; i++) {
            if (document.getElementsByName('bmi')[i].checked) {
                return document.getElementsByName('bmi')[i].value;
            }
        }
        return 0;
    }
    
    
    function getFamValue() {
        for (var i = 0; i < document.getElementsByName('fam').length; i++) {
            if (document.getElementsByName('fam')[i].checked) {
                return document.getElementsByName('fam')[i].value;
            }
        }
        return 0;
    }
    
    function getDietValue() {
        for (var i = 0; i < document.getElementsByName('diet').length; i++) {
            if (document.getElementsByName('diet')[i].checked) {
                return document.getElementsByName('diet')[i].value;
            }
        }
        return 0;
    }
    

    HTML:

    <body>
        <form method="post" action="process.php" id="radioForm">
            <fieldset>
                <div>
                    <label for="age" class="lClass"><span class="span1"> How old are you?</span></label> 
                    <input type="radio" id="age1" name="age" value="0"/>0-25
                    <input type="radio" id="age1" name="age" value="5"/>26-40
                    <input type="radio" id="age1" name="age" value="8"/>41-60
                    <input type="radio" id="age1" name="age" value="10"/>60+
                </div>
            <div>   
                <label for="bmi"> <span class="span1"> What is your BMI? </span></label>
                    <input type="radio" id="bmi1" name="bmi" value="0"/>0-25
                    <input type="radio" id="bmi1" name="bmi" value="0"/>26-30
                    <input type="radio" id="bmi1" name="bmi" value="9"/>31-35
                    <input type="radio" id="bmi1" name="bmi" value="10"/>35+
            </div>
            <div>   
                <label for="fam"> <span class="span1"> Does anybody in your family have diabetes?</span></label>
                    <input type="radio" id="fam1" name="fam" value="0"/>No
                    <input type="radio" id="fam1" name="fam" value="7"/>Grandparent
                    <input type="radio" id="fam1" name="fam" value="15"/>Sibling
                    <input type="radio" id="fam1" name="fam" value="15"/>Parent
            </div>
            <div>   
                <label for="diet"> <span class="span1"> How would you describe your diet? </span></label>
                <input type="radio" id="diet1" name="diet" value="0"/>Low sugar
                <input type="radio" id="diet1" name="diet" value="0"/>Normal sugar 
                <input type="radio" id="diet1" name="diet" value="7"/>Quite high sugar
                <input type="radio" id="diet1" name="diet" value="10"/>High sugar
            </div>  
            <div class="button">
                <input id="btn" type="button" value="Calculate" onclick="CalculateValue()"/> 
            <!--    <input id="submit" type"submit" value="submit"> -->
            </div>
        </fieldset>         
    </form> 
    <div id="lRisk" style="display:none;">
        <h2> Your Result </h2>
        <p> Your results show that you currently have a low risk of developing diabetes.     However, it is important that you maintain a healty lifestyle in terms of diet and exercise. </p>
    </div>
    <div id="mRisk" style="display:none;">
        <h2> Your Result </h2>
        <p> Your results show that you currently have a medium risk of developing diabetes. For more information on your risk factors, and what to do about them, please visit our diabetes advice website at <a href="http://www.zha.org.zd">http://www.zha.org.zd.</a> </p>
    </div>       
    <div id="hRisk" style="display:none;">
        <h2> Your Result </h2>
        <p>Your results show that you currently have a HIGH risk of developing diabetes.<span id="space"></span> We advice that you contact the Health Authority to discuss your risk factors as soon as you can. Please fill in our <a href="index2.html"> contact form</a> and a member of the Health Authority Diabetes Team will be in contact with you. </p>
    </div>  
    </body>
    

    和 JSFiddle:http://jsfiddle.net/kWyx8/

    【讨论】:

    • &lt;input&gt; 的结束标签是禁止的。对于沉迷于 XML 的人来说,能够在末尾添加 / 是一种无意义的语法糖。它不能解决任何不涉及黄屏死机或 XML 解析器大喊格式错误的问题。
    • 一元加号运算符将值转换为数字。
    • 是的,我想@Quentin,我只是习惯了这些语法,我的错。另一方面,+ 号看起来和感觉很脏。即使它有效。
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 2012-06-07
    • 1970-01-01
    • 2012-10-19
    • 2021-08-04
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多