Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передать параметр в функцию приатаченую к событию (https://javascript.ru/forum/events/67528-peredat-parametr-v-funkciyu-priatachenuyu-k-sobytiyu.html)

AndreyAndrey 22.02.2017 12:55

Передать параметр в функцию приатаченую к событию
 
Всем привет.

Есть проблема которая скорее всего связана с нехваткой теории.
Мне нужно по событию onclick запустить функцию с параметром. Сначала думал решить этот вопрос через обёртку (onclick: function () {myFunction(data)}) но в этом случаи получаю ошибку об отсутствии идентификатора функции.

Как это можно реализовать? Параметр формируется как результат выполнения другой функции.

ksa 22.02.2017 13:27

Цитата:

Сообщение от AndreyAndrey
Мне нужно по событию onclick запустить функцию с параметром.

obj.addEventListener("click", function(){
   myFnc(myPrm);
}, true);

Где obj ссылка на нужный элемент...

ksa 22.02.2017 13:28

Цитата:

Сообщение от AndreyAndrey
Параметр формируется как результат выполнения другой функции

obj.addEventListener("click", function(){
   myFnc(fncPrm());
}, true);

Где fncPrm - функция формирующая параметр...

AndreyAndrey 22.02.2017 13:36

Я дико извиняюсь, а при таком подходе нет каких-то подводных камней? Дело в том, что так я уже пробовал но функция не срабатывает.
Это переменная, которая определяет свойства кнопки
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);
		}
	}

ksa 22.02.2017 14:01

Цитата:

Сообщение от AndreyAndrey
а при таком подходе нет каких-то подводных камней?

Это, можно сказать, основы языка. В основах нет никаких "подводных" камней. :)
Это столпы на которых потом все и строится...

А для полноты картины от тебя нужен тестовый пример, которыи и проиллюстрирует чего там у тебя и как.
Иначе долго можно что-то советовать, а ты будешь писать, что у тебя не работает. :)
Хотя никто так и не узнает как ты это используешь и где...

AndreyAndrey 22.02.2017 14:27

Ну что же. Попробую с примером. Кстати, спасибо что уделил время :)

Опишу только те функции, которые используются в процессе формирования кнопки, думаю другие не столь важны (они работают).

Здесь определяются параметры кнопки, а также параметр, который будет передан в функцию
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 срабатывает

ksa 22.02.2017 15:20

Цитата:

Сообщение от AndreyAndrey
Если вместо addEventListener просто присвоить onclick: 'clickYes()' то alert срабатывает

Т.е. тебе нужно правильно "собрать" строчку, которая потом будет выполняться. :)

Напиши так
onclick: 'clickYes(count())'

Где count() - функция возвращающая количество полей...

AndreyAndrey 22.02.2017 15:46

Если я правильно понимаю, то в этом случаи появляются проблемы, связанные с областями видимости. Получается, мне нужно эту функцию (count) выкидывать в глобальную область видимости, иначе она не стартонёт, и если это так, то в неё же нужно как-то засунуть данные по полям что бы она их вернула... Опять же если я правильно тебя понял :)

то есть если я сделаю так
function fn(){
var fields;
...
onclick: 'clickYes(count())'
function count() {
return fields;
}
}

То будет проблема связанная с тем, что функция недоступна
а если так
function fn(){
var fields;
...
onclick: 'clickYes(count())'
}
function count() {
return fields;
}

то само собой будет недоступна переменная.

Просто если делать это всё по другому, используя глобальную область, то проблем не возникает, этот вопрос я смогу решить определив объект с набором свойств и методов, которые помогут решить вопрос. Я хотел понять, как это сделать без глобального объекта.

AndreyAndrey 22.02.2017 16:05

Вообще, быть может я действительно всё делаю неправильно (в смысле true кодеры так не пишут) и это обычно реализуется другим способом.. Но к сожалению из-за отсутствия нужного нолиджа ковыряюсь так :(

ksa 27.02.2017 09:13

Цитата:

Сообщение от AndreyAndrey
в этом случаи появляются проблемы, связанные с областями видимости

Так они и ранее никуда не девались. :)
Их тебе и нужно правильно использовать... ;)

Пока у тебя нет полного тестового примера, остается только тыкать пальцами в небо... :(


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