Сценарии JavaScript в активных страницах Web

         

Десятично-шестнадцатеричный преобразователь


На рис. 4.1. показан внешний вид десятично-шестнадцатеричного преобразователя, выполненного на базе документов HTML с фреймами и сценарием JavaScript.

Рис. 4.1. Десятично-шестнадцатеричный преобразователь, выполненный с использованием фреймов

Верхний фрейм используется для размещения заголовка. Клавиатура преобразователя, предназначенная для ввода десятичных чисел и запуска процесса преобразования, находится в левом фрейме. Правый фрейм используется для отображения исходного десятичного числа и результата преобразования.

Вы можете вводить исходное число не только с помощью клавиатуры, но и непосредственно в поле Dec, расположенное в правом фрейме. Поле Hex заблокировано для вода при помощи обработчика события onFocus. Аналогичный прием мы использовали в шестнадцатеричном калькуляторе, исходные тексты которого были приведены в предыдущей главе.

Исходный текст файла описания фреймов представлен в листинге 4.1.

Листинг 4.1. Файл chapter4/Converter/index.html

<HTML>

  <HEAD>

    <TITLE>Десятично-шестнадцатеричный   преобразователь</TITLE>

  </HEAD>

  <FRAMESET ROWS="85,*" FRAMEBORDER=1>

    <FRAME SCROLLING="no" NAME="title" SRC="title.html" MARGINHEIGHT="1">



    <FRAMESET COLS="180,*" FRAMEBORDER=1>

      <FRAME SCROLLING="auto" NAME="toc" SRC="toc.html">

      <FRAME SCROLLING="auto" NAME="mainpage" SRC="main.html">

    </FRAMESET>

    <NOFRAME>

      <BODY BGCOLOR="#FFFFFF">

      </BODY>

    </NOFRAME>

  </FRAMESET>

</HTML>

Наш сценарий будет работать с фреймами toc и mainpage, расположенными, соответственно, в файлах с именами toc.html и main.html. В файле title.html располагается заголовок (листинг 4.2).

Листинг 4.2. Файл chapter4/Converter/title.html

<HTML>

  <HEAD>

  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">


  </HEAD>

  <BODY BGCOLOR="#ffffff">

    <TABLE><TR><TD>

      <H2>Десятично-шестнадцатеричный преобразователь</H2>

    </TD></TR></TABLE>

  </BODY>

</HTML>

Исходный текст документа, содержащего форму с полями Dec и Hex, представлен в листинге 4.3.

Листинг 4.3. Файл chapter4/Converter/main.html

<HTML>

<HEAD>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">

</HEAD>

<BODY BGCOLOR="#FFFFFF">

    <FORM NAME="Sel">

      <TABLE>

       <TR><TD><B>Hex:</B></TD><TD><INPUT TYPE="text"

        NAME="hexValue" SIZE="20" onFocus="this.blur();"></TD></TR>

      <TR><TD><B>Dec:</B></TD><TD><INPUT TYPE="text"

        NAME="decValue" SIZE="20"></TD></TR>

    </FORM>

</BODY>

</HTML>

Для поля исходного десятичного числа при помощи параметра NAME мы задали имя decValue. Поле результата называется hexValue. Эти имена используются сценарием JavaScript для адресации наших полей.

Документ toc.html (листинг 4.4) содержит форму с кнопками и сценарий JavaScript.

Листинг 4.4. Файл chapter4/Converter/toc.html

<HTML>

<BODY BGCOLOR="#B0FFD8">

  <SCRIPT LANGUAGE="JavaScript">

  <!--

  var bNewNumber = true;

 

  function dec2hex(nDec)

  {

    var szHexTable="0123456789ABCDEF";

    var szResult = "";

    var szBuf="";

    var nRem = 0;

    var bNegative=false;

    if(nDec < 0)

    {

      bNegative=true;

      nDec = -nDec;

    }

    nTmp=nDec;

     

    while(true)

    {

      nRem = nTmp % 16;

      nTmp = nTmp / 16;

      if(Math.floor(nTmp) < 16)

        break;



      szBuf=szHexTable.charAt(nRem);

      szResult = szBuf.concat(szResult);

      nTmp = Math.floor(nTmp);

    }

   

    szBuf=szHexTable.charAt(nRem);

    szResult = szBuf.concat(szResult);

    if(Math.floor(nTmp) != 0)

    {

      szBuf=szHexTable.charAt(Math.floor(nTmp));

      szResult = szBuf.concat(szResult);

    }

    if(bNegative == true)

      return ("-" + szResult);

    else

      return szResult;

  }

  function putNumber(btn,form)

  {

    var szOld = "";

    var szNew = "";

    if(bNewNumber)

    {

      parent.mainpage.document.forms[0].hexValue.value = "";

      parent.mainpage.document.forms[0].decValue.value = "";

      bNewNumber = false; 

    }

   

    szOld = parent.mainpage.document.forms[0].decValue.value;

  

    szNew = szOld.concat(btn.name);

    nCurrent = eval(szNew);

  

    parent.mainpage.document.forms[0].decValue.value = nCurrent;

  }

  function clearAll(form)

  {

    total = 0; 

    lastOperation = "+"; 

    parent.mainpage.document.forms[0].hexValue.value = "0";

    parent.mainpage.document.forms[0].decValue.value = "0";

    bNewNumber = true; 

  }

  function getResult(form)

  {

    parent.mainpage.document.forms[0].hexValue.value = dec2hex(parent.mainpage.document.forms[0].decValue.value);

    bNewNumber = true;

  }

  // -->

  </SCRIPT>

  <FORM>

    <TABLE BORDER=2 BORDERCOLOR="Black" BGCOLOR="Yellow">

      <TR>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="5" VALUE=" 5 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="6" VALUE=" 6 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="7" VALUE=" 7 " onClick="putNumber(this,this.form);"></TD>



        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="8" VALUE=" 8 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="9" VALUE=" 9 " onClick="putNumber(this,this.form);"></TD>

      </TR>

      <TR>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="0" VALUE=" 0 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="1" VALUE=" 1 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="2" VALUE=" 2 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="3" VALUE=" 3 " onClick="putNumber(this,this.form);"></TD>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="4" VALUE=" 4 " onClick="putNumber(this,this.form);"></TD>

       </TR>

      <TR>

        <TD ALIGN=CENTER><INPUT TYPE="button" NAME="C" VALUE=" C " onClick="clearAll(this.form);"></TD>

        <TD COLSPAN=4 ALIGN=CENTER><INPUT TYPE="button" NAME="=" VALUE=" to Hex " onClick="getResult(this.form);"></TD>

      </TR>

    </TABLE>

  </FORM>

</BODY>

</HTML>

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



Для того чтобы проинициализировать поля hexValue и decValue, мы ссылаемся на форму, расположенную внутри фрейма mainpage:

parent.mainpage.document.forms[0].hexValue.value = "";

parent.mainpage.document.forms[0].decValue.value = "";

Здесь parent ссылается на объект, который является родительским по отношению к документу HTML, содержащему сценарий. В данном случае это окно, содержащее все наши фреймы.

Для чтения содержимого поля decValue применяется аналогичная техника:

szOld = parent.mainpage.document.forms[0].decValue.value;

Функция getResult, выполняющая десятично-шестнадцатеричное преобразование, получает исходное число из поля decValue и передает его функции dec2hex . Результат преобразования, выполненного этой функцией, записывается затем в поле hexValue:

function getResult(form)

{

  parent.mainpage.document.forms[0].hexValue.value = dec2hex(parent.mainpage.document.forms[0].decValue.value);

  bNewNumber = true;

}


Содержание раздела