|
|
|
| Создал опрос для голосований http://etph.org.ru/var/var2.php . Теперь нужно сделать так чтоб посетители отмечали только 3 chekboxs'a из 5 . Хочу сделать это на JavaScript'e, но не мыслю как сделать.
Приведу исходный код голосования:
<html>
<body BGCOLOR="#C1E7E7">
<table cellpadding="0" bgcolor="#C1E7E7">
<form action="/var/write.php" method="post">
<input type="hidden" name="name" value="var">
<colgroup align="right"></colgroup>
<colgroup></colgroup>
<tr>
<td>
<pre><font color="#0C5574" style="font-size:9px; font-family:Verdana">
Готовлюсь все отведенное
время и не успеваю: <input type="checkbox" name="vote[0]" value="1">
Успеваю за отведенное время
подготвиться к экзамену:<input type="checkbox" name="vote[1]" value="1">
Готовлюсь последние
один, два дня и сдаю: <input type="checkbox" name="vote[2]" value="1">
Готовлюсь последние один,
два дня и проваливаю: <input type="checkbox" name="vote[3]" value="1">
Сдаю экзамен за
дополнительную плату: <input type="checkbox" name="vote[4]" value="1">
</font> </pre>
</td>
</tr>
<tr>
<td align="center">
<input type="submit" value="Голосовать">
</td>
</tr>
</form>
</table>
</body>
</html>
|
Как видно подсчет результата выполняется на php.
Большая просьба помочь! Заранее благодарствую. | |
|
|
|
|
|
|
|
для: major2
(20.05.2007 в 15:51)
| | А интересно как из этих пяти вопросов, можно получить сразу три возможных ответа?
Готовлюсь все отведенное время и не успеваю
Успеваю за отведенное время подготвиться к экзамену
Готовлюсь последние один, два дня и сдаю
Готовлюсь последние один, два дня и проваливаю
Сдаю экзамен за дополнительную плату | |
|
|
|
|
|
|
|
для: major2
(20.05.2007 в 15:51)
| | 1. Поименуйте форму, вот так:
<form action="/var/write.php" method="post" name="myForm">
|
2. Между <head> и </head> поместите скриптовой блок:
<script>
function funcClick ()
{
for (var R = 0, x = document.forms.myForm, j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox' && x.elements [j].checked) R++;
if (R == 3) for (j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox' && !x.elements [j].checked) x.elements [j].disabled = 1;
else for (j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox') x.elements [j].disabled = 0;
}
</script>
|
3. На каждый чекбокс повесьте вызов этой функции через таймер, вот так:
<input type="checkbox" name="vote[0]" value="1" onclick="setTimeout (funcClick, 0)">
| Примечание: для MSIE достаточным будет повесить вызов функции один раз - на сам тег <form> | |
|
|
|
|
|
|
|
для: CNT
(20.05.2007 в 17:35)
| | Беспорно, техническое решение этого вопроса возможно. Интересно другое, допускается выбор одновременно трех ответов из пяти. Тогда из пяти вопросов я выберу, например, так:
Готовлюсь все отведенное время и не успеваю
Успеваю за отведенное время подготвиться к экзамену
Готовлюсь последние один, два дня и сдаю
Готовлюсь последние один, два дня и проваливаю
Сдаю экзамен за дополнительную плату
Вопрос - получится ли однозначный ответ на вопрос? | |
|
|
|
|
|
|
|
для: CNT
(20.05.2007 в 17:35)
| | CNT, спасибо Вам за помощь. Но предложенный код ни как не функционирует. | |
|
|
|
|
|
|
|
для: major2
(21.05.2007 в 02:41)
| | Сорри, случайно опустил две фигурные скобки в своём варианте (после if (R == 3) следовало их поставить).
Давайте, раз уж тут пошла мода "портянки развешивать", и я дам полный код (у меня он работает в MSIE6, OPERA8.5, FF2):
<html><head><script>
function funcClick ()
{
for (var R = 0, x = document.forms.myForm, j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox' && x.elements [j].checked) R++;
if (R == 3) {for (j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox' && !x.elements [j].checked) x.elements [j].disabled = 1}
else for (j = 0; j < x.elements.length; j++)
if (x.elements [j].type == 'checkbox') x.elements [j].disabled = 0;
}
</script></head>
<body BGCOLOR="#C1E7E7">
<table cellpadding="0" bgcolor="#C1E7E7">
<form action="/var/write.php" method="post" name="myForm">
<input type="hidden" name="name" value="var">
<colgroup align="right"></colgroup>
<colgroup></colgroup>
<tr>
<td>
<pre><font color="#0C5574" style="font-size:9px; font-family:Verdana">
Готовлюсь все отведенное
время и не успеваю: <input type="checkbox" name="vote[0]" value="1" onclick="setTimeout (funcClick, 0)">
Успеваю за отведенное время
подготвиться к экзамену:<input type="checkbox" name="vote[1]" value="1" onclick="setTimeout (funcClick, 0)">
Готовлюсь последние
один, два дня и сдаю: <input type="checkbox" name="vote[2]" value="1" onclick="setTimeout (funcClick, 0)">
Готовлюсь последние один,
два дня и проваливаю: <input type="checkbox" name="vote[3]" value="1" onclick="setTimeout (funcClick, 0)">
Сдаю экзамен за
дополнительную плату: <input type="checkbox" name="vote[4]" value="1" onclick="setTimeout (funcClick, 0)">
</font> </pre>
</td>
</tr>
<tr>
<td align="center">
<input type="submit" value="Голосовать">
</td>
</tr>
</form>
</table>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: CNT
(21.05.2007 в 11:47)
| | CNT еще раз благодарю! Код отлично работает!
Спасибо все за помощь! | |
|
|
|
|
|
|
|
для: major2
(20.05.2007 в 15:51)
| | Всегда должна быть альтернатива :-) Все инпуты, являющиеся чекбоксами, называем одинаковыми именами:
<input type="checkbox" name="vote" value="1" />
| и записываем скрипт в области <head> (которую надо обязательно создать):
<script type="text/javascript">
(d=document).onclick=function checkselect(evt)
{
evt=evt||event;
if((checkObj=d.all?evt.srcElement:evt.target).tagName!='INPUT')return;
if(checkObj.name!='vote')return;
else{
for(var i=0,check=d.getElementsByName(checkObj.name),checksum=0;i<check.length;i++)
if(check[i].checked)checksum+=1;else check[i].disabled=false;
if(checksum=='3')for(var i=0;i<check.length;i++)if(!check[i].checked)check[i].disabled=true;
}
}
</script>
|
| |
|
|
|
|
|
|
|
для: ilyaILF
(20.05.2007 в 20:32)
| | :)) Ой, мне так охота узнать у автора поста - какую статистику он хочет получить? Я, например, посещая такую страницу, думал бы только об одном варианте ответа - из эти вопросов даже и два непротиворечевых ответа может никак не получится, не то что три.
А если ответ один - значит радиокнопки, с возможностью только одного выбора. Ну ежели Всегда должна быть альтернатива :-) , тогда да - это либо ЗАНИМАТЕЛЬНАЯ, либо ГЕНИАЛЬНАЯ статистика!!! )) | |
|
|
|
|
|
|
|
для: sim5
(20.05.2007 в 21:05)
| | Тьфу!!! Я ошибся. Пользователям разрешено выбрать не больше 3-х вариантов ответа.
Прошу прощения у тех кто наверстал код с условием "только 3 ответа".
Просьба дать код на условие "не больше 3-х вариантов". То есть если пользователь указал 4 или 5 ответа, то выдать ему сообщение, например "Пожалуйста укажите не больше 3-х вариантов". А если иначе 1, 2 или 3, то отправлять данные.
А лучше как во втором предложенном коде. То есть пользователь тыкает 1, 2, 3 варианты , и вдруг все остальные два варианта замораживаются. Этот код я пробывал, но почему-то после указанных трех ответов в результате в статистике оказывается только один.
Спасибо. | |
|
|
|
|
|
|
|
для: major2
(21.05.2007 в 01:16)
| | Вы можете мне дать ответ, я ведь могу быть вашим потенциальным посетителем? Если упростить "левую" часть выражения, то можно все првести к такому виду (мне кажется это равнозначно вашему опросу). И так, я на странице вижу вопрос, например, "Вы готовите домашнее задание?" и пять вариантов ответа на него:
1. Не успеваю
2. Готовлю
3. Не готовлю
4. Когда как
5. За меня их готовят папа и мама
Мне предлагают выбрать три варианта и я выбираю, например: 2, 3 и 5. Вы получаете три варианта ответа - к какому выводу вы придете? Готовлю все таки или нет я домашнее задание, или я неуч и лучше бы папа порол меня? Вам подсказали уже два варианта технического решения, а мне (если это возможно) интересно было бы узнать смысл такого опроса. Не усну я сегодня...)) | |
|
|
|
|
|
|
|
для: sim5
(21.05.2007 в 01:30)
| | Постараюсь Вам толково ответить.
Варианты ответов подобраны с учетом того, что к разным экзаменам человек может подготовиться и сдать по совершено разному в силу каких либо обстоятельств.
То есть допустим к экзамену по МатАну я готовился все отведенное время и успел. В другой раз ботал все отведенное время физику и не успел. Затем был экзамен по информатике, к ней я готовился два дня и сдал.
Тогда встретив такой опрос в инете начну вспоминать, как у меня проходила сессия. И отвечу соответственно:
Готовлюсь все отведенное время и не успеваю (в случае с физикой)
Успеваю за отведенное время подготвиться к экзамену (в случае с Матаном)
Готовлюсь последние один, два дня и сдаю (в случае с инфой)
Конечно экзаменов у меня было больше и сдавал их различно, тогда я захочу возможно отметить другие вариант, но автор ограничил меня только тремя вариантами.
P.s.: Я не автор этого опроса, меня попросил мой преподаватель по физике смастерить эту голосовалку, чтоб он мог разместить её у себя на сайте. Ответы придумал он. Поэтому может быть я и сам не понимаю какой-то тонкости этого опроса. Во всяком случае можно узнать у него. | |
|
|
|
|
|
|
|
для: major2
(21.05.2007 в 02:06)
| | Достаточно, если учесть ваши дополнения в скобках, тогда это возможно, а вот изюминку учителя физики мне не осилить... зато я усну.)) | |
|
|
|
|
|
|
|
для: sim5
(21.05.2007 в 02:13)
| | Спокойного сна...
P.s.: А я вот еще долго не усну. Коды ведь нормально не работают, а сам не черта не соображаю в JS. | |
|
|
|
|
|
|
|
для: ilyaILF
(20.05.2007 в 20:32)
| | ilyaILF , ваш код отлично сработал на блокирование больше трех ответов. А вот с отправкой трех ответов не справился. Так как при отправке голосов очень важно имя инпута для правильной обработки php скрипта на сервере, а вы им почему-то пренебрегли. Поэтому отправляется только один голос. Я пробывал чтоб все имена были разными, как того требует php скрипт, то есть name="vote[0]" , name="vote[1]" и тд . Но блокировки вариантов больше трех не оказалось.
Прошу еще раз помочь. Огромное списибо за помощь. | |
|
|
|
|
|
|
|
для: major2
(21.05.2007 в 02:36)
| | Рабочий вариант вашей задачи:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script type="text/javascript">
(d=document).onclick=function checkselect(evt)
{
evt=evt||event;
if((checkObj=d.all?evt.srcElement:evt.target).tagName!='INPUT')return;
if(checkObj.name!='vote[]')return;
else{
for(var i=0,check=d.getElementsByName(checkObj.name),checksum=0;i<check.length;i++)
if(check[i].checked)checksum+=1;else check[i].disabled=false;
if(checksum=='3')for(var i=0;i<check.length;i++)if(!check[i].checked)check[i].disabled=true;
}
}
</script>
</head>
<body BGCOLOR="#C1E7E7">
<form method="POST" action="var/write.php">
<input type="hidden" name="name" value="var" />
<input type="checkbox" name="vote[]" value="1" /> Готовлюсь все отведенное время и не успеваю.<br />
<input type="checkbox" name="vote[]" value="2" /> Успеваю за отведенное время подготовиться к экзамену.<br />
<input type="checkbox" name="vote[]" value="3" /> Готовлюсь последние один, два дня и сдаю.<br />
<input type="checkbox" name="vote[]" value="4" /> Готовлюсь последние один, два дня и проваливаю.<br />
<input type="checkbox" name="vote[]" value="5" /> Сдаю экзамен за дополнительную плату.<br />
<input type="submit" value="Голосовать" />
</body>
</html>
| файл PHP должен располагаться во вложенной папке var/write.php:
<?
$variant=array("Готовлюсь все отведенное время и не успеваю.","Успеваю за отведенное время подготовиться к экзамену.","Готовлюсь последние один, два дня и сдаю.","Готовлюсь последние один, два дня и проваливаю.","Сдаю экзамен за дополнительную плату.");
$votes=$_POST["vote"];
for($i=0;$i<count($votes);$i++){
echo $variant[$votes[$i]-1]."<br />";
}
?>
| P.S. Как раз имена элементов и могут быть одинаковыми, потому как все-равно в результате получается индексированный массив значений, а вот значения (value) должны быть разными, иначе задача выбора разных результирующих величин теряет всяческий смысл.
У нас всегда все функционирует, и даже PHP! :-) | |
|
|
|
|
|
|
|
для: ilyaILF
(21.05.2007 в 05:12)
| | У меня есть свой php скрипт высчитывающий результат и записывающий в файл:
<?php
# Argon PHP-Voting 0.1 (write.php)
# Copyright 2004 Argon
# http://argon.com.ru/
extract($HTTP_POST_VARS);
extract($HTTP_GET_VARS);
# Не позволять повторно голосовать, в днях
$days=0;
if(isset($vote) and $name and !isset($HTTP_COOKIE_VARS['opros-'.$name]))
{
@$results=file($name.'.txt') or exit('<b>Неверное имя опроса.</b>');
$count=count($results);
for($n=0;$n<$count;$n++)
{
$temp= explode('¦',$results[$n]);
settype($temp[1],'int');
$vname[$n]=$temp[0];
$vnumb[$n]=$temp[1];
}
if(is_array($vote))
{
foreach($vote as $k=>$v)
{
$vnumb[$k]=$vnumb[$k]+1;
}
}
else
{
$vnumb[$vote]=$vnumb[$vote]+1;
}
$write='';
for($n=0;$n<$count;$n++)
{
$write=$write.$vname[$n].'¦'.$vnumb[$n]."\n";
}
$fp=fopen($name.'.txt','w');
fwrite($fp,$write);
fclose($fp);
setcookie('opros-'.$name,'1',time()+60*60*24*$days);
echo('<body bgcolor="#C1E7E7"><b>Ваш голос учтён.<b></body>');
# Чтобы не выводить результаты после голосования, поставьте # перед include...
include('echo.php');
}
elseif(isset($HTTP_COOKIE_VARS['opros-'.$name]))echo('<body bgcolor="#C1E7E7"><b>Вы уже отдали свой голос. Чтобы проголосовать снова, приходите через сутки. <a href="http://etph.org.ru/var/echo.php?name=var">Результаты</a></b></body>');
else echo('<body bgcolor="#C1E7E7"><b>Вы не проголосовали. Пожалуйста, <a href="http://etph.org.ru/var/var2.php">проголосуйте</a></b></body>');
?>
|
Я конечно не профи в php и javascripte, но понимаю, что для этого скрипта требуется различные имена итпутов. Если не прав поправте.
Вобщем, большая просьба написать на javascripte блокиратор больше трех вариант, да так чтобы результат удачно отпралялся и обрабатывался именно на этом php-скприпте.
Еще раз спасибо! | |
|
|
|
|
|
|
|
для: major2
(21.05.2007 в 09:10)
| | Я думаю, что править коды PHP смысла нет, тем более, что этот пример был скачан и представляет собой законченный програмный модуль, поэтому с минимальными изменениями оставляем вышеуказанный код javascript:
<script type="text/javascript">
(d=document).onclick=function checkselect(evt)
{
evt=evt||event;
if((checkObj=d.all?evt.srcElement:evt.target).tagName!='INPUT')return;
if(checkObj.type!='checkbox')return;
else{
for(var i=0,check=d.getElementsByTagName('INPUT'),checksum=0;i<check.length;i++)
if(check[i].checked)checksum+=1;else check[i].disabled=false;
if(checksum=='3')for(var i=0;i<check.length;i++)if(!check[i].checked)check[i].disabled=true;
}
}
</script>
| свои же параметры исходных файлов оставляете без изменений в первоначальном виде. | |
|
|
|
|
|
|
|
для: ilyaILF
(21.05.2007 в 11:36)
| | Спасибо, проверил на работоспособность ваш код. Но при определенном количестве выбранных галочек (кажется трех) блокируется сама кнопка "Голосовать". Но это уже не важно, так как удачно заработал код предложенный CNT.
Огромное спасибо за добросовестную помощь! | |
|
|
|