Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать аргумент функции, вызывающей событие из сценария 
:(
    Опции темы
Irokez
Дата 24.5.2005, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



к примеру я хочу элементу определить уже написанную функцию, тогда я делаю так:
Код

myelem.onClick = myfunc;

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

Это сообщение отредактировал(а) Irokez - 24.5.2005, 16:49
PM   Вверх
Aliance
Дата 24.5.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



А почему inline не пользуешься?
Да и каждому событию передается аргумент event...
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 24.5.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Irokez ты определись кто вызывает эту функцию smile Если ты сам, то передай параметры, если браузер(событие), то пиши вложенную функцию:

Код
myelem.onClick = function(e) {myfunc.call(this, e, myparam);};


Но лучше скажи что делать хочеш, кабы дров не наломал smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Irokez
Дата 24.5.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



Цитата(Aliance @ 24.5.2005, 16:59)
А почему inline не пользуешься?

потому что не умею smile можно пример?


Цитата(Sardar @ 24.5.2005, 18:29)
Но лучше скажи что делать хочеш, кабы дров не наломал smile

твой вариант кажется подойдет, а делаю я добавление полей в форме. При нажатии кнопки добавляется новое поле с кнопкой для удаления данного поля, вот у этой кнопки мне и надо было прописать событие. теперь наверное получится, спасибо
PM   Вверх
Aliance
Дата 24.5.2005, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Цитата(Irokez @ 24.5.2005, 20:48)
потому что не умею

Не верю smile
Код

<input type="button" onclick="alert('Это inline событие!')">


Irokez, а тебе собственно какой аргумент нужно было получить - this?
PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 24.5.2005, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



Цитата(Aliance @ 24.5.2005, 20:13)
Не верю smile

так это и есть inline smile и не знал, а можно поточнее определение?

Цитата(Aliance @ 24.5.2005, 20:13)
Irokez, а тебе собственно какой аргумент нужно было получить - this?

да, но не только его, хотел вообще узнать механизм, как передавать аргумент
PM   Вверх
Aliance
Дата 24.5.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



Irokez
Цитата(Irokez @ 24.5.2005, 21:18)
да, но не только его, хотел вообще узнать механизм, как передавать аргумент

пост Сардара разве тебе его не объяснил? =)

Цитата(Irokez @ 24.5.2005, 21:18)
так это и есть inline  и не знал, а можно поточнее определение?

Айда в тему про события smile там все-все написано :-)
PM MAIL WWW ICQ Skype   Вверх
Irokez
Дата 24.5.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



Цитата(Aliance @ 24.5.2005, 20:32)
пост Сардара разве тебе его не объяснил? =)

угу, объяснил конечно

Цитата(Aliance @ 24.5.2005, 20:32)
Айда в тему про события smile там все-все написано :-)

ок, спасибо smile
PM   Вверх
Sardar
Дата 24.5.2005, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



this ты и так получишь, т.к. обработчик события является свойством(методом) твоего обьекта. Впрочем это не верно для ИЕ::attachEvent.

Если хочешь понять механизм вложенных функций, читай: http://forum.vingrad.ru/index.php?showtopic=50738


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Irokez
Дата 25.5.2005, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



сдаюсь, прошу помощи:
Код

<html>
<head>
<title>*</title>
<script language="JavaScript" type="text/javascript">
var last_id = 0;
function addTel(div_id)
{
   
    var div = document.createElement('div');

    var space = document.createTextNode(' ');
    div.appendChild(space);
    
    var inp_num = document.createElement('input');
    inp_num.name = 'tel[]';
    inp_num.className = 'input-text-short';
    div.appendChild(inp_num);

    div.appendChild(space);
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Rem tel';
    btn.onclick = function() {
        var div = this.parentNode;
        div.parentNode.removeChild(div);
    }
    div.appendChild(btn);
    document.getElementById(div_id).appendChild(div);
}
function sayHi()
{
    alert('hi');
}
function addMan()
{
    last_id ++;
    var div = document.createElement('div');
    div.id = 'man_' + (last_id);
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Add tel';
    tels_id = 'tel_' + last_id;
    btn.onclick = function() {addTel.call(tels_id);}; //проблема тут, addTel не получает параметр
    div.appendChild(btn);
    
    var space = document.createTextNode(' ');
    div.appendChild(space);

    var inp_name = document.createElement('input');
    inp_name.className = 'input-text-long';
    div.appendChild(inp_name);

    var div_tels = document.createElement('div');
    div_tels.id = 'tel_' + (last_id);
    div.appendChild(div_tels);

    document.getElementById('test').appendChild(div);
}
</script>
</head>
<body>
<input type="button" onClick="addMan()" value="Add man">
<div id="test">
  <div id="man_0">
    <!-- эта кнопка работает, а последующие добавленные - нет -->
    <input type="button" onClick="addTel('tel_0')" value = "Add tel">
    <input type="text" class="input-text-long">
    <div id="tel_0"></div>
  </div>
</div>
</body>
</html>

кнопка - addMan - вызывает функцию addMan() и добавляет поле имени, к которому можно добавлять неограниченное количество телефонов кнопкой addTel, которая вызывает addTel(id) <- принимает параметр ID - diva в которые добавлять поля телефонов.
проблема - не могу добавить кнопки addMan так чтобы у них на событие onClick вызывалась бы функция addTel() с заданным ID

Это сообщение отредактировал(а) Irokez - 25.5.2005, 12:28
PM   Вверх
Sardar
Дата 25.5.2005, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Ну не обязательно задавать ID, можно просто обойтись нормальной структурой:
Код
<html>
<head>
<style type="text/css">
.man {
 border: solid 1px black;
 font-family: Verdana;
 margin-top: 5px;
}
.tels {
  border: dotted 1px red;
}
</style>

<title>*</title>
<script language="JavaScript" type="text/javascript">

function addTel(fid)
{
   
    var div = document.createElement('div');
    var space = document.createTextNode(' ');
    div.appendChild(space);
    
    var inp_num = document.createElement('input');
    inp_num.name = 'tel[]';
    inp_num.className = 'input-text-short';
    div.appendChild(inp_num);
    div.appendChild(space);
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Rem tel';
    btn.onclick = function() {
        var div = this.parentNode;
        div.parentNode.removeChild(div);
    }
    div.appendChild(btn);
    
    var target=fid? fid: window.event;
    target=target.target? target.target: target.srcElement;
    while(target&&(target.nodeType!=1||target.nodeName.toUpperCase()!="DIV"||target.className!="tels")) target=target.nextSibling
    if(target) target.appendChild(div);
//    else alert("Vo blin, takogo ne mozhet byt'...! =)";
}
function sayHi()
{
    alert('hi');
}

function addMan()
{
    var div = document.createElement('div');
    div.className="man";
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Add tel';
    btn.onclick = addTel;
    div.appendChild(btn);
    
    var space = document.createTextNode(' ');
    div.appendChild(space);
    var inp_name = document.createElement('input');
    inp_name.className = 'input-text-long';
    div.appendChild(inp_name);

    var div_tels = document.createElement('div');
    div_tels.className="tels";
    div.appendChild(div_tels);
    document.getElementById('manlist').appendChild(div);
}
</script>
</head>
<body>
<input type="button" onClick="addMan()" value="Add man">
<div id="manlist">
<!-- Man's -->
<div class="man">
    <input type="button" onClick="addTel(event)" value = "Add tel">
    <input type="text" class="input-text-long">
  <div class="tels">
  </div>
</div>

</div>
</body>
</html>


Хотя проблема в твоём коде была в том что tels_id это глобальная переменная, меняется при каждом вызове и получается едина для всех. Пропиши: var tels_id = 'tel_' + last_id; - должно заработать.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Irokez
Дата 25.5.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: 1
Всего: 53



Цитата(Sardar @ 25.5.2005, 13:35)
Ну не обязательно задавать ID, можно просто обойтись нормальной структурой:

ок, понял, спасибо

Цитата(Sardar @ 25.5.2005, 13:35)
Пропиши: var tels_id = 'tel_' + last_id; - должно заработать.

неа, ID передаются разные, но в сама функция получает 'undefined'
PM   Вверх
Sardar
Дата 25.5.2005, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Irokez @ 25.5.2005, 12:48)
неа, ID передаются разные, но в сама функция получает 'undefined'

Смотрел не дома, времени запустить не было. Ошибка не только в глобальной tels_id, но и в вызове функции. Метод call принимает первым аргументов ссылку на обьект, в контексте которого исполняется вызываемая функция. Попробуй так:

Код
<html>
<head>
<title>*</title>
<script language="JavaScript" type="text/javascript">
var last_id = 0;
function addTel(div_id)
{
   
    var div = document.createElement('div');
    var space = document.createTextNode(' ');
    div.appendChild(space);
    
    var inp_num = document.createElement('input');
    inp_num.name = 'tel[]';
    inp_num.className = 'input-text-short';
    div.appendChild(inp_num);
    div.appendChild(space);
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Rem tel';
    btn.onclick = function() {
        var div = this.parentNode;
        div.parentNode.removeChild(div);
    }
    div.appendChild(btn);
    document.getElementById(div_id).appendChild(div);
}
function sayHi()
{
    alert('hi');
}
function addMan()
{
    last_id ++;
    var div = document.createElement('div');
    div.id = 'man_' + (last_id);
    
    var btn = document.createElement('input');
    btn.type = 'button';
    btn.value = 'Add tel';
    var tels_id = 'tel_' + last_id;
    btn.onclick = function() {addTel.call(btn, tels_id);}; //проблема тут, addTel не получает параметр
    div.appendChild(btn);
    
    var space = document.createTextNode(' ');
    div.appendChild(space);
    var inp_name = document.createElement('input');
    inp_name.className = 'input-text-long';
    div.appendChild(inp_name);
    var div_tels = document.createElement('div');
    div_tels.id = 'tel_' + (last_id);
    div.appendChild(div_tels);
    document.getElementById('test').appendChild(div);
}
</script>
</head>
<body>
<input type="button" onClick="addMan()" value="Add man">
<div id="test">
  <div id="man_0">
    <!-- эта кнопка работает, а последующие добавленные - нет -->
    <input type="button" onClick="addTel('tel_0')" value = "Add tel">
    <input type="text" class="input-text-long">
    <div id="tel_0"></div>
  </div>
</div>
</body>
</html>


Убери var перед tels_id, сравни разницу. Если не понял, то читай статью о вложенных функциях(закреплённый топ).

Ну и предупреждение: метод call у функций не существует в IE5.0, поздние версии всё имеют.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.