Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Передача в функцию переменного количества аргументов (https://javascript.ru/forum/dom-window/15156-peredacha-v-funkciyu-peremennogo-kolichestva-argumentov.html)

Эдди 15.02.2011 10:29

Передача в функцию переменного количества аргументов
 
Подскажите, пожалуйста.

Количество аргументов, которые надо передать в функцию, изначально неизвестно. В php передаешь массив, и дело с концом.

Как в js это сделать, ума не приложу.

ПРИМЕР. Функция проверки полей формы на заполненность. Хочу передать в функцию поля, коорые проверять не нужно. В разных случаях количество этих полей разное.

help:)

walik 15.02.2011 10:57

Если я правильно понял то:

function myFunc(a, b, c, d) {
		alert(arguments.length);
	}
	
	myFunc(1, 2, 3);


С помощью arguments.length узнаешь сколько аргументов ей было передано и выполняешь необходимые действия.

kadabrik 15.02.2011 11:10

Цитата:

Сообщение от Эдди (Сообщение 92551)
Подскажите, пожалуйста.
В php передаешь массив, и дело с концом.
Как в js это сделать, ума не приложу.

На самом деле почти также - передать объект.

function foo(obj)
{
   alert((obj['width'])+' '+ (obj['height']));
}

var obj = new Object();
obj['width'] = 100;
obj['height'] = 120;
foo(obj);

ksa 15.02.2011 11:28

Цитата:

Сообщение от Эдди
Как в js это сделать, ума не приложу.

Просто почитай букварь...
http://javascript.ru/arguments

Эдди 15.02.2011 13:09

ksa Букварь прочитан. Ответ не найден.

walik И сколько мне указывать аргументов в функции?
Можно, конечно, с запасом написать 100 аргументов. Но криво это будет. Неправильно.

kadabrik А как на странице я буду вызывать скрипт. К примеру, если я хочу исключить поля с названиями subject и text?

Как потом аргументы обработать понятно. Вопрос, как передать туда аргументы...:blink:

Kolyaj 15.02.2011 13:12

Цитата:

Сообщение от Эдди
ksa Букварь прочитан. Ответ не найден.

Судя по вопросам, текст по ссылке вы не читали.

Эдди 15.02.2011 13:14

НУ перечту сейчас еще раз внимательнее...

ПРИНОШУ СВОИ ГЛУБОЧАЙШИЕ ИЗВИНЕНИЯ...
С этим все ясно. Вообще в функции не ставлю ни одного аргумента, а передаю, сколько захочу.

Попутный вопрос (уж извините новичка), чтобы не плодить темы.

Функция проверяет поля формы на заполненность. Если поле не заполнено, alert выводит оповещение.
Нажимаю ОК, в форме поля очищаются. Как этого избежать?

kadabrik 15.02.2011 13:26

Цитата:

Сообщение от Эдди (Сообщение 92576)
Функция проверяет поля формы на заполненность. Если поле не заполнено, alert выводит оповещение.
Нажимаю ОК, в форме поля очищаются. Как этого избежать?

Не очищать поля :D

Эдди 15.02.2011 13:27

Цитата:

Сообщение от kadabrik (Сообщение 92577)
Не очищать поля :D

:cray: Как? (плачу сильно)

walik 15.02.2011 13:40

<html>
<head>
	<script language="JavaScript">
	function check() {
		field1 = document.getElementById( "field1" );
		if (field1.value == '')
			alert('Не заполнено поле field1');
	}
</script>
</head>
<body>
<form name="form1" onsubmit="check(); return false;">
<input type="text" id="field1" /> <br />
<input type="text" id="field2" /> <br />
<input type="submit"/>
</form>
</body>
</html>


Вот появляется alert сообщение, поля не очищаются, в чем проблема ?

ksa 15.02.2011 14:05

Немного подкорректирую...

<html>
<head>
	<script language="JavaScript">
	function check() {
		field1 = document.getElementById( "field1" );
		if (field1.value == '') {
			alert('Не заполнено поле field1');
			return false;
		}
		return true;
	}
</script>
</head>
<body>
<form name="form1" onsubmit="return check();">
<input type="text" id="field1" /> <br />
<input type="text" id="field2" /> <br />
<input type="submit"/>
</form>
</body>
</html>


Иначе и форму не отправить... :)

Эдди 15.02.2011 14:29

Понятно, что есть в интернете куча решений. Но я просто хочу понять, что к чему. Потому сам изобретаю велосипед.

Вот здесь в чем ошибка, что поля очищаются?

function filled_form(current_form)
{
	for(var counter=0;counter<current_form.length;counter++)
	{
		if(!current_form[counter].value)
		{
			alert('Заполните обязательные поля!..');
			return;
		}
	}
}


Вызывается
<form name="my_form" onsubmit="filled_form(my_form)">

Kolyaj 15.02.2011 14:33

Эдди,
у вас страница перезагружается, а не поля очищаются.

Эдди 15.02.2011 14:35

Цитата:

Сообщение от Kolyaj (Сообщение 92594)
Эдди,
у вас страница перезагружается, а не поля очищаются.

Ну я и вижу. А почему?

Признаюсь честно. php моя стезя. javascript только по необходимости.
Хотя понял, что необходимость эта стала возникать все чаще.

walik 15.02.2011 14:38

<form name="my_form" onsubmit="*!*return*/!* filled_form(my_form)">


return добавьте перед именем функции.

alert('Заполните обязательные поля!..');
            return *!*false*/!*;


И false когда возвращаете.

Эдди 15.02.2011 14:43

[quote=walik;92597]
<form name="my_form" onsubmit="*!*return*/!* filled_form(my_form)">


Умирааааюююю... Идиотизм.

Ну с вашими ретурнами вообще копец.

Спасибо огроменное............:agree:

Кстати, я сделал по-другому. Правильно?
<form name="my_form" onsubmit="filled_form(my_form);return false">

ksa 15.02.2011 14:46

Цитата:

Сообщение от Эдди
А почему?

Потому как функция не останавливает передачу формы... См. мой вариант.
http://javascript.ru/forum/dom-windo...html#post92587

walik 15.02.2011 14:46

[quote=Эдди;92598]
Цитата:

Сообщение от walik (Сообщение 92597)
Кстати, я сделал по-другому. Правильно?
<form name="my_form" onsubmit="filled_form(my_form);return false">

Если не ошибаюсь, то в таком случае форма никогда не отправится.
Не зависимо что вернет функция: true или false

Эдди 15.02.2011 14:46

Спасибо всем большое. На phpclub с такими дебильными вопросами меня бы давно послали. Не говоря уже об обращениях на "Вы"...:)

Если позволите, тему позднее продолжу. Дальше будет проверка мейла и урла:)

ksa 15.02.2011 14:47

Цитата:

Сообщение от Эдди
Ну с вашими ретурнами вообще копец.

Не с нашими... А с вашими... :D

ksa 15.02.2011 14:47

Цитата:

Сообщение от Эдди
Кстати, я сделал по-другому. Правильно?
<form name="my_form" onsubmit="filled_form(my_form);return false">

Нет. Не правильно...
Так форма вообще никогда не отправится.

Эдди 15.02.2011 14:48

Да. В моем случае форма не пойдет на сервер. Меняю на return функция.

ksa 15.02.2011 14:48

Цитата:

Сообщение от Эдди
Дальше будет проверка мейла и урла

Тут поиском ищи. Были темы...

Эдди 15.02.2011 14:52

Цитата:

Сообщение от ksa (Сообщение 92605)
Тут поиском ищи. Были темы...

Да 100% были. Вот даже в топ 10 функций есть подобное тому,что выше. Даже красиво.
http://ir2.ru/javascript10.aspx

Попытаюсь поиском. Если нет, то уж не обессудьте, вас побеспокою.

Спасибо.

Эдди 15.02.2011 15:39

Окончательный вариант (без вас бы не справился):
function filled_form(current_form)
{
	for(var i=0;i<current_form.length;i++)
	{
		for(var j=1;j<arguments.length;j++)
		{
			if(current_form[i].name!=arguments[j].name)
			{
				if(!current_form[i].value)
				{
					alert('Заполните все обязательные поля!..');
					return false;
				}
			}
		}
	}
}


Вызов <form name="my_form" onsubmit="return filled_form(my_form,address), где со второго аргумента идут исключения (необязательные поля)

Переходим к проверке мейла:)

ksa 15.02.2011 16:03

Цитата:

Сообщение от Эдди
Переходим к проверке мейла

Читай...

Эдди 15.02.2011 16:13

Цитата:

Сообщение от ksa (Сообщение 92615)

Тем и занимаюсь.
Только вот это, без регулярных выражений, не извращение?:-E
function check_mail(value)
{
valid_chars  ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
valid_chars += "1234567890"; 
valid_chars += "-@_."; 
str=document.form[0].email.value; 
valid_string = true; 
    for(i=0; i < str.length; i++ ) 
     { 
       current_valid_char = false; 
       for(j=0; j < valid_chars.length; j++) 
         { 
           if(str.charAt(i) == valid_chars.charAt(j)) 
             { 
               current_valid_char = true; 
             } 
         } 
       if(current_valid_char == false) 
         { 
          valid_string = false; 
         } 
     } 
     return valid_string; 
   } 
else 
{ 
    return false; 
}


Лучше так или с рег?

B~Vladi 15.02.2011 16:28

Цитата:

Сообщение от Эдди
не извращение?

Извращение.

ksa 15.02.2011 16:28

Цитата:

Сообщение от Эдди
не извращение?

Оно. :D

Эдди 15.02.2011 16:41

Цитата:

Сообщение от ksa (Сообщение 92620)
Оно. :D

А строку регулярного выражения (кстати, я твою тоже нашел на этом форуме) свежую можно привести? Или посоветуешь изучить сначала досконально все, и самому сделать?

Это свежо? (твоя,между прочим)
^[-._a-z0-9]+@(?:[a-z0-9][-a-z0-9]+\.)+[a-z]{2,6}$

ksa 15.02.2011 16:50

Цитата:

Сообщение от Эдди
твоя,между прочим

Я там писал что она благополучно стыбжена мной с просторов инета... :) Даже ссылку давал на то место.

ksa 15.02.2011 16:56

Эдди, даже если будешь использовать

/[\s\S]+@([\s\S]+\.)+[\s\S]{2,6}$/


Это все равно будет лучше твоего скрипта. ;)

Изучить оно конечно нужно обязательно, если собираешся этим заниматься. Но там книжка в 600 страниц про регулярные выражения. :D

x-yuri 16.02.2011 14:18

Цитата:

Сообщение от Эдди
Переходим к проверке мейла

http://javascript.ru/forum/55285-post3.html

Цитата:

Сообщение от ksa
Но там книжка в 600 страниц про регулярные выражения.

нет в них ничего сложного. Не знаю, если честно, что в той книжке, но если там действительно так много информации - она не для повседневного использования

ksa 16.02.2011 14:44

Цитата:

Сообщение от x-yuri
нет в них ничего сложного.

Разумеется что практика и примеры сделают своё доброе дело. :)

serega_dgl 09.11.2018 14:57

Цитата:

Сообщение от ksas (Сообщение 925534)
Прочитайте обсуждение данной темы...
http://javascript.ru/arguments

Как вариант можно сделать так
function manyArgs() {
for (var i = 0; i < arguments.length; ++i)
alert(arguments[i]);
}

Dilettante_Pro 09.11.2018 15:25

serega_dgl,
Имеет смысл внимательно читать посты в теме
Например, Пост#25


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