Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > модернизировать код


Автор: Samotnik 1.11.2007, 14:24
есть код
Код

<jsp:root version="2.0"
          xmlns:jsp="http://java.sun.com/JSP/Page"
          xmlns:c="http://java.sun.com/jsp/jstl/core">

    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:output doctype-root-element="html"
                doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
                doctype-system="http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        
        <title>Calculator</title>
    </head>
    <body bgcolor="pink">
      
    <form name="indicator" action="calculatorServlet" method="POST">
        <input type="hidden" name="cmd" value='0'/>
        <input type="text" name="value" value="${result}"/><br></br>
        <input type="submit" value="Remember"/>
    </form>

    <form name="operation" action="calculatorServlet" method="POST">
        <input type="hidden" name="cmd" value='1'/>
        <input type="hidden" name="value" value=' '/>
        <input type="submit" value="=" onclick="document.operation.value.value= '='; "/><br></br>
        <input type="submit" value="-" onclick="document.operation.value.value= '-'; "/><br></br>
        <input type="submit" value="+" onclick="document.operation.value.value= '+'; "/><br></br>
        <input type="submit" value="/" onclick="document.operation.value.value= '/'; "/><br></br>
        <input type="submit" value="*" onclick="document.operation.value.value= '*'; "/><br></br>
    </form>

    </body>
    </html>
</jsp:root>

желательно сделать как можно меньше строчек кода!!!  Помогите плз

Автор: GIK 1.11.2007, 14:40
куда меньше-то?  smile 

Автор: Samotnik 1.11.2007, 14:47
ну к примеру что бы постоянно не писать  
document.operation....

Автор: SelenIT 1.11.2007, 14:55
Зачем вообще там javascript? Разве JSP не позволяет сделать просто что-то вроде следующего?
Код

    <form name="operation" action="calculatorServlet" method="POST">
        <input type="hidden" name="cmd" value='1'/>
        <input type="submit" name="value" value="="/><br></br>
        <input type="submit" name="value" value="-"/><br></br>
        <input type="submit" name="value" value="+"/><br></br>
        <input type="submit" name="value" value="/"/><br></br>
        <input type="submit" name="value" value="*"/><br></br>
    </form>

Автор: Samotnik 1.11.2007, 14:59
дык, нет, мне же нужно как то значение кнопки считать...
Вобщем, можно ли то, что я скинул сразу, оптимизировать или нет??
Пэ.Эс.
Я знаю, что можно.  Т.к. это мое задание (модернизировать) )))))

Автор: SelenIT 1.11.2007, 15:10
Samotnik, зачем его "считывать"? В том варианте, что я предложил, оно придет при сабмите автоматически - серверной стороне-то без разницы, какого типа было поле value в форме, ей важно значение получить. Так что работать это будет идентично исходному варианту (с той разницей, что работоспособность будет сохраняться и при отключенном JS;).

Автор: Samotnik 1.11.2007, 15:14
SelenIT,  Ну хорошо!!  Допустим так и есть. Но у меня задание  сделать использую JavaScript !!!!   Я его выполнил, оно идеально работает, НО  ток что сказали, что можно выражение
Код

document.operation.value.value= '='; "

Заменить одним методом!!!  И не писать по сто раз эту длинную фразу. Так вот я и интересуюсь, как можно и каким образом ее заменить ?????  Как написать эту функцию?

Автор: SelenIT 1.11.2007, 15:28
Во-первых, можно заменить document.operation на this.form (оно, имхо, еще и понадежней будет). Во-вторых, можно убрать onclick-и у кнопок, а в сам form поставить
Код

... onclick="var t=event.target||event.srcElement;if(t.type&&t.type=='submit')this.value.value=t.value" ...


Цитата(Samotnik @  1.11.2007,  15:14 Найти цитируемый пост)
у меня задание  сделать использую JavaScript !!!!

...так может, это подразумевало "без перезагрузки страницы"?

Автор: Samotnik 1.11.2007, 15:34
SelenIT,  спс, НО  сказали что  нужна функция вместо
Код

onclick="document.operation.value.value= '='; "

и все тут  smile !  
Т.е. на каждый 
Код

<input type="submit" value="="

вызывать строку. Ведь она везде ОДНА И ТА ЖЕ. А значит ее можно заменить одной функцией и не писать по сто раз одно и тоже !!!

Автор: SelenIT 1.11.2007, 15:41
Samotnik, заменить на функцию - это, имхо, шило на мыло, а не оптимизация. Все равно придется писать в каждом onclick-е одно и то же, плюс еще саму функцию (из одной строчки) описывать. Чем не устраивает вариант c единственным oncick-ом на <form> (перехват события при его "всплытии")?

Автор: ksnk 1.11.2007, 16:45
Цитата(Samotnik @  1.11.2007,  15:34 Найти цитируемый пост)
НО  сказали что  нужна функция

Код

function button_click(e) {
   if (e && e.form) e.form.value.value=this.value
}


Код

    <form name="operation" action="calculatorServlet" method="POST">
        <input type="hidden" name="cmd" value='1'/>
        <input type="hidden" name="value" value=' '/>
        <input type="submit" value="=" onclick="button_click(this);"/><br></br>
        <input type="submit" value="-" onclick="button_click(this); "/><br></br>
        <input type="submit" value="+" onclick="button_click(this);"/><br></br>
        <input type="submit" value="/" onclick="button_click(this);"/><br></br>
        <input type="submit" value="*" onclick="button_click(this);"/><br></br>
    </form>


Так, что-ли?

Автор: SelenIT 1.11.2007, 17:01
smile все равно странные представления об оптимизации JS у начальства. Живем в эпоху сверхдинамизма, множественных addEventListener-ов и т.п., а тут человека заставляют заниматься копипастом inrinsic-обработчиков и громоздить глобальные функции для задачи, в которой JS по сути вообще не нужен. Начальству, конечно, виднее, но... неправильно это, имхо.

Автор: Samotnik 2.11.2007, 12:47
ksnk,  не работает, не считает   smile

Добавлено через 5 минут и 17 секунд
Starikan, 
Цитата(Starikan @  1.11.2007,  23:16 Найти цитируемый пост)
почему бы не использовать систему создания динамических input для оптимизации протокольного подключения кодека к системе обработки кодов на сайте

 smile   Ты это сейчас вообще про что сказал??  

Автор: dsCode 2.11.2007, 13:04
Samotnik, можно и так: smile
Код

<script stype="text/javascript">
function appendButtons() {
  var signs = ['+', '-', '=', '/', '*'];
  for (var k = 0; k < signs.length; k++) {
    var button = '<input type="submit" value="' + signs[k] + '" onclick="document.operation.value.value=\'' + signs[k] + '\'" />';
    document.forms['operation'].innerHTML += button + '<br />';
}
</script>

<body onload="appendButtons(); return true;">
...


Но это все, на самом деле, извраты и я бы задумался, действительно ли от меня хотят оптимизации или просто не хотят брать на работу и придумывают "интересные" задания, чтобы потом сказать "нет, надо было через функцию потоков виртуальной памяти ввода-вывода через библиотеки DLL при объектно-ориентированном подходе (С) - приблизительная цитата одного из участников форума =))". Так что, прочтите еще раз пост SelenIT'a и подумайте об этом =)

Автор: Samotnik 2.11.2007, 13:15
Цитата(dsCode @  2.11.2007,  13:04 Найти цитируемый пост)
Так что, прочтите еще раз пост SelenIT'a и подумайте об этом =)

И от того, ечли я подумаю что-то измениться??  Это ведь не моя прихоть. Я же говорил, то что я сделал, все работает!!!   Но нужно сделать через функцию, вот к примеру  ksnk,  сделал именно то, что от меня и требуется, но единственный недочет, то что калькулятор мой не считает!!!  Именно  "равно" не работает!  А все операции работают превосходно !!

Автор: dstorm81 2.11.2007, 13:25
1
<br></br> - что это такое
если нужен один перенос то
<br />
2

Код

<jsp:root version="2.0"
          xmlns:jsp="http://java.sun.com/JSP/Page"
          xmlns:c="http://java.sun.com/jsp/jstl/core">

    <jsp:directive.page contentType="text/html;charset=UTF-8"/>
    <jsp:output doctype-root-element="html"
                doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
                doctype-system="http://www.w3c.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        
        <title>Calculator</title>
    </head>
    <body bgcolor="pink">
      
    <form name="indicator" action="calculatorServlet" method="POST">
        <input type="hidden" name="cmd" value='0'/>
        <input type="text" name="value" value="${result}"/><br></br>
        <input type="submit" value="Remember"/>
    </form>

   <script>
var make=function(p)
{document.forms['operation'].value.value=p.value;}
</script>
 <form name="operation" action="calculatorServlet" method="post" />
        <input type="hidden" name="cmd" value='11'/>
        <input type="text" name="value" value=' '/>
        <input type="submit" onclick="make(this)" value="=" /><br />
        <input type="submit" onclick="make(this)" value="-" /><br />
        <input type="submit" onclick="make(this)" value="+" /><br />
        <input type="submit" onclick="make(this)" value="/" /><br />
        <input type="submit" onclick="make(this)" value="*" /><br />
    </form>
    </body>
    </html>
</jsp:root>



у меня вопрос а что для субмитов имена не нужны?

Автор: dsCode 2.11.2007, 13:45
Samotnik, 
Цитата(Samotnik @  2.11.2007,  13:15 Найти цитируемый пост)
вот к примеру  ksnk,  сделал именно то, что от меня и требуется

ну а какая разница - все равно одна и та же строка пишется 5 раз (button_click(this);) =)  сейчас к Вам и по этому поводу прикапаются - "а что, можно же заменить все это одной строкой?".

Автор: Samotnik 2.11.2007, 13:48
Цитата(dsCode @  2.11.2007,  13:45 Найти цитируемый пост)
а что, можно же заменить все это одной строкой?

 smile 
Думаю, что так и будет  smile  

Автор: dsCode 2.11.2007, 14:10
Samotnik, ну вот в моем примере, можно сказать "одна строка" - там вообще динамически эти кнопки добавляются. Только какой в этом смысл? Не нужен здесь JS (опять же, ИМХО). Вы спросите начальство, что именно они хотят проверить у Вас? Знание JavaScript? Так есть и более интересные примеры, чем "сомнительная оптимизация".

Автор: Samotnik 2.11.2007, 14:16
dstorm81,  Вы  АФФИГЕННО  забожили!!  Мало того что работает, так  еще и ПРАВИЛЬНО  smile   
Большое всем спасибо за помощь!!
А  dsCode,   еще и за разговорчик  smile 
Пэ.Эс.

Цитата(dsCode @  2.11.2007,  14:10 Найти цитируемый пост)
Вы спросите начальство, что именно они хотят проверить у Вас? Знание JavaScript? Так есть и более интересные примеры, чем "сомнительная оптимизация". 

Оки спрошу ). но дело в том что JavaScript мне не особо нужен, я вообще на Java порграммлю, а сейчас аппликация нужна для работы в интернете, через .jspx страницы, написал, а тут он приходит и говорит,-  "А сделай ка мне через JavaScript" -  вот сижу и делаю  smile   
Еще раз всем спасибо
 

Автор: dsCode 2.11.2007, 14:35
Все равно тут оптимизации никакой =) Хоть 5 раз напиши "operation.value....", хоть 5 раз "make(this)", хоть 5 раз "button_click(this)". Еще и дополнительные вызовы функций. Но, главное, что начальство устроило smile

Автор: ksnk 2.11.2007, 15:43
Цитата(Samotnik @  2.11.2007,  12:47 Найти цитируемый пост)
ksnk,  не работает, не считает   

я потормозил...писал на коленке :(. Нужно писать вот так
Код

   if (e && e.form) e.form.value.value=е.value // а не THIS.VALUE...

Автор: SelenIT 4.11.2007, 02:07
Интереса ради попробовал я "добить" вариант без перезагрузки страницы, ориентируясь на поведение калькулятора из Windows в обычном режиме. Вот что получилось...
Код

<script>
function calculate(event) {
    var t=event.target||event.srcElement, // нажатая кнопка
    f=t.form,                             // объект формы, в его стат. свойствах хранятся промежут. значения
    operations = {                        // хеш функций, соответствующих операциям
        '+': function(x,y){return x*1+y*1},
        '-': function(x,y){return x-y},
        '*': function(x,y){return x*y},
        '/': function(x,y){return y==0 ? (x==0 ? 'Значение не определено' : 'Деление на нуль запрещено') : x/y}
    }
    // все действия только при нажатии кнопок
    if (t.type && t.type=='button') {
        // действия по нажатию кнопки "сброс" - очистить все
        if (t.value == 'C') {
            f.result.value = f.valueOne = f.valueTwo = f.nextAction = 0;
            f.mode = 'single';
        }
        // калькулятор работает только с числами в текст. поле, иначе отбой
        else if (isNaN(f.result.value)) return;
        // при нажатии кнопки арифм. действия:
        // если идет цепочка вычислений - вычислить промежуточное значение,
        // в любом случае - запомнить выбранное действие и первый операнд
        // переход в режим цепочки - при изменения текст. поля (по его событию onblur)
        else if (t.value != '=') {
            if (f.mode == 'chain' && f.nextAction) {
                f.result.value = f.nextAction(f.valueOne, f.result.value);
            }
            f.valueOne = f.result.value;
            f.nextAction = operations[t.value];
            f.mode = 'single';
        }
        // при нажатии кнопки "равно" и наличии последней операци в памяти:
        // если это первое нажатие - первый операнд из памяти, второй - текущее значение текст. поля;
        // для последующих запоминаем второй операнд, а первым станет новое текущее значение
        else if (f.mode && f.nextAction) {
            if (f.mode != 'repeat') {
                f.valueTwo = f.result.value;
                f.mode = 'repeat';
            }
            else f.valueOne = f.result.value;
            f.result.value = f.nextAction(f.valueOne, f.valueTwo);
        }
    }
}
</script>
<form action="#" method="POST" onclick="calculate(event)">
    <input type="text" name="result" value="0" onblur="this.form.mode = 'chain'" /><br />
    <input type="button" value="=" /><br />
    <input type="button" value="-" /><br />
    <input type="button" value="+" /><br />
    <input type="button" value="/" /><br />
    <input type="button" value="*" /><br />
    <input type="button" value="C" />
</form>

Возможно, "перемудрил"...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)