Javascript innerHTML не пишет в документ

Кажется, я не могу получить ответ для отображения под калькулятором с помощью innerHTML. Раньше я работал с окнами предупреждений, но в идеале я хотел бы писать непосредственно в документ, чтобы я мог включать ссылки и форматирование.

Я успешно использовал описанный ниже метод с немного менее сложным скриптом, который не включал меню выбора (см. рабочий код внизу). Помимо другого идентификатора области отображения, это, по-видимому, единственное отличие.

Я прогнал это через firebug и оказалось, что все расчеты выполняются, а скрипт падает только тогда, когда приходит время отображать результаты.

Я все еще довольно зеленый в javascript и учусь на ходу, поэтому любая подробная информация, которую вы можете предоставить, была бы очень полезной.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>

 <script type="text/javascript">

    <!-- Begin CE MP Savings Calc script
    function  doMath3() {
        var one = parseInt(document.theForm3.elements[0].value);
        var two = parseInt(document.theForm3.elements[1].value);
        var three = one * two;
        var z4yearlyCash = three * 4.25 * 12;
        var z3yearlyCash = three * 3.75 * 12;
        var z2yearlyCash = three * 3 * 12;
        var z1yearlyCash = three * 2.5 * 12;
        var baseyearlyCash = three * 1.5 * 12;
        var selection = document.getElementsByName("zone")[0].value;
        var answerCEMP = document.getElementById("answerCEMP");


    if (document.theForm3.elements[0].value == ""){
    alert("Please enter the number of days a month you commute on Commuter Express.")   
    }

    if (document.theForm3.elements[1].value == ""){
    alert("Please enter the number of times you board a Commuter Express daily.")   
    }   
        if(one > 31){
            alert("Come now, no month has " + one + " days! Please try again.");
        }

        else if(selection == "z4"){
            var prodZ4 = z4yearlyCash - 1680;
        if(prodZ4 > 0){
           answerCemp.innerHTML="<div class='answerbox'><p>If you pay cash, your yearly expense is $" + z4yearlyCash + ".<br>Commuter Express Zone 4 Monthly Passes cost $1680 per year, <strong>a yearly savings of $"  +  prodZ4  +  "<\/strong><br><strong><a href='http://store.ladottransit.com/Merchant2/merchant.mvc?Screen=CTGY&amp;Store_Code=LTSO&amp;Category_Code=MP4'>Buy a Commuter Express Monthly Pass now.<\/a><\/strong><\/p><\/div>";
            }
        else if(prodZ4 <= 0){
            answerCemp.innerHTML="<div class='answerbox'><p>Looks like you don't ride Commuter Express often enough to benefit from purchasing a Monthly Pass. Trip Tickets may be a better option for you. <strong><a href='#triptickets'>Try the Trip Tickets Calculator below.<\/a><\/strong><\/p><\/div>";
        }
        }

        else if(selection == "z3"){
            var prodZ3 = z3yearlyCash - 1488;
            if(prodZ3 > 0){
            alert("If you pay cash, your yearly expense is $" + z3yearlyCash + ". Commuter Express Zone 3 Monthly Passes cost $1488 per year, a yearly savings of $"  +  prodZ3  +  ".");
            }
            else if(prodZ3 <= 0){
            alert("Looks like you don't ride Commuter Express often enough to benefit from purchasing a Monthly Pass. Trip Tickets may be a better option for you. Try the Trip Tickets Calculator below.");
        }
        }

        else if(selection == "z2"){
            var prodZ2 = z2yearlyCash - 1200;
            if(prodZ2 > 0){
            alert("If you pay cash, your yearly expense is $" + z2yearlyCash + ". Commuter Express Zone 2 Monthly Passes cost $1200 per year, a yearly savings of $"  +  prodZ2  +  ".");
            }
            else if(prodZ2 <= 0){
            alert("Looks like you don't ride Commuter Express often enough to benefit from purchasing a Monthly Pass. Trip Tickets may be a better option for you. Try the Trip Tickets Calculator below.");
        }       
        }

        else if(selection == "z1"){
            var prodZ1 = z1yearlyCash - 960;
            if(prodZ1 > 0){
            alert("If you pay cash, your yearly expense is $" + z1yearlyCash + ". Commuter Express Zone 1 Monthly Passes cost $960 per year, a yearly savings of $"  +  prodZ1  +  ".");
            }
            else if(prodZ1 <= 0){
            alert("Looks like you don't ride Commuter Express often enough to benefit from purchasing a Monthly Pass. Trip Tickets may be a better option for you. Try the Trip Tickets Calculator below.");    
        }
        }

        else if(selection == "Base"){
            var prodBase = baseyearlyCash - 684;
            if(prodBase > 0){
            alert("If you pay cash, your yearly expense is $" + baseyearlyCash + ". Commuter Express Base Monthly Passes cost $684 per year, a yearly savings of $"  +  prodBase  +  ".");
            }
            else if(prodBase <= 0){
            alert("Looks like you don't ride Commuter Express often enough to benefit from purchasing a Monthly Pass. Trip Tickets may be a better option for you. Try the Trip Tickets Calculator below.");
        }
        }
    }

    // End CE MP Savings Calc script -->

    </script>

</head>

<body>


<div class="calcform">
  <form name="theForm3">
    <h2><a name="cemp" id="cemp"></a>You Do the Math: Commuter Express Monthly Pass Vs. Cash</h2>
<div class="formrow-calc">
      <div class="calcform-col1">
        <label for="trips-cemp">Daily boardings on Commuter Express Bus*:</label>
        <input type="text" id="trips-cemp">

      </div>
    </div>
    <div class="formrow-calc">
      <div class="calcform-col1">
        <label for="days-cemp">Days you ride Commuter Express <strong>per month</strong>:</label>

      <input type="text" id="days-cemp"></div>


    </div>
    <div class="formrow-calc">
      <div class="calcform-col1">
        <label for="choosezone">Choose Zone:</label>
        <select name="zone" id="choosezone">
          <option value="Base">Base</option>
          <option value="z1">Zone 1</option>
          <option value="z2">Zone 2</option>
          <option value="z3">Zone 3</option>
          <option value="z4">Zone 4</option>
        </select>

      </div>
    </div>
    <div class="clear"></div>
    <div align="center">
      <button type="submit" onclick="doMath3(); return false;" class="btn-submit"><img src="img/btn_savings.png" alt="Show My Yearly Savings"></button>
    </div>
    </form>
                      <div id="answerCemp"></div>
                    </div>

</body>
</html>

Вот код, который работает:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>


    <script type="text/javascript">



    <!-- Begin DASH MP Savings Calc script
    function  doMath2() {

    var one = eval(document.theForm.elements[0].value);
    var two = eval(document.theForm.elements[1].value);
    var three = one * two;
    var yearlyCash = three * .5 * 12;
    var prod = yearlyCash - 216;
    var answer=document.getElementById("answer")

    if (document.theForm.elements[0].value == ""){
    alert("Please enter the number of days a month you ride DASH.");
    }

    if (document.theForm.elements[1].value == ""){
    alert("Please enter the number of times you board a DASH bus daily.");  
    }

    if (one > 31){
            alert("Come now, no month has " + one + " days! Please try again.");

    }

    else {

    if(prod > 0){
    answer.innerHTML="<div class=answerbox><p>If you pay cash, your yearly expense is $" + yearlyCash + ".<br>DASH Monthly Passes cost $216 per year, <strong>a yearly savings of $"  +  prod  +  "<\/strong>.<br><strong><a href=http://store.ladottransit.com/Merchant2/merchant.mvc?Screen=PROD&amp;Store_Code=LTSO&amp;Product_Code=LADOTDMP1&amp;Category_Code=MP4>Buy a DASH Monthly Pass now.<\/strong><\/a><\/p><\/div>";
    }

        else if(prod <= 0){
            answer.innerHTML="<div class=answerbox><p>Looks like you don't ride DASH often enough to benefit from purchasing a Monthly Pass. However, you may benefit from the convenience of <strong><a href=http://store.ladottransit.com/Merchant2/merchant.mvc?Screen=PROD&amp;Store_Code=LTSO&amp;Product_Code=DTB1&amp;Category_Code=DTB>DASH Ticket Books.<\/a><\/strong><\/p><\/div>";
        }
    }
    }




    // End DASH MP Savings Calc script -->
    </script>
</head>

<body>


<div class="calcform">
                      <form name="theForm" action="#">
                        <h2>You Do the Math: DASH Monthly Pass Vs. Cash</h2>
                        <div class="formrow-calc">
                          <div class="calcform-col1">
                            <label for="trips-dash">Daily boardings on  DASH bus*:</label>
                            <input type="text" name="trips" id="trips-dash">
                          </div>
                        </div><div class="calcform-col1">
                            <label for="days-dash">Number of days <strong>per month</strong> you ride DASH:</label>
                            <input type="text" name="days" id="days-dash">
                            </div>
                        <div class="clear"></div>
                        <div align="center">
                          <button type="submit" onclick="doMath2(); return false;" class="btn-submit">
                           <img src="img/btn_savings.png" alt="Show My Yearly Savings">
                          </button>
                        </div>

                      </form>
                      <div id="answer"></div>
                    </div>

</body>
</html>

person Halfacre    schedule 26.05.2011    source источник
comment
в своем исходном сообщении я сказал, что рабочий код внизу предназначен для ответов в окнах предупреждений, но я хотел сказать, что успешно использовал innerHTML. Извините за путаницу.   -  person Halfacre    schedule 27.05.2011


Ответы (2)


В вашем рабочем сценарии у вас есть answer вместо answerCEMP. И вы делаете его определение:

var answer = document.getElementById("answer");

Вы упустили эту часть из своего неудачного сценария. Кроме того, вы используете name в div вместо id. Используйте id. Измените свой html:

<div id="answerCEMP"></div>

И определите answerCEMP в вашем javascript:

var answerCEMP = document.getElementById("answerCEMP");
person gilly3    schedule 27.05.2011
comment
Аргх, вы так правы. Я косил глазами, глядя на это. - person Halfacre; 27.05.2011
comment
@ gilly3 Ценю ответ. К сожалению, он все еще не работает. Я отредактировал код ошибки ниже. Есть ли что-то еще, что мне не хватает? - person Halfacre; 27.05.2011
comment
@Halfacre - Идентификаторы чувствительны к регистру. У вас есть answerCemp в качестве вашего идентификатора div, но вы ищете answerCEMP в своем JavaScript. Обновите скрипт или html, чтобы они совпадали. - person gilly3; 27.05.2011
comment
@Halfacre - я заметил, что вы исправили код в своем вопросе. Это может сбить с толку тех, кто придет после вас, кто мог бы извлечь уроки из вашего вопроса. После исправления ошибки ни вопрос, ни ответы не имеют смысла. Лучше оставить ошибки в опубликованном вопросе, чтобы сохранить его целостность. Поскольку у вас по-прежнему возникают проблемы, и вы хотите исправить ошибку, оставшуюся после изменения кода, вы можете добавить Изменить: в конце своего сообщения, объясняя, что вы пытались сделать, и что это по-прежнему не работает. Этот подход может быть менее запутанным. - person gilly3; 27.05.2011
comment
@Halfacre - Кстати, как только вы исправите проблемы с регистром, ваш код заработает. Посмотрите, как это работает здесь: jsfiddle.net/gilly3/cENks - person gilly3; 27.05.2011
comment
АРХ снова! какая ошибка новичка (подобающая новичку, я полагаю). Спасибо @gilly3. Кажется, я также новичок в использовании этого сайта, ценю всю помощь. - person Halfacre; 27.05.2011

Я все еще довольно зеленый в javascript и учусь на ходу, поэтому любая подробная информация, которую вы можете предоставить, была бы очень полезной.

Мой совет, особенно для начинающих программистов javascript, — использовать фреймворк javascript. Для начинающих программистов я думаю, что очень популярный jquery будет очень удовлетворителен.

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

Jquery может сделать это очень легко, используя html(). Я хотел бы отметить, что использование eval() может быть очень опасным.

Я прогнал это через firebug и оказалось, что все расчеты выполняются, а скрипт падает только тогда, когда приходит время отображать результаты.

Я просто добавлю простое значение к dom, используя jquery в качестве примера. Когда вы нажимаете кнопку, я собираюсь изменить текст => http://jsfiddle.net/WVXhD/

person Alfred    schedule 27.05.2011
comment
Спасибо @Альфред. Действительно, я использовал JQuery совсем немного, и я согласен с тем, что эта структура позаботится о больших кусках работы за вас. На самом деле мне было так легко, что я не научился чертовски многому. :D Заменил eval (evil) на parseInt, и он все еще работает как шарм (хотел сделать это раньше, но как-то пропустил). Спасибо еще раз! - person Halfacre; 27.05.2011