• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Как Выделить Все Checkbox Одним Кликом?

  • Автор темы BlackShadow
  • Дата начала
B

BlackShadow

Создаю чат. Там есть функция личных сообщений. Мне нужен код на яве (ну или на PHP в крайнем случае), который бы одним кликом выделял все чекбоксы рядом с сообщениями. Я бы и так нашел этот скрипт в гугле, если бы не одно "но".

Дело в том, что сообщения хранятся в двух таблицах мускула - inbox и outbox. Вытаскивать я их научился, но чтобы не париться с переменными, я сделал небольшую хитрую вещь, при которой происходит следующее:
PHP:
for ($ii=1; $ii<=$count; $ii++){
$nn = $ii-1;
$toUser = mysql_result($tableMail,$nn,"toUser");
if ($toUser == $log){
$id = mysql_result($tableMail,$nn,"id");
$fromUser = mysql_result($tableMail,$nn,"fromUser");
$themeMess = mysql_result($tableMail,$nn,"themeMess");
$timeMess = mysql_result($tableMail,$nn,"timeMess");
$txtMess = mysql_result($tableMail,$nn,"txtMess");
$readable = mysql_result($tableMail,$nn,"readable");
if ($readable == 1){
$read = "Прочтено";
} else {
$read = "Не прочтено";
}
$sql = "UPDATE inbox SET readable='1' WHERE id='$id'";
$addData = mysql_query($sql);
$inboxStr .= "
<tr>
<td align=\"center\"><input type=\"checkbox\" name=\"mails[".$id."]\"></td>
<td>".$fromUser."</td>
<td>".$themeMess."</td>
<td>".$txtMess."</td>
<td align=\"center\" width=\"1%\">".$timeMess."</td>
<td align=\"center\" width=\"1%\">".$read."</td>
<td align=\"center\" width=\"1%\"><a href=\"mail.php?dir=write&toUser=".$fromUser."&themeMess=".$themeMess."\">Ответить</a></td>
</tr>
";
}
}

Если обратить внимание на эту строчку:
<td align=\"center\"><input type=\"checkbox\" name=\"mails[".$id."]\"></td>,
то можно заметить, что при отправке формы, мы получим в POST['mails'] массив, в котором будут наши сообщения. Таким образом, я и смогу их удалять. Но зато изменилось решение в JS-коде, который основывается вот на чем:
Код:
function sel_all(){
if(!document.form_name1.cheks) return;
if(!document.form_name1.cheks.length){
document.form_name1.cheks.checked = document.form_name1.cheks.checked ? false : true;
} else {
for(var i=0;i<document.form_name1.cheks.length;i++){
document.form_name1.cheks[i].checked = document.form_name1.cheks[i].checked ? false : true;
}
}

form_name1 - это название формы, а cheks - это значение, указываемое в input атрибута name. Но как мы видим из моего примера с массивом в атрибуте name, здесь данный скрипт работать не будет, потому что name у каждого объекта разное.

Вот тут и проблема: как мне обойти эту проблему и сделать так, чтобы сообщения выделялись?
 
A

acorn

jQuery не хочешь заюзать? ищешь все чекбоксы в диве и чекаешь. вот пример для prototype (это то, что было под рукой ;) ). в jQuery что-то похожее

Код:
			$('item-table').select('tbody tr td input').each(function (elem) {
elem.checked = true;
});
 
B

BlackShadow

ой.... так не хочется пока jquery заниматься.. Можно как нибудь через id? Или может всё-таки через name?
 
A

acorn

Грубо говоря алгоритм такой:
перебираешь все чекбоксы (лучше всего ограничить перебор таблицей или дивом) и чекаешь их. На голом JavaScript делается не так красиво, но и не сложно.. попробуй это:

Код:
<script language="JavaScript" type="text/JavaScript">
function CheckAll()
{
var i;
for(i=0; i<document.name.elements.length; i++)
{
if(document.name.check.checked==true)
{document.name.elements[i].checked=true;}
else {document.name.elements[i].checked=false;}
}
}
</script>

Добавлено: P.S. посмотрел твой код - такой же. Так в чем тогда проблема?
 
B

BlackShadow

Проблема в том, что атрибут name в input'е меняется и поэтому просто document.form.name_check.checked не отловить...

Кстати, вот мой ява:
Код:
function CheckAll(){
var i;
for(i=0; i<document.form["mails"].elements.length; i++){
if(document.form["mails"].check.checked==true){
document.form["mails"].elements[i].checked=true;
} else {
document.form["mails"].elements[i].checked=false;
}
}
}
</script>

А вот код на "кнопке":
Код:
<input type="checkbox" onClick="CheckAll()">

Но что-то не работает. Что подправить?

P.S.
<a href="#" onClick="java script:CheckAll()">Выделить всё</a> - тоже не помогло
 
B

BlackShadow

НАШЕЛ НАШЕЛ НАШЕЛ!!!

Скрипт выделения:
Код:
<script type="text/javascript">
function ckeck_uncheck_all() {
var frm = document.mails;
for (var i=0;i<frm.elements.length;i++) {
var elmnt = frm.elements[i];
if (elmnt.type=='checkbox') {
if(frm.master_box.checked == true){ elmnt.checked=false; }
else{ elmnt.checked=true; }
}
}
if(frm.master_box.checked == true){ frm.master_box.checked = false; }
else{ frm.master_box.checked = true; }
}
</script>

Кнопка выделения:
Код:
<input type="checkbox" onclick="java script:ckeck_uncheck_all()" title="Выбрать все" name="master_box">

При этом input'ы должны иметь вид:
Код:
<input type="checkbox" name="mails[]" value="1">


Спасибо большое за помощь;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!