Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.04.2014, 12:28
Интересующийся
Отправить личное сообщение для JaneLane Посмотреть профиль Найти все сообщения от JaneLane
 
Регистрация: 19.04.2014
Сообщений: 13

Динамическое добавление аттрибута onClick
Здравствуйте!Подскажите, пожалуйста,как кроссбраузерно используя DOM можно изменить аттрибут onClick и чтобы функция могла принимать параметры: например, obj.setAttribute("onclick","play(par1,par2);"); функция начинает сама исполняться ещё до нажатия.а как имея ссылку на объект динамически кроссбраузерно добавить аттрибут onClick с функцией с двумя параметрами, чтобы функция исполнялась только при нажатии?

пробовала делать так:
function setEvent(c, name, action)
{
if (c.addEventListener) {
c.addEventListener( name, action, false );
}
else if (c.attachEvent) {
c.attachEvent("on" + name, action);
}
else {
c["on" + name] = action;
}
}
Соответственно использование:

setEvent(obj, "click", function () { play(par1,par2); } );
Ответить с цитированием
  #2 (permalink)  
Старый 19.04.2014, 12:38
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

И чем вас ваш вариант не устраивает?
Ответить с цитированием
  #3 (permalink)  
Старый 19.04.2014, 15:37
Интересующийся
Отправить личное сообщение для JaneLane Посмотреть профиль Найти все сообщения от JaneLane
 
Регистрация: 19.04.2014
Сообщений: 13

не работает почему-то,атрибут onclick не проставляется
Ответить с цитированием
  #4 (permalink)  
Старый 19.04.2014, 15:43
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от JaneLane
не работает почему-то,атрибут onclick не проставляется
Атрибут и не должен проставляться. Атрибут onclick - это альтернативный, устаревший вариант навешивания обработчика события. setEvent использует addEventListener - что есть хорошо.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 19.04.2014, 15:48
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от JaneLane Посмотреть сообщение
не работает почему-то,атрибут onclick не проставляется
Так нужен именно атрибут или чтобы клик работал? Если второе, то вроде всё работает:
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  </head>
  <body>
<button onclick="setEvent(document.getElementById('test'), 'click', function() { someFunc(1,2); });">Повесить функцию на ссылку</button>
<a href="#" id="test">test</a>
<script>
function setEvent(c, name, action) 
{
   if (c.addEventListener) {
   c.addEventListener( name, action, false );
   }
    else if (c.attachEvent) {
    c.attachEvent("on" + name, action);
   }
    else {
    c["on" + name] = action;
   }
}

function someFunc(a, b) {
  alert(a+','+b);
}
</script>
  </body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 19.04.2014, 16:09
Интересующийся
Отправить личное сообщение для JaneLane Посмотреть профиль Найти все сообщения от JaneLane
 
Регистрация: 19.04.2014
Сообщений: 13

М,а если нужно изменить сам атрибут?я клонирую узлы вместе с обработчиком,и мне нужно поменять параметры в функции,если изменять атрибут методом setAttribute,то функция выполняется сразу же,не по нажатию, а способом выше по клику ничего не происходит(
Ответить с цитированием
  #7 (permalink)  
Старый 19.04.2014, 16:45
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от JaneLane Посмотреть сообщение
М,а если нужно изменить сам атрибут?я клонирую узлы вместе с обработчиком,и мне нужно поменять параметры в функции,если изменять атрибут методом setAttribute,то функция выполняется сразу же,не по нажатию, а способом выше по клику ничего не происходит(
Так а не проще при клонировании на клон новый обработчик вешать? Можно сделать функцию которая будет клонировать узел, принимать параметры и вешать нужный обработчик с нужными параметрами. Или вообще хранить параметры функции в каком-нибудь артрибуте узла и в функции брать их уже из кликнутого элемента.
В общем что-то типо этого:
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  </head>
  <body>
<form>
a: <input type="text" name="a" value="5"><br>
b: <input type="text" name="b" value="3"><br>
<input type="button" value="clone link" onclick="cloneLink(this.form)">
</form>
<a href="#" id="test">test</a><br>

<script>
function setEvent(c, name, action) 
{
   if (c.addEventListener) {
   c.addEventListener( name, action, false );
   }
    else if (c.attachEvent) {
    c.attachEvent("on" + name, action);
   }
    else {
    c["on" + name] = action;
   }
}

function someFunc(a, b) {
  alert(a + ',' + b);
}

function cloneAndAddHandler(el, a, b) {
  var clone = el.cloneNode(true);
  setEvent(clone, 'click', function() { someFunc(a, b); });
  return clone;
}

function cloneLink(form) {
  var el = document.getElementById('test');
  var a = form.elements.a.value;
  var b = form.elements.b.value;
  var newA = cloneAndAddHandler(el, a, b);
  newA.innerHTML = 'test' + a + ',' + b;
  document.body.appendChild(newA);
  document.body.appendChild( document.createElement('br') );
}
</script>
  </body>
</html>

Последний раз редактировалось jsnb, 19.04.2014 в 17:08.
Ответить с цитированием
  #8 (permalink)  
Старый 19.04.2014, 17:36
Интересующийся
Отправить личное сообщение для JaneLane Посмотреть профиль Найти все сообщения от JaneLane
 
Регистрация: 19.04.2014
Сообщений: 13

Сообщение от jsnb Посмотреть сообщение
Так а не проще при клонировании на клон новый обработчик вешать? Можно сделать функцию которая будет клонировать узел, принимать параметры и вешать нужный обработчик с нужными параметрами. Или вообще хранить параметры функции в каком-нибудь артрибуте узла и в функции брать их уже из кликнутого элемента.
В общем что-то типо этого:
<!DOCTYPE HTML>
<html>
  <head>
  <meta charset="utf-8">
  </head>
  <body>
<form>
a: <input type="text" name="a" value="5"><br>
b: <input type="text" name="b" value="3"><br>
<input type="button" value="clone link" onclick="cloneLink(this.form)">
</form>
<a href="#" id="test">test</a><br>

<script>
function setEvent(c, name, action) 
{
   if (c.addEventListener) {
   c.addEventListener( name, action, false );
   }
    else if (c.attachEvent) {
    c.attachEvent("on" + name, action);
   }
    else {
    c["on" + name] = action;
   }
}

function someFunc(a, b) {
  alert(a + ',' + b);
}

function cloneAndAddHandler(el, a, b) {
  var clone = el.cloneNode(true);
  setEvent(clone, 'click', function() { someFunc(a, b); });
  return clone;
}

function cloneLink(form) {
  var el = document.getElementById('test');
  var a = form.elements.a.value;
  var b = form.elements.b.value;
  var newA = cloneAndAddHandler(el, a, b);
  newA.innerHTML = 'test' + a + ',' + b;
  document.body.appendChild(newA);
  document.body.appendChild( document.createElement('br') );
}
</script>
  </body>
</html>


вот,например,мой кусок кода.я нахожу новый элемент и пытаюсь на него поставить обработчик.у меня бред написан?просто если смотреть через инспектор на моем узле как была функция c параметрами copyTask(0,0),так и осталась.мне нужно изменить на copyTask(0,1).я извиняюсь,что с такими тупыми вопросами,но в js пока что вообще не алё
function addEndRow(dayN,fieldName)
{
  

	var a=document.getElementsByTagName("input");
	
			for (i=0;i<a.length;i++) 
			{

				var obj=a.item(i);
				var oname=obj.name;
				if (oname==fieldName) 
				{	
		
				        obj.value++;                    
					 
				
	var cop=document.getElementById("cop_"+dayN+"_"+0);
	var newCop=cop.cloneNode(true);
	newCop.id="cop_"+dayN+"_"+obj.value;
	node= newCop.childNodes[1];
	node.name="copy_"+dayN+"_"+obj.value;
	node.id="copyB_"+dayN+"_"+obj.value;
var myTD=document.createElement('td');
	myTD.appendChild(newCop);

		
	


	var past=document.getElementById("past_"+dayN+"_"+0);
	var newPast=past.cloneNode(true);
	newPast.id="past_"+dayN+"_"+obj.value;
node2 = newPast.childNodes[1];
	node2.name="paste_"+dayN+"_"+obj.value;
	node2.id="pasteB_"+dayN+"_"+obj.value;
var myTD2=document.createElement('td');
	myTD2.appendChild(newPast);

		
	

	var cl=document.getElementById("cl_"+dayN+"_"+0);
	var newCl=cl.cloneNode(true);
	newCl.id="cl_"+dayN+"_"+obj.value; 
node3= newCl.childNodes[1];
	node3.name="clear_"+dayN+"_"+obj.value;
	node3.id="clearB_"+dayN+"_"+obj.value;
var myTD3=document.createElement('td');
myTD3.appendChild(newCl);

		
 var myTR=document.createElement('tr');

  myTR.appendChild(myTD);
  myTR.appendChild(myTD1);
  myTR.appendChild(myTD2);
  myTR.appendChild(myTD3);
  	

 
 document.getElementById("myT_"+dayN).appendChild(myTR);
var cp=document.getElementById("copyB_"+dayN+"_"+obj.value);
var ps=document.getElementById("pasteB_"+dayN+"_"+obj.value);
var cl=document.getElementById("clearB_"+dayN+"_"+obj.value);

cp.onclick=function(){copyTask(dayN,obj.value);}
ps.onclick=function(){pasteTask(dayN,obj.value);}
cl.onclick=function(){clearLine(dayN,obj.value);}
                                          
}
}
}
Ответить с цитированием
  #9 (permalink)  
Старый 19.04.2014, 18:56
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

А node, node2 и node3 так и задумано что они будут из вне браться? И у них уже есть в самом теге атрибут onclick? Или другое навешанный обработчик через addEventListener? Просто по вашему коду получается, что вы пытаетесь для каких-то внешних элементов перезаписать обработчик. Если предыдущий обработчик был записан в атрибуте onclick, то запись свойства .onclick перезапишет его, но атрибут не поменяется т.к. атрибут - это часть HTML кода элемента. Но сама функция будет вызываться при клике уже перезаписанная. Т.е. сам атрибут после перезаписи через .onclick уже ни на что не влияет. Если уж он так смущает, то можете очистить его через setAttribute или вообще удалить c помощью removeAttribute (не работает в старых IE).
В общем, вот тут про атрибуты написано: http://learn.javascript.ru/attribute...трибуты
А вот тут про то как вешаются события: http://learn.javascript.ru/introduction-browser-events
Ответить с цитированием
  #10 (permalink)  
Старый 19.04.2014, 23:43
Интересующийся
Отправить личное сообщение для JaneLane Посмотреть профиль Найти все сообщения от JaneLane
 
Регистрация: 19.04.2014
Сообщений: 13

jsnb, спасибо большое за помощь!получилось!оказалос ь, всё просто)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое добавление гридов kabiev Angular.js 3 14.08.2013 00:26
Динамическое добавление и удаление одной и тойже вкладки в Ext.tab.Panel potkin ExtJS 2 29.07.2012 16:47
Динамическое добавление выпадающего списка В IE stepennwolf Internet Explorer 3 04.11.2011 17:36
Динамическое добавление нового option в form artwalek Элементы интерфейса 19 24.04.2009 17:42
Не работает onClick добавление тега <s> AvaGet Общие вопросы Javascript 13 09.12.2008 18:41