Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   По событию OnClick не вызывается обработчик на Javascript (https://javascript.ru/forum/events/56727-po-sobytiyu-onclick-ne-vyzyvaetsya-obrabotchik-na-javascript.html)

Fotinia 01.07.2015 13:45

По событию OnClick не вызывается обработчик на Javascript
 
Здравсивуйте. Помогите, пожалуйста, разобраться в проблеме. При нажатии на кнопку button ее событие OnClisk не работает. Вот ссылка на

Чтобы перейти к проблемной кнопке нужно выбрать в меню Тест1, ариает1 и нажать самую первую кнопку проверить. В поле ввода должны появиться 111. Если кто-то поможет буду очень благодарна, так как уже очень долго не могу понять в чем дело.
http://javascript.ru/forum/images/smilies/cray.gif

laimas 01.07.2015 14:26

Вы в функцию передаете не объекты, а строку, а в самой функции пытаетесь работать с ней как с объектом.

PS. И выбросьте xmlns="http://www.w3.org/1999/xhtml" из тега html, хотя бы пока не разберетесь что это, как это, и зачем нужно, и нужно ли.

Fotinia 01.07.2015 14:50

Пожалуйста, помогите исправить. В отдельном файле, созданном для проверки рабоет, а как вставляю в большой файл в таблице, то нет. Здесь работает как надо
<!DOCTYPE html PUBLIC ">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

<script language="javascript">
// Проверка решения
function mark1(obj) {
var n=Number(obj.t1.value);
if (n==1)
obj.pic.src="ok.png"
else
obj.pic.src="no.png";
}

</script>

<title>qq</title>
</head>
<body>
<table>
<tr>
<td>
<form name="rez1">
<b>Ответ:</b>
<input name="t1" type="number" style="width: 40px" min="1" max="4" step="1" value="">
<img name="pic" src="bl.png" height="40px" width="40px">
<input name="r1" type="button" value=" Проверить " onClick="mark1(rez1)">&nbsp;&nbsp;&nbsp;&nbsp;
<? if ($Prv != 2 ) { ?>
<input type="button" value="Показать решение" onclick="show_hide('a1',this);">&nbsp;&nbsp;&nbsp; &nbsp; <?}?>
<input type="button" value=" Задать вопрос ">
</form>
</td>
</tr>

</table>

</body>
</html>

laimas 01.07.2015 16:02

Может все это выбросить? Что значит тест - результат решения формулы с введенными в поля значениями? Значит надо выполнять это в JS, то есть в функцию должна передаваться формула (или выбираться из ранее описанных), подставляться значения из полей и выводить результат выполнения.

Проглядел сначала, что rez1, это имя формы.

Fotinia 01.07.2015 16:27

По нажатию кнопки должна в форму выводиться картинка. Но этого не происходит

laimas 01.07.2015 16:54

Цитата:

Сообщение от Fotinia
нажатию кнопки должна в форму выводиться картинка.

В форму нельзя вывести картинку в буквальном смысле. Можете пояснить цель теста?

Deff 01.07.2015 17:21

И еще на странице нет кода для функции show_hide ()

Fotinia 01.07.2015 17:57

Цель теста: в теге
<input name="t1" type="number" style="width: 40px" min="1" max="4" step="1" value="">

нужно ввести число от 1 до 4.
Далее нажимаем кнопку Проверить:
<input name="r1" type="button" value=" Проверить " onClick="mark1(rz1)">

Если введено число 1, то должна выводиться каhтинка ok.png, иначе
картинка no.png в теге
<img name="pic" src="../img/bl.png" height="30px" width="30px">
Сначала установлена пустая картина bl.png. В зависимости от ввода картинка должна поменяться на галочку (если правильно) или крестик.
Пожалуйста, помогите решить эту задачу!!!

Fotinia 01.07.2015 18:00

Вот процедура на JS, но ничего не происходит
<script type="test/javascript" language="javascript">
function mark1(obj) {
var n=Number(obj.t1.value);
if (n==1)
obj.pic.src="ok.png"
else
obj.pic.src="no.png";
}
</script>

laimas 01.07.2015 18:09

Цитата:

Сообщение от Fotinia
нужно ввести число от 1 до 4.

Я не этого ожидал. У вас множество различных формул, а тест, это проверка ввода диапазона от 1 до 4, и для всех форм?

Насколько можно понять, в поле вводится вариант ответа, и да 1 - 4, но как быть с задачей 6, где нет вариантов? И кто решает что ответ верен - сервер после отправки формы или же клиент?

Fotinia 01.07.2015 18:24

Я ПОКА ХОЧУ ОТЛАДИТЬ ОТВЕТ НА ПЕРВЫЙ ВОПРОС, А ПОТОМ ПО АНАЛОГИИ ДАЛЬШЕ.

Fotinia 01.07.2015 18:28

И ЕЩЕ. Я НЕ ЗНАЮ, КТО ДОЛЖЕН РЕШАТЬ КЛИЕНТ ИЛИ СЕРВЕР. ВИДИМО МНЕ ВСЕ РАВНО. ЭТО ВАЖНО? МНЕ НУЖНО РЕШИТЬ ЗАДАЧИ И Я СДЕЛАЛА, КАК НАШЛА В КНИГЕ, НО НЕ РАБОТАЕТ

laimas 01.07.2015 18:34

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

Во-первых, у вас нет как таковой формы, а значит никакой отправки на сервер не будет.
Во-вторых, если будут форма, то щелчок по копке "Проверить" будет ее отправлять, а значит показывать/не показывать картинку будет решать сервер, а JS побоку.

То есть вы спрашиваете как сделать вышивку, но не поясняете вышивать крестиком или гладью.

Например, если проверка, это блокировка отправки формы при неверно указанном варианте, то тогда и .show() и .hide() для картинки, это забота клиента. Но вот смысл такого я лично не понимаю, так как всегда можно будет "достучаться" в конце концов до правильного ответа.

Если сервер проверяет, что логичнее при тесте, то проверяйте на сервере ответ, и задавайте соответствующий стиль display для изображения, в зависимости от ответа. А эту функцию и "клики" к ней выбросить.

PS. Опять не так - формы есть, но как все "упрятано" не сразу и найдешь. :) Поменьше бы TD и по больше других элементов, так, чтобы каждая задача вся была описана в одной ячейке.

Fotinia 01.07.2015 18:47

Вы меня простите, но я ничего не поняла, кроме того, что сделать нужно как то по другому. Еще раз повторяю задачу. Сначала есть рисунок, на котором ничего нет. В поле вводится ответ от 1 до 4. Если ответ верный, то пустая картинка заменяется на картинку с галочкой. Если неверный, то картинка с крестиком. Как это сделать, не понимаю. Пожалуйста, подскажите.

Fotinia 01.07.2015 18:50

А это разве не форма или нужна какаято еще
<form name"rz1">
<b>Ответ:</b>
<input name="t1" type="number" style="width: 40px" min="1" max="4" step="1" value="">
<img name="pic" src="../img/ok.png" height="30px" width="30px">
<input name="r1" type="button" value=" Проверить " onClick="mark1(rz1)">
<? if ($Prv != 2 ) { ?>
<input type="button" value="Показать решение" onclick="show_hide('a1',this);"> <?}?>
<input type="button" value=" Задать вопрос ">
</form>

laimas 01.07.2015 18:50

Цитата:

Сообщение от Fotinia
Я НЕ ЗНАЮ, КТО ДОЛЖЕН РЕШАТЬ КЛИЕНТ ИЛИ СЕРВЕР. ВИДИМО МНЕ ВСЕ РАВНО. ЭТО ВАЖНО?

Ну это уж не мне решать. Цель теста какова - проверить знание? А если так, то как же такое можно проверять клиенту, ведь достаточно будет вводить от 1 до 4, пока не получим ОК. И в чем тогда смысл?

Если же тест как "проверь себя", то можно и на клиенте проверять, но тогда и подход иной должен быть. Достаточно в том же элементе, в который вводится вариант ответа в data-xxx, проверяя его с вводом. И функции не потребуется.

laimas 01.07.2015 18:52

Цитата:

Сообщение от Fotinia
А это разве не форма или нужна какаято еще

Нашел, код до того "заглубленный", что сразу и не найдешь.

Цитата:

Сообщение от Fotinia
Еще раз повторяю задачу. Сначала есть рисунок, на котором ничего нет. В поле вводится ответ от 1 до 4. Если ответ верный, то пустая картинка заменяется на картинку с галочкой. Если неверный, то картинка с крестиком.

Я уже написал выше, что все определяется цель теста. А какова она у вас я не знаю.

Fotinia 01.07.2015 19:03

Вложений: 1
Я не понимаю про какую цель вы спрашиваете. Мне нужно менять картинку в зависимости от введенного числа.
Если посмотреть более глобально, то есть тест. Его нужно решить и проверить ответы на сайте. В первом задании теста правильный ответ 1. Всего 4 варианта ответов. Нужно указать один из них.

laimas 01.07.2015 19:11

Цитата:

Сообщение от Fotinia
Я не понимаю про какую цель вы спрашиваете. Мне нужно менять картинку в зависимости от введенного числа.

Поясню на пальцах:

Вариант А) - цель теста, это проверка знаний. Как выполняется - форма должна быть одна, с одной кнопкой "Проверить" в конце всех задач. Испытуемый вводит варианты ответов на все задачи, жмет кнопку "Проверить". Сервер принимает форму, проверят варианты ответов, и в зависимости от них указывает стиль картинкам каждой задачи, и возвращает страницу клиенту с результатом проверки (теста).

Вариант Б) - цель теста "проверь себя". Как выполняется - сервер не при делах, его задача только отдавать клиенту страницы. На клиенте при вводе варианта ответа автоматом показывается результат теста. Форм и кнопок для этого совсем не нужно.

Так понятно?

Fotinia 01.07.2015 19:22

В тесте 4 задания, в которых нужно выбрать правильный вариант. Нужно сделать кнопку проверить для каждой задачи ОТДЕЛЬНО. Тестируемый сам решает какие задачи он будет решать и проверять ответ. Я много лет работаю репетиром и мне так нужно, да и не аналогичных ресурсах так делают. Отдельно проверка каждого вопроса.

Fotinia 01.07.2015 19:26

Вложений: 1
Посмотрите как работает вложение. Это все что мне нужно

laimas 01.07.2015 20:07

Вы знаете как передается форма? Это будет массив, ключами которого являются имена полей, а значениями их значения. То есть, испытуемый может и не вводить на какие либо задачи вариант ответа, а значит и сервер просто может не проверять такие задачи. Это к тому, что требование сделать кнопку проверить для каждой задачи ОТДЕЛЬНО не имеет под собой никакого оправдания, а только лишь неудобство для клиента.

Цитата:

Сообщение от Fotinia
В тесте 4 задания, в которых нужно выбрать правильный вариант.

Значит проверять нужно на сервере - отправляйте форму, проверяйте, что на сервере можно сделать очень просто - по ключу и индексам полей в который вводится вариант, в массиве, который содержит для каждого индекса этого ключа номер верного варианта. То есть сравнение принятого значения со со значением в массиве.

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

Я не работаю репетиром, но знаю, что ваш подход к тесту не верный.

Fotinia 01.07.2015 20:14

Причем здесь репетитор. Мне не понятно почему в маленьком файле работает как мне надо, а на сайте нет. Простите, за беспокойство. Но у меня не достаточно квалификации, чтобы понять то, что вы мне пишете. Если не можете помочь конкретно,давайте закончим беседу. А то вы мне объясняете как правильно тест делать, а меня вопрос программирование интересует. Я не знаю про какие массивы вы говорите.

Deff 01.07.2015 20:50

Fotinia,
Покажите инет версию тестовой страницы с проблемой

laimas 01.07.2015 20:51

<?php
//если пришла форма, проверка вариантов
//выбираем только те задачи, на которые есть варианты ответа
if($_POST AND $chk = array_diff(array_map('intval', $_POST['check1']), array(0))) {
    //если $chk не пустой, значит есть варианты ответов
    //массив правильных ответов, 
    //первичный клоюч массива определяет страницы с задачиами вариантов, то есть Вариант 1 и т.д.
    //номер страниц вариантов присоедняется к имени поля ввода варинта ответа
    //а индексы вложенных ключей равны индексам полей
    $checked = array(
        //правильные ответы для страницы "Варианты 1"
        'check1' => array(1=>2, 3, 3, 1 , 2, 4)         
    );
    //идентификатор ключа страницы
    $key = key($_POST);
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form method="post" autocomplete="off">
<div>
<p>Задача 1</p>
<?=$chk && array_key_exists(1, $chk) ? ($chk[1]==$checked[$key][1] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[1]" />
</div>
<div>
<p>Задача 2</p>
<?=$chk && array_key_exists(2, $chk) ? ($chk[2]==$checked[$key][2] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[2]" />
</div>
<div>
<p>Задача 3</p>
<?=$chk && array_key_exists(3, $chk) ? ($chk[3]==$checked[$key][3] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[3]" />
</div>
<div>
<p>Задача 4</p>
<?=$chk && array_key_exists(4, $chk) ? ($chk[4]==$checked[$key][4] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[4]" />
</div>
<div>
<p>Задача 5</p>
<?=$chk && array_key_exists(5, $chk) ? ($chk[5]==$checked[$key][5] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[5]" />
</div>
<div>
<p>Задача 6</p>
<?=$chk && array_key_exists(6, $chk) ? ($chk[6]==$checked[$key][6] ? '<p>Верно</p>' : '<p>Не верно</p>') : null?>
<input name="check1[6]" />
</div>
<br /><br />
<button>Проверить</button>
</form>
</body>
</html>


Загрузите на сервер этот пример под любым именем и выполните. Форма одна, но проверятся будут только те "задачи", на которые есть варианты ответов. Не нужно кучи форм!

Проверять должен сервер, а проверяется просто - по ключам и индексам. Какое отношение к этой проверке имеет JS?

Только содержимое таких страниц, сами задачи, нужно выводить в цикле и в нем же делать проверку, а не прописывать многократно код.

Все, более я не знаю как вам пояснить то, что вы не с того требуете результат - с клиента.

Fotinia 01.07.2015 23:13

Dell, вотссылка на страницу
http://mathforyou.ru/7klass/7klassDud.php?t1=1

Fotinia 01.07.2015 23:24

laimas, огромное спасибо за код. Это почто то, что мне нужно. А вы не можете показать, как вводить значение по нажатию кнопки ПРОВЕРИТЬ рядом с каждым полем ввода (только для одного варианта) и чтобы вместо ответа Приавильно, появилась картинка (любая) Я сама настрою нужную. Огромное спасибо за ответ!

laimas 02.07.2015 04:33

Цитата:

Сообщение от Fotinia
Я много лет работаю репетиром и мне так нужно, да и не аналогичных ресурсах так делают. Отдельно проверка каждого вопроса.

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

Вы ведь так и не сказали ни слова о целях этого теста, но много конкретики о кнопках, картинках и прочем, что без цели является чем-то оторванным от реалий.

Если бы я был репетитором, а это оплата моих услуг, а значит тест, это проверка знаний подопечных, а не запросы клиента в никуда, и проверяются знания исключительно сервером, то:

1) сервер имеет в базе таблицу задач, каждая из которых под уникальным идентификатором (номером), а также распределены, например, по разделам математики, по которым динамически строится меню выбора задач, и соответственно выводятся страницы этих задач

2) в базе также хранятся и данные моих подопечных, под уникальными идентификаторами

3) варианты ответов также запоминаются в базе, в таблице теста, в которую пишутся - идентификатор отвечающего, идентификатор задачи, вариант ответа на задачу, дата и время ответа.

4) руки чешутся иметь у каждой задачи кнопку "Проверить", значит чтобы не бесить подопечных, делаем проверку ответа с использованием Ajax

5) результаты теста из таблицы тестов доступны для просмотра и мне, репетитору, и всем подопечным, с разницей в том, что я могу просматривать результаты всех и давать им оценку, а подопечные могут видеть только результаты своего теста.

И только после этого решаем вопросы вывода меню, страниц, кнопочек и плюшечек различных. Из этого и будут распределятся роли - от 1 до 5, это сервер, а клиентский JS только в 4, и только сделать асинхронный запрос по отправке варианта ответа, получить результат проверки и отобразить его.

У вас же все уперлось в кнопочки и картиночки, а что, зачем и почему не понятно. А на них можно дать 1000 и один вариант как сделать, но без гарантии того, что это в конечном итоге и нужно будет.


Часовой пояс GMT +3, время: 12:21.