Помогите изучить ООП (JavaScript)

Старый mweb

Модератор: [mweb team]

Помогите изучить ООП (JavaScript)

Сообщение Berezkin Сб апр 04, 2009 11:00

Здрасьте.
Хочу научиться ООП в яваскрипте. Читаю вот потихоньку статьи в инете и учусь. Начал писать небольшой скриптик, создающий див с заданными параметрами на странице. Собственно сам скрипт:
Код: Выделить всё
function Div(id, color, w, h) {
   // объявляем и инициализируем свойства
   this.id = id;
   this.color = color;
   this.w = w;
   this.h = h;
   
   // создаем объект
   this.init();
}
      
Div.prototype.init = function() {
   var div = document.createElement('div');
   var text = document.createTextNode('id = '+ this.id + ', color = #' + this.color);
         
   div.id = this.id;
   div.style.backgroundColor = '#' + this.color;
   div.style.width = this.w + 'px';
   div.style.height = this.h + 'px';
         
   div.onclick = function() {
      alert('ok');
   }
         
   div.appendChild(text);
   document.body.appendChild(div);
}

А вот так этот див создается на странице:
Код: Выделить всё
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
   <title>Test</title>
   <meta http-equiv="content-type" content="text/html;charset=utf-8" />
   <meta http-equiv="Content-Style-Type" content="text/css" />
   <script src="mydiv.js" type="text/javascript"></script>
</head>

<body>

<script type="text/javascript">
new Div('myFirstOOPDiv', '6699cc', 400, 50);
</script>

</body>
</html>


Вопрос: а как изменить скрипт так, чтобы див создавался на странице при клике на каком-нибудь элементе?
Windows как презерватив - никому не нравится, но все пользуются.
Аватара пользователя
Berezkin
Заядлый `курильщик`
 
Сообщения: 612
Зарегистрирован: Вт дек 19, 2006 12:39
Откуда: Москоу

Re: Помогите изучить ООП (JavaScript)

Сообщение Muerto Сб апр 04, 2009 16:44

Код: Выделить всё
<a href="" onclick="JavaScript: new Div('mySecondOOPDiv', 'FF0000', 400, 50); return false;">Click me!</a>
Nadie hablara de nosotras cuando hayamos muerto.
www.muerto.ru
Аватара пользователя
Muerto
Растаман
 
Сообщения: 3597
Зарегистрирован: Пн окт 11, 2004 19:09
Откуда: Москва

Re: Помогите изучить ООП (JavaScript)

Сообщение Berezkin Сб апр 04, 2009 22:16

Хе, логично... и чего я сам не допер до этого :)
Я почему то думал как-нить навесить событие на объект скриптом, но не получалось.
Windows как презерватив - никому не нравится, но все пользуются.
Аватара пользователя
Berezkin
Заядлый `курильщик`
 
Сообщения: 612
Зарегистрирован: Вт дек 19, 2006 12:39
Откуда: Москоу

Re: Помогите изучить ООП (JavaScript)

Сообщение Berezkin Пн апр 06, 2009 15:33

Пытаюсь навесить событие на объект, созданный скриптом. Столкнулся с такой проблемой, код:
Код: Выделить всё
function obj(tag, id, clName, listener, script) {
    var newObj = document.createElement(tag);
    newObj.id = id;
    newObj.className = clName;
    newObj.setAttribute(listener, script);
}

obj('div', 'div1', 'div1', 'onclick', 'alert("ok");');


В мозилле все естественно работает. А вот в ие нифига не хочет работать. Вычитал, что для ие надо использовать другой код, а именно:
Код: Выделить всё
newObj.setAttribute(listener, function() {alert('ok');});

т.к. ие не умеет преобразовывать строку в функцию. Но вот такая конструкция не хочет работать:
Код: Выделить всё
newObj.setAttribute(listener, function() {script});


Как быть?
Windows как презерватив - никому не нравится, но все пользуются.
Аватара пользователя
Berezkin
Заядлый `курильщик`
 
Сообщения: 612
Зарегистрирован: Вт дек 19, 2006 12:39
Откуда: Москоу

Re: Помогите изучить ООП (JavaScript)

Сообщение Berezkin Вт апр 28, 2009 9:47

Проблема с setInterval(); Пишу код:
Код: Выделить всё
function Mover(obj, x, y) {
   // something
}
      
Mover.prototype.startMove = function() {
   alert(this); // [object Window]
}
      
Mover.prototype.startAnim = function() {
   alert(this); // [object Object]
   this.int = setInterval(this.startMove, 2000);
}

Почему startMove относится к Window?
UPD: Если вызвать ее не через интервал, а напрямую то все в порядке.
Windows как презерватив - никому не нравится, но все пользуются.
Аватара пользователя
Berezkin
Заядлый `курильщик`
 
Сообщения: 612
Зарегистрирован: Вт дек 19, 2006 12:39
Откуда: Москоу

Re: Помогите изучить ООП (JavaScript)

Сообщение Muerto Вт апр 28, 2009 15:49

Berezkin
Приведи код полностью, плиз.
Nadie hablara de nosotras cuando hayamos muerto.
www.muerto.ru
Аватара пользователя
Muerto
Растаман
 
Сообщения: 3597
Зарегистрирован: Пн окт 11, 2004 19:09
Откуда: Москва

Re: Помогите изучить ООП (JavaScript)

Сообщение Berezkin Вт апр 28, 2009 17:34

Код: Выделить всё
function Mover(obj, x, y) {
   this.obj = document.getElementById(obj);
   this.x = x;
   this.y = y;
   this.l = 0;
   this.startAnim();
}
     
Mover.prototype.startMove = function() {
   alert(this); // [object Window]
   this.obj.style.left = this.l;
   this.l ++;
}
     
Mover.prototype.startAnim = function() {
   alert(this); // [object Object]
   this.int = setInterval(this.startMove, 2000);
   if (this.l > this.x) {
      clearInterval(this.int);
   }
}

// Если вот так как написано запустить new Mover('div', 100, 100);, то получится ошибка, типа this.obj is null
// И его действительно не будет, т.к. startMove будет уже не прототипом объекта Mover, а прототипом Window
Windows как презерватив - никому не нравится, но все пользуются.
Аватара пользователя
Berezkin
Заядлый `курильщик`
 
Сообщения: 612
Зарегистрирован: Вт дек 19, 2006 12:39
Откуда: Москоу

Re: Помогите изучить ООП (JavaScript)

Сообщение Muerto Ср апр 29, 2009 11:13

Логически объяснить не могу почему...
Код: Выделить всё
<!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>
</head>

<body>
<div id="div1" style="position:relative; left:0;">мы едем, едем, едем...</div>
<input id="test" type="text" />
<script type="text/javascript">
    function Mover(obj, x, y) {
       this.obj = document.getElementById(obj);      
       this.x = x;
       this.y = y;
       this.l = 0;
      temp = this.obj;
      temp1 = this;
       this.startAnim();
      
    }
         
    Mover.prototype.startMove = function() {
       //alert(temp); // [object Window]
      document.getElementById('test').value = temp1.l;
       temp.style.left = temp1.l + "px";
       temp1.l ++;
    }
         
    Mover.prototype.startAnim = function() {
       //alert(this); // [object Object]
       this.int = setInterval(this.startMove, 2000);
       if (this.l > this.x) {
          clearInterval(this.int);
       }
    }
new Mover('div1', 100, 100);
    // Если вот так как написано запустить new Mover('div', 100, 100);, то получится ошибка, типа this.obj is null
    // И его действительно не будет, т.к. startMove будет уже не прототипом объекта Mover, а прототипом Window

</script>
</body>
</html>
Nadie hablara de nosotras cuando hayamos muerto.
www.muerto.ru
Аватара пользователя
Muerto
Растаман
 
Сообщения: 3597
Зарегистрирован: Пн окт 11, 2004 19:09
Откуда: Москва

Re: Помогите изучить ООП (JavaScript)

Сообщение Muerto Чт апр 30, 2009 18:30

Berezkin С предыдущим вопросом (viewtopic.php?f=1&t=6041#p55485) решил? Если нет - опять приводи весь код.
Nadie hablara de nosotras cuando hayamos muerto.
www.muerto.ru
Аватара пользователя
Muerto
Растаман
 
Сообщения: 3597
Зарегистрирован: Пн окт 11, 2004 19:09
Откуда: Москва

Re: Помогите изучить ООП (JavaScript)

Сообщение Muerto Пт май 08, 2009 16:47

То ли я перепил, то ли чего, но никак не могу сделать replaceChild. Привожу полный код:
Код: Выделить всё
<!DOCTYPE html>
<html><head>
<meta content="text/html; charset=windows-1251" http-equiv="Content-Type">
<title>Квитанция по счету</title>
<style>
.myTD {font-family: Times Roman, Verdana, Arial, Helvetica, sans-serif; font-size: 8px; }
input, textarea {border:#999 1px solid;}
.warning {border-color:red;}
#errors {display:none;}
</style>
<script type="text/javascript">
function mirror(txt) { document.getElementById(txt.name).innerHTML = txt.value;} //функция дублирования записей внесенных в поля на аналогичные поля в квитанции
function validate() {
    var blockEr = document.getElementById("errors"); // это блок вывода ошибок заполнения
    blockEr.style.display = "none"; // при начале проверки он скрыт   
    if (blockEr.getElementsByTagName("P").length>0) blockEr.removeChild(blockEr.getElementsByTagName("P")[0]); // если проверка повторная, то мы обнуляем предыдущие сообщения об ошибках
    var receipt = document.getElementById("receipt"); // это таблица с нашей квитанцией
    var errorLog = new Array; // иницилизируем лог найденых ошибок
    var inp = receipt.getElementsByTagName("*"); // все узлы таблицы квитанции. Плата за TEXTAREA.
   //inp = inp + bigText;
    for (var i=0; i<inp.length; i++) {  // цикл по всем узлам таблицы нашей квитанции
   if(inp[i].tagName!="INPUT" && inp[i].tagName!="TEXTAREA") continue; //если узел не поле ввода, то смотрим следущий узел
        inp[i].className = ""; // если проверка повторная у поля убираем сначала красную рамку
      attr = inp[i].getAttribute("data-validator").split(" "); // делим строку какие проверки нужны этому полю
        if (inp[i].getAttribute("data-validator").indexOf("required")!=-1 && inp[i].value == "") { // это поле пустое, но должно быть заполнено
       inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
            errorLog.push("Поле " + inp[i].title + " должно быть заполнено!"); // добавить сообщение об ошибке поля в лог
       continue; // остальное можно не проверять, переходим ко следущему полю
   }
         
   if (inp[i].getAttribute("data-validator").indexOf("digit")!=-1 && inp[i].value!=parseFloat(inp[i].value)) { // это цифровое поле, но там есть другие знаки
       inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
       errorLog.push("В поле " + inp[i].title + " должны быть только цифры!"); // добавить сообщение об ошибке поля в лог
       continue; // остальное можно не проверять, переходим ко следущему полю
   }
         
   if (inp[i].getAttribute("data-validator").indexOf("[")!=-1) { // есть ограничения кол-во знаков в поле
       valAll = inp[i].getAttribute("data-validator").substring(inp[i].getAttribute("data-validator").indexOf("[") + 1, inp[i].getAttribute("data-validator").indexOf("]")); // находим текст внутри []
       if (valAll.indexOf("-")!=-1) { // кол-во знаков в поле является диапазоном чисел ( иначе - см. ELSE )
                diapason = valAll.split("-"); // отделим минимум диапазона от максимума
      if ((parseFloat(diapason[0])>inp[i].value.length) || (parseFloat(diapason[1])<inp[i].value.length)) { // кол-во символов в поле не совпадает с нужным диапазоном
          inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
          errorLog.push("В поле " + inp[i].title + " должно быть не больше " + diapason[1] + " символов!"); // добавить сообщение об ошибке поля в лог
      }
            }
            else
       { // кол-во знаков в поле является определенным числом или набором чисел
      val = valAll.split(" "); // делим все числа внутри [] разделенные пробелом (даже если число одно)
      flag = true; // объявляем флаг проверки на соответствие кол-ва символов
                for (v = 0; v<val.length; v++) { // цикл по числам проверки кол-ва знаков в поле
                    if (parseFloat(val[v]) == inp[i].value.length) flag = false; // кол-во знаков в поле совпало с числом проверки
      }
      if (flag) { // не одно из чисел проверки не совпало с кол-вом символов в поле. Флаг не изменился
                    if (val[0]) valAll = val.join(" или "); // если чисел несколько - склеим их для лога ошибки
          errorLog.push("Кол-во символов в поле " + inp[i].title + " должно быть " + valAll);  // добавляем ошибку в лог
          inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
      }
       }
           
   } // закрываем проверку на кол-во знаков в поле
    }// конец цикла. переходим к следущему полю
   
    if (errorLog.length!=0) { // если в логе есть ошибки
   var err = document.createElement("P"); // создадим элемент Р в блоке ошибок
   err.innerHTML = errorLog.join("<br>"); // склеим все элементы массива лога ошибок и поместим его в созданный блок Р
   document.getElementById("errors").appendChild(err); // добавим созданый блок Р в блок ошибок
   document.getElementById("errors").style.display = "block"; // сделаем блок ошибок видимым
   document.getElementById("printer").style.display = "block"; // сделаем кнопку создания квитанции видимой
    } else { //валидация пройдена
   document.getElementById("printer").value = "создать квитанцию";   
   document.getElementById("printer").onclick = printer();
   }// конец вывода ошибок
   
} //конец функции
function printer() {
   
newTable = document.getElementById("receipt");
inp1 = document.getElementById("receipt").getElementsByTagName("*");
for (var ii=0; ii<inp1.length; ii++) {
   if(inp1[ii].tagName == "INPUT" || inp1[ii].tagName == "TEXTAREA") {
      spn = document.createElement("SPAN");
      spn.innerHTML = inp1[ii].value;
      inp1[ii].parentNode.replaceChild(inp1[ii], spn);
   }
}
var newwin = window.open();
newwin.document.appendChild(newTable);
}
</script>
</head><body bgcolor="#ffffff">
<center>

<table width="570" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0" id="receipt">
<tbody><tr><td>
<table width="570" border="1" cellpadding="3" cellspacing="0">
<tbody><tr>
        <td valign="top" width="35%" align="right" bgcolor="#ffffff" height="255">
   <br><br><font size="2"><p>Извещение</p>
   <br><br><br><br><br><br><br><br><br><br><br>
        <font size="1"><p>Кассир</p></font></font></td>

             <td valign="middle" width="370" align="right" bgcolor="#ffffff" height="255">

<table width="100%"><tbody><tr><td align="center">
    <font size="-1">
    ИНН <input type="text" name="INN" maxlength="12" tabindex="1" data-validator="required digit [10 12]" title="ИНН" onChange="mirror(this)" style="width:135px;"> КПП <input type="text" name="KPP" maxlength="9" tabindex="2" data-validator="required digit [9]" title="КПП" onChange="mirror(this)" style="width:135px;">
    <br><textarea rows="2" name="recipient" tabindex="3" title="получатель платежа" onChange="mirror(this)" wrap="virtual" style="width:100%;" data-validator="required [1-160]"></textarea>
    <br><font size="1">получатель платежа</font>
</font></td></tr>
</tbody></table>

<table width="100%" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0">
<tbody><tr><td bgcolor="#000000">
<table width="100%" border="1" cellpadding="3" cellspacing="0">

<tbody><tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center"><font size="2">Расчетный&nbsp;счет&nbsp;№:&nbsp;<input type="text" maxlength="20" name="settlement_account" tabindex="4" data-validator="required digit [20]" title="Расчетный счет" onChange="mirror(this)" style="width:100px;">&nbsp;БИК:&nbsp;<input type="text" name="BIK" maxlength="9" tabindex="5" data-validator="required digit [9]" title="БИК" style="width:100px;"></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center" height="10"><font size="2">Кор. сч.: <input type="text" name="loro_account" maxlength="20" tabindex="6" data-validator="required digit [20]" title="Кор. сч." onChange="mirror(this)"></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" align="center"><font size="2"><input type="text" name="FIO" tabindex="7" data-validator="required" title="Ф.И.О." onChange="mirror(this)" style="width:100%;"><br><input type="text" name="address" tabindex="8" title="адрес" onChange="mirror(this)" style="width:100%;" data-validator=""><br><font size="1">плательщик  (ФИО, адрес)</font></font></td></tr>
<tr bgcolor="#ffffff">
    <td colspan="2" width="50%" align="center"><font size="2">Вид платежа</font></td>
    <td width="25%" align="center"><font size="2">Дата</font></td>
    <td width="25%" align="center"><font size="2">Сумма</font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" align="center"><font size="1"><textarea rows="2" name="details" tabindex="9" data-validator="required" title="Вид платежа" onChange="mirror(this)" wrap="virtual" style="width:160px;"></textarea></font></td>
    <td align="center">&nbsp;</td>
    <td align="center"><font size="2"> <input style="width:70px;" type="text" name="sum" tabindex="10" data-validator="required" title="сумма" onChange="mirror(this)"></font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" rowspan="2" align="left"><font size="2">Плательщик:</font></td>
    <td align="center"><font size="1">Пеня:</font></td>
    <td align="center"><br></td>
</tr>
<tr align="center" bgcolor="#ffffff">
    <td><font size="1">Всего:</font></td>
    <td><br></td>
</tr>
                </tbody></table>
</td></tr></tbody></table>
        </td>
</tr>
<tr>
        <td valign="top" width="200" align="right" bgcolor="#ffffff" height="255"><br><br><font size="2"><p>Квитанция</p><br><br><br><br><br><br><br><br><br><br><br>
        <font size="1"><p>Кассир</p></font></font></td>
             <td valign="middle" width="370" align="right" bgcolor="#ffffff" height="255">
<table width="100%"><tbody><tr><td align="center">
    <font size="-1">
    ИНН <span id="INN"></span> КПП <span id="KPP"></span>
    <br><u><span id="recipient"></span>
    </u><br><font size="1">получатель платежа</font>
</font></td></tr>
</tbody></table>

<table width="100%" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0">
<tbody><tr><td bgcolor="#000000">
<table width="100%" border="1" cellpadding="3" cellspacing="0">

<tbody><tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center"><font size="2">Расчетный&nbsp;счет&nbsp;№:&nbsp;<span id="settlement_account"></span>&nbsp;БИК:&nbsp;<span id="BIK"></span></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center" height="10"><font size="2">Кор. сч.: <span id="loro_account"></span></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" align="center"><font size="2"><span id="FIO"></span>,<br><span id="address"></span><br><font size="1">плательщик  (ФИО, адрес)</font></font></td></tr>
<tr bgcolor="#ffffff">
    <td colspan="2" width="50%" align="center"><font size="2">Вид платежа</font></td>
    <td width="25%" align="center"><font size="2">Дата</font></td>
    <td width="25%" align="center"><font size="2">Сумма</font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" align="center"><font size="1"><span id="details">&nbsp;</span></font></td>
    <td align="center">&nbsp;</td>
    <td align="center"><font size="2"> <span id="sum">&nbsp;</span></font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" rowspan="2" align="left"><font size="2">Плательщик:</font></td>
    <td align="center"><font size="1">Пеня:</font></td>
    <td align="center"><br></td>
</tr>
<tr align="center" bgcolor="#ffffff">
    <td><font size="1">Всего:</font></td>
    <td><br></td>
</tr>
                </tbody></table>
</td></tr></tbody></table>



        </td>
</tr>


</tbody></table>

</td></tr></tbody></table>
<hr size="1" width="570" noshade="noshade">
<div id="errors">
<font color="red">Возможны ошибки!!!</font> <br>
</div>
<input type="button" value="проверить правильность" onClick="validate()" tabindex="11" id="validation">
<input type="button" value="нет, я уверен" onClick="printer()" style="display:none;" tabindex="12" id="printer">
</center></body></html>

Он ещё до конца не дописан, ну да и хрен бы с ним. Не могу заставить работать функцию printer(). Точнее, то место, где должны заменятся inputы на spanы. Говорит, зараза, ноды нету.
P.-S. То что код кривоват и скрипт неоптимизирован - не писать, и сам знаю.
P.P.-S. insertBefore, с последущим ремувом пробовал - не делает и ошибок не выдает. Ремув и аппенд прокатывает, но если если у парента не больше одного чаилда инпута.
Nadie hablara de nosotras cuando hayamos muerto.
www.muerto.ru
Аватара пользователя
Muerto
Растаман
 
Сообщения: 3597
Зарегистрирован: Пн окт 11, 2004 19:09
Откуда: Москва

Re: Помогите изучить ООП (JavaScript)

Сообщение Padonak Сб май 09, 2009 1:13

Код: Выделить всё
<!DOCTYPE html>
<html><head>
<meta content="text/html; charset=windows-1251" http-equiv="Content-Type">
<title>Квитанция по счету</title>
<style>
.myTD {font-family: Times Roman, Verdana, Arial, Helvetica, sans-serif; font-size: 8px; }
input, textarea {border:#999 1px solid;}
.warning {border-color:red;}
#errors {display:none;}
.f1{font-size: 10px;}
.f2{font-size: 12px;}
.f3{font-size: 13px;}
</style>
<script type="text/javascript">
function mirror(txt) { document.getElementById(txt.name).innerHTML = txt.value;} //функция дублирования записей внесенных в поля на аналогичные поля в квитанции
function validate() {
    var blockEr = document.getElementById("errors"); // это блок вывода ошибок заполнения
    blockEr.style.display = "none"; // при начале проверки он скрыт   
    if (blockEr.getElementsByTagName("P").length>0) blockEr.removeChild(blockEr.getElementsByTagName("P")[0]); // если проверка повторная, то мы обнуляем предыдущие сообщения об ошибках
    var receipt = document.getElementById("receipt"); // это таблица с нашей квитанцией
    var errorLog = new Array; // иницилизируем лог найденых ошибок
    var inp = receipt.getElementsByTagName("*"); // все узлы таблицы квитанции. Плата за TEXTAREA.
   //inp = inp + bigText;
    for (var i=0; i<inp.length; i++) {  // цикл по всем узлам таблицы нашей квитанции
   if(inp[i].tagName!="INPUT" && inp[i].tagName!="TEXTAREA") continue; //если узел не поле ввода, то смотрим следущий узел
        inp[i].className = ""; // если проверка повторная у поля убираем сначала красную рамку
      attr = inp[i].getAttribute("data-validator").split(" "); // делим строку какие проверки нужны этому полю
        if (inp[i].getAttribute("data-validator").indexOf("required")!=-1 && inp[i].value == "") { // это поле пустое, но должно быть заполнено
       inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
            errorLog.push("Поле " + inp[i].title + " должно быть заполнено!"); // добавить сообщение об ошибке поля в лог
       continue; // остальное можно не проверять, переходим ко следущему полю
   }
         
   if (inp[i].getAttribute("data-validator").indexOf("digit")!=-1 && inp[i].value!=parseFloat(inp[i].value)) { // это цифровое поле, но там есть другие знаки
       inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
       errorLog.push("В поле " + inp[i].title + " должны быть только цифры!"); // добавить сообщение об ошибке поля в лог
       continue; // остальное можно не проверять, переходим ко следущему полю
   }
         
   if (inp[i].getAttribute("data-validator").indexOf("[")!=-1) { // есть ограничения кол-во знаков в поле
       valAll = inp[i].getAttribute("data-validator").substring(inp[i].getAttribute("data-validator").indexOf("[") + 1, inp[i].getAttribute("data-validator").indexOf("]")); // находим текст внутри []
       if (valAll.indexOf("-")!=-1) { // кол-во знаков в поле является диапазоном чисел ( иначе - см. ELSE )
                diapason = valAll.split("-"); // отделим минимум диапазона от максимума
      if ((parseFloat(diapason[0])>inp[i].value.length) || (parseFloat(diapason[1])<inp[i].value.length)) { // кол-во символов в поле не совпадает с нужным диапазоном
          inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
          errorLog.push("В поле " + inp[i].title + " должно быть не больше " + diapason[1] + " символов!"); // добавить сообщение об ошибке поля в лог
      }
            }
            else
       { // кол-во знаков в поле является определенным числом или набором чисел
      val = valAll.split(" "); // делим все числа внутри [] разделенные пробелом (даже если число одно)
      flag = true; // объявляем флаг проверки на соответствие кол-ва символов
                for (v = 0; v<val.length; v++) { // цикл по числам проверки кол-ва знаков в поле
                    if (parseFloat(val[v]) == inp[i].value.length) flag = false; // кол-во знаков в поле совпало с числом проверки
      }
      if (flag) { // не одно из чисел проверки не совпало с кол-вом символов в поле. Флаг не изменился
                    if (val[0]) valAll = val.join(" или "); // если чисел несколько - склеим их для лога ошибки
          errorLog.push("Кол-во символов в поле " + inp[i].title + " должно быть " + valAll);  // добавляем ошибку в лог
          inp[i].className="warning"; // данному полю присвоить класс с красной рамкой
      }
       }
           
   } // закрываем проверку на кол-во знаков в поле
    }// конец цикла. переходим к следущему полю
   
    if (errorLog.length!=0) { // если в логе есть ошибки
   var err = document.createElement("P"); // создадим элемент Р в блоке ошибок
   err.innerHTML = errorLog.join("<br>"); // склеим все элементы массива лога ошибок и поместим его в созданный блок Р
   document.getElementById("errors").appendChild(err); // добавим созданый блок Р в блок ошибок
   document.getElementById("errors").style.display = "block"; // сделаем блок ошибок видимым
   document.getElementById("printer").style.display = "block"; // сделаем кнопку создания квитанции видимой
    } else { //валидация пройдена
   document.getElementById("printer").value = "создать квитанцию";   
   document.getElementById("printer").onclick = function(){printer();}
   }// конец вывода ошибок
   
} //конец функции

function printer(){
var newTable = document.getElementById("receipt");
var inp1 = document.getElementById("receipt").getElementsByTagName("*");
for(var ii = 0; ii < inp1.length; ii++){
if(inp1[ii].tagName == "INPUT" || inp1[ii].tagName == "TEXTAREA"){
var spn = document.createElement("span");
spn.innerHTML = inp1[ii].value;
// ВОТ ТУТ У РЕПЛЕСЧАЙЛДА АРГУМЕНТЫ СТОЯЛИ ЗАДОМ НАПЕРЕД
inp1[ii].parentNode.replaceChild(spn, inp1[ii]);
}
else{continue;}
}

//var newwin = window.open();
//newwin.document.appendChild(newTable);
}
</script>
</head><body bgcolor="#ffffff">
<center>

<table width="570" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0" id="receipt">
<tbody><tr><td>

<table width="570" border="1" cellpadding="3" cellspacing="0">
<tbody>
<tr>
<td valign="top" width="35%" align="right" bgcolor="#ffffff" height="255"><br><br><p class="f2">Извещение</p><br><br><br><br><br><br><br><br><br><br><br><p class="f1">Кассир</p></td>
<td valign="middle" width="370" align="right" bgcolor="#ffffff" height="255">

<table width="100%">
<tbody>
<tr>
<td align="center" class="f3">ИНН <input type="text" name="INN" maxlength="12" tabindex="1" data-validator="required digit [10 12]" title="ИНН" onChange="mirror(this)" style="width:135px;"> КПП <input type="text" name="KPP" maxlength="9" tabindex="2" data-validator="required digit [9]" title="КПП" onChange="mirror(this)" style="width:135px;"><br><textarea rows="2" name="recipient" tabindex="3" title="получатель платежа" onChange="mirror(this)" wrap="virtual" style="width:100%;" data-validator="required [1-160]"></textarea><br><span class="f1">получатель платежа</span></td>
</tr>
</tbody></table>

<table width="100%" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0">
<tbody><tr><td bgcolor="#000000">

<table width="100%" border="1" cellpadding="3" cellspacing="0">
<tbody>
<tr bgcolor="#ffffff">
<td colspan="4" valign="center" align="center" class="f2">Расчетный&nbsp;счет&nbsp;№:&nbsp;<input type="text" maxlength="20" name="settlement_account" tabindex="4" data-validator="required digit [20]" title="Расчетный счет" onChange="mirror(this)" style="width:100px;">&nbsp;БИК:&nbsp;<input type="text" name="BIK" maxlength="9" tabindex="5" data-validator="required digit [9]" title="БИК" style="width:100px;"></td>
</tr>
<tr bgcolor="#ffffff">
<td colspan="4" valign="center" align="center" height="10" class="f2">Кор. сч.: <input type="text" name="loro_account" maxlength="20" tabindex="6" data-validator="required digit [20]" title="Кор. сч." onChange="mirror(this)">
</td>
</tr>
<tr bgcolor="#ffffff">
<td colspan="4" align="center" class="f2"><input type="text" name="FIO" tabindex="7" data-validator="required" title="Ф.И.О." onChange="mirror(this)" style="width:100%;"><br><input type="text" name="address" tabindex="8" title="адрес" onChange="mirror(this)" style="width:100%;" data-validator=""><br><font size="1">плательщик  (ФИО, адрес)</font>
</td>
</tr>
<tr bgcolor="#ffffff">
<td colspan="2" width="50%" align="center" class="f2">Вид платежа</td>
<td width="25%" align="center" class="f2">Дата</td>
<td width="25%" align="center" class="f2">Сумма</td>
</tr>
<tr bgcolor="#ffffff">
<td colspan="2" align="center"><textarea rows="2" name="details" tabindex="9" data-validator="required" title="Вид платежа" onChange="mirror(this)" wrap="virtual" style="width:160px;"></textarea></td>
<td align="center">&nbsp;</td>
<td align="center" class="f2"> <input style="width:70px;" type="text" name="sum" tabindex="10" data-validator="required" title="сумма" onChange="mirror(this)"></td>
</tr>
<tr bgcolor="#ffffff">
<td colspan="2" rowspan="2" align="left" class="f2">Плательщик:</td>
<td align="center"><span class="f1">Пеня:</span></td>
<td align="center"><br></td>
</tr>
<tr align="center" bgcolor="#ffffff">
<td><span class="f1">Всего:</span></td>
<td><br></td>
</tr>
</tbody></table>
</td></tr></tbody></table>
        </td>
</tr>
<tr>
        <td valign="top" width="200" align="right" bgcolor="#ffffff" height="255"><br><br><font size="2"><p>Квитанция</p><br><br><br><br><br><br><br><br><br><br><br>
        <font size="1"><p>Кассир</p></font></font></td>
             <td valign="middle" width="370" align="right" bgcolor="#ffffff" height="255">
<table width="100%"><tbody><tr><td align="center">
    <font size="-1">
    ИНН <span id="INN"></span> КПП <span id="KPP"></span>
    <br><u><span id="recipient"></span>
    </u><br><font size="1">получатель платежа</font>
</font></td></tr>
</tbody></table>

<table width="100%" bgcolor="#000000" border="0" cellpadding="0" cellspacing="0">
<tbody><tr><td bgcolor="#000000">
<table width="100%" border="1" cellpadding="3" cellspacing="0">

<tbody><tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center"><font size="2">Расчетный&nbsp;счет&nbsp;№:&nbsp;<span id="settlement_account"></span>&nbsp;БИК:&nbsp;<span id="BIK"></span></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" valign="center" align="center" height="10"><font size="2">Кор. сч.: <span id="loro_account"></span></font></td></tr>
<tr bgcolor="#ffffff"><td colspan="4" align="center"><font size="2"><span id="FIO"></span>,<br><span id="address"></span><br><font size="1">плательщик  (ФИО, адрес)</font></font></td></tr>
<tr bgcolor="#ffffff">
    <td colspan="2" width="50%" align="center"><font size="2">Вид платежа</font></td>
    <td width="25%" align="center"><font size="2">Дата</font></td>
    <td width="25%" align="center"><font size="2">Сумма</font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" align="center"><font size="1"><span id="details">&nbsp;</span></font></td>
    <td align="center">&nbsp;</td>
    <td align="center"><font size="2"> <span id="sum">&nbsp;</span></font></td>
</tr>
<tr bgcolor="#ffffff">
    <td colspan="2" rowspan="2" align="left"><font size="2">Плательщик:</font></td>
    <td align="center"><font size="1">Пеня:</font></td>
    <td align="center"><br></td>
</tr>
<tr align="center" bgcolor="#ffffff">
    <td><font size="1">Всего:</font></td>
    <td><br></td>
</tr>
                </tbody></table>
</td></tr></tbody></table>



        </td>
</tr>


</tbody></table>

</td></tr></tbody></table>
<hr size="1" width="570" noshade="noshade">
<div id="errors">
<font color="red">Возможны ошибки!!!</font> <br>
</div>
<input type="button" value="проверить правильность" onClick="validate()" tabindex="11" id="validation">
<input type="button" value="нет, я уверен" onClick="printer()" style="display:none;" tabindex="12" id="printer">
</center>
</body>
</html>
Uncaught TypeError: Изображение

Изображение
Аватара пользователя
Padonak
Философ-разговорник
 
Сообщения: 3872
Зарегистрирован: Вт дек 13, 2005 3:23
Откуда: Ростов-на-Дону


Вернуться в Архив

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

cron