Передать параметр в функцию приатаченую к событию
Всем привет.
Есть проблема которая скорее всего связана с нехваткой теории. Мне нужно по событию 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:59. |