Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как передать аргумент функции


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

myelem.onClick = myfunc;

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

Автор: Aliance 24.5.2005, 16:59
А почему inline не пользуешься?
Да и каждому событию передается аргумент event...

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

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


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

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

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


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

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

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

Не верю smile
Код

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


Irokez, а тебе собственно какой аргумент нужно было получить - this?

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

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

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

да, но не только его, хотел вообще узнать механизм, как передавать аргумент

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

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

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

Айда в тему про события smile там все-все написано :-)

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

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

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

ок, спасибо smile

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

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

Автор: Irokez 25.5.2005, 12:27
сдаюсь, прошу помощи:
Код

<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

Автор: Sardar 25.5.2005, 13:35
Ну не обязательно задавать 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; - должно заработать.

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

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

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

неа, ID передаются разные, но в сама функция получает 'undefined'

Автор: Sardar 25.5.2005, 17:58
Цитата(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, поздние версии всё имеют.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)