Javascript.RU

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

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

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

Как это можно реализовать? Параметр формируется как результат выполнения другой функции.
Ответить с цитированием
  #2 (permalink)  
Старый 22.02.2017, 13:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AndreyAndrey
Мне нужно по событию onclick запустить функцию с параметром.
obj.addEventListener("click", function(){
   myFnc(myPrm);
}, true);

Где obj ссылка на нужный элемент...
Ответить с цитированием
  #3 (permalink)  
Старый 22.02.2017, 13:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AndreyAndrey
Параметр формируется как результат выполнения другой функции
obj.addEventListener("click", function(){
   myFnc(fncPrm());
}, true);

Где fncPrm - функция формирующая параметр...
Ответить с цитированием
  #4 (permalink)  
Старый 22.02.2017, 13:36
Интересующийся
Отправить личное сообщение для AndreyAndrey Посмотреть профиль Найти все сообщения от AndreyAndrey
 
Регистрация: 16.02.2017
Сообщений: 10

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

Последний раз редактировалось AndreyAndrey, 22.02.2017 в 13:48.
Ответить с цитированием
  #5 (permalink)  
Старый 22.02.2017, 14:01
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AndreyAndrey
а при таком подходе нет каких-то подводных камней?
Это, можно сказать, основы языка. В основах нет никаких "подводных" камней.
Это столпы на которых потом все и строится...

А для полноты картины от тебя нужен тестовый пример, которыи и проиллюстрирует чего там у тебя и как.
Иначе долго можно что-то советовать, а ты будешь писать, что у тебя не работает.
Хотя никто так и не узнает как ты это используешь и где...
Ответить с цитированием
  #6 (permalink)  
Старый 22.02.2017, 14:27
Интересующийся
Отправить личное сообщение для AndreyAndrey Посмотреть профиль Найти все сообщения от AndreyAndrey
 
Регистрация: 16.02.2017
Сообщений: 10

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

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

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

Последний раз редактировалось AndreyAndrey, 22.02.2017 в 14:46.
Ответить с цитированием
  #7 (permalink)  
Старый 22.02.2017, 15:20
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AndreyAndrey
Если вместо addEventListener просто присвоить onclick: 'clickYes()' то alert срабатывает
Т.е. тебе нужно правильно "собрать" строчку, которая потом будет выполняться.

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

Где count() - функция возвращающая количество полей...
Ответить с цитированием
  #8 (permalink)  
Старый 22.02.2017, 15:46
Интересующийся
Отправить личное сообщение для AndreyAndrey Посмотреть профиль Найти все сообщения от AndreyAndrey
 
Регистрация: 16.02.2017
Сообщений: 10

Если я правильно понимаю, то в этом случаи появляются проблемы, связанные с областями видимости. Получается, мне нужно эту функцию (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:19.
Ответить с цитированием
  #9 (permalink)  
Старый 22.02.2017, 16:05
Интересующийся
Отправить личное сообщение для AndreyAndrey Посмотреть профиль Найти все сообщения от AndreyAndrey
 
Регистрация: 16.02.2017
Сообщений: 10

Вообще, быть может я действительно всё делаю неправильно (в смысле true кодеры так не пишут) и это обычно реализуется другим способом.. Но к сожалению из-за отсутствия нужного нолиджа ковыряюсь так
Ответить с цитированием
  #10 (permalink)  
Старый 27.02.2017, 09:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AndreyAndrey
в этом случаи появляются проблемы, связанные с областями видимости
Так они и ранее никуда не девались.
Их тебе и нужно правильно использовать...

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите как передать параметр в функцию из ссылки Conus Элементы интерфейса 1 28.04.2016 20:16
Как передать значения в функцию? misha2015 Серверные языки и технологии 8 14.04.2015 18:04
Передать параметр при ajax rafaello AJAX и COMET 5 10.04.2014 11:25
передать параметры в функцию jQuery AJAX Lion_astana Общие вопросы Javascript 7 21.02.2014 17:25
Как из функции вызвать другую функцию и правильно передать ей параметр Alexd Общие вопросы Javascript 3 06.05.2011 03:42