Передать параметр в функцию приатаченую к событию 
		
		
		
		Всем привет. 
	Есть проблема которая скорее всего связана с нехваткой теории. Мне нужно по событию onclick запустить функцию с параметром. Сначала думал решить этот вопрос через обёртку (onclick: function () {myFunction(data)}) но в этом случаи получаю ошибку об отсутствии идентификатора функции. Как это можно реализовать? Параметр формируется как результат выполнения другой функции.  | 
	
		
 Цитата: 
	
 
obj.addEventListener("click", function(){
   myFnc(myPrm);
}, true);
Где obj ссылка на нужный элемент...  | 
	
		
 Цитата: 
	
 
obj.addEventListener("click", function(){
   myFnc(fncPrm());
}, true);
Где fncPrm - функция формирующая параметр...  | 
	
		
 Я дико извиняюсь, а при таком подходе нет каких-то подводных камней? Дело в том, что так я уже пробовал но функция не срабатывает. 
	Это переменная, которая определяет свойства кнопки 
var buttonYes = createCustomButtonV2('tab4', {
    id : 'matchingYes',
    //onclick : ,
    title : 'Одобрить заявку на старт работ',
    value : fieldscollection}, {event:'onclick', func: function () {clickYes(data);
  }});
Это кусок кода, который должен повесить на событие функцию 
if (eventfunc) {//Обработчик события
		if (window.addEventListener) {
			buttondom.addEventListener(eventfunc.event, eventfunc.func);
		}
		else {//ie8
			buttondom.attachEvent(eventfunc.event, eventfunc.func);
		}
	}
 | 
	
		
 Цитата: 
	
 Это столпы на которых потом все и строится... А для полноты картины от тебя нужен тестовый пример, которыи и проиллюстрирует чего там у тебя и как. Иначе долго можно что-то советовать, а ты будешь писать, что у тебя не работает. :) Хотя никто так и не узнает как ты это используешь и где...  | 
	
		
 Ну что же. Попробую с примером. Кстати, спасибо что уделил время :) 
	Опишу только те функции, которые используются в процессе формирования кнопки, думаю другие не столь важны (они работают). Здесь определяются параметры кнопки, а также параметр, который будет передан в функцию 
function requestMatching(userRoles) {
  var fieldscollection = null;
  if (!userRoles || typeof (userRoles) !== 'object') {
    alert ('requestMatching. Параметр не обноружне либо задан не верно');
    return;
  }
  var matchingFields = {manager:{result:null, note: null},
    cheifsale: {result: 'new_resultsale', note: 'new_decisionnotesale'},
    managerzup: {result: 'new_resultzup', note: 'new_decisionnotezup'}};
  for (var key in userRoles) {
    if (!userRoles.hasOwnProperty(key)) continue;
    //alert ('Пробуем роль ' + key + ': ' + userRoles.key);
    if (userRoles[key]) {
      //alert ('Ищем ' + key + ': ' + matchingFields[key]);
      if (matchingFields[key] && xpga(matchingFields[key].note)) {//Проверка на совпадение имён свойств коллекий филдов и ролей
        Xrm.Page.getControl(matchingFields[key].note).setVisible(true);
        fieldscollection = matchingFields[key];
      }
    }
  }
  var buttonYes = createCustomButtonV2('tab4', {
    id : 'matchingYes',
    //onclick : ,
    title : 'Одобрить заявку на старт работ',
    value : fieldscollection}, {event:'onclick', func: function () {clickYes(fieldscollection);
  }});
  buttonYes.innerHTML = 'Согласовать';
  var buttonNone = createCustomButtonV2('tab4', {
    id : 'matchingNone',
    //onclick : '',
    title : 'Откклонить и отправить на доработку',
    value : 'Отказать'});
  buttonNone.innerHTML = 'Отказать';
}
Здесь билдиться сама кнопка 
function createCustomButtonV2(place, buttonobj, eventfunc) {
	if (!place || !buttonobj) {
		alert ("createImageButton. Параметры не определены");
		return;
	}
	//("style","width:150px; margin:5px 0px 5px 0px; display:inline-block")
	var customdiv = document.createElement("div");
	var placebuttondom = document.getElementById(place) ? document.getElementById(place) : null;
	var buttonimagelink = buttonobj.src ? buttonobj.src : null;
	var buttonelm = document.createElement("button");
	//var buttontype = buttonobj.type? buttonobj.type : "button";//Тип кнопки
	var custovdivdom;
	var buttondom;
	var defaultproperties = {
		type: "button",
		style: "margin: 5px; width: 120px; display: inline;"
	};
	//buttondom.setAttribute("src", "url");
	customdiv.setAttribute("style", "display:inline-block; width:150px; height:40px; margin:5px 20px 5px 5px");
	for (var key in buttonobj) {
		if (buttonobj.hasOwnProperty(key)) {
			buttonelm.setAttribute(key, buttonobj[key]);
		}
	}
	for (var def in defaultproperties) {
		if (defaultproperties.hasOwnProperty(def)) {
			if (!buttonobj[def]) {
				buttonelm.setAttribute(def, defaultproperties[def]);
			}
		}
	}
	custovdivdom = placebuttondom.appendChild(customdiv);
	buttondom = custovdivdom.appendChild(buttonelm);
	if (eventfunc) {//Обработчик события
		if (window.addEventListener) {
			buttondom.addEventListener(eventfunc.event, eventfunc.func);
		}
		else {//ie8
			buttondom.attachEvent(eventfunc.event, eventfunc.func);
		}
	}
	return buttondom;
}
Сама функция (пока в таком виде) 
function clickYes(fields) {
  alert ('Набор полей: ' + fields);
}
Если вместо addEventListener просто присвоить onclick: 'clickYes()' то alert срабатывает  | 
	
		
 Цитата: 
	
 Напиши так onclick: 'clickYes(count())' Где count() - функция возвращающая количество полей...  | 
	
		
 Если я правильно понимаю, то в этом случаи появляются проблемы, связанные с областями видимости. Получается, мне нужно эту функцию (count) выкидывать в глобальную область видимости, иначе она не стартонёт, и если это так, то в неё же нужно как-то засунуть данные по полям что бы она их вернула... Опять же если я правильно тебя понял :) 
	то есть если я сделаю так 
function fn(){
var fields;
...
onclick: 'clickYes(count())'
function count() {
return fields;
}
}
То будет проблема связанная с тем, что функция недоступна а если так 
function fn(){
var fields;
...
onclick: 'clickYes(count())'
}
function count() {
return fields;
}
то само собой будет недоступна переменная. Просто если делать это всё по другому, используя глобальную область, то проблем не возникает, этот вопрос я смогу решить определив объект с набором свойств и методов, которые помогут решить вопрос. Я хотел понять, как это сделать без глобального объекта.  | 
	
		
 Вообще, быть может я действительно всё делаю неправильно (в смысле true кодеры так не пишут) и это обычно реализуется другим способом.. Но к сожалению из-за отсутствия нужного нолиджа ковыряюсь так :( 
	 | 
	
		
 Цитата: 
	
 Их тебе и нужно правильно использовать... ;) Пока у тебя нет полного тестового примера, остается только тыкать пальцами в небо... :(  | 
| Часовой пояс GMT +3, время: 05:07. |