Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Повоторяющаяся функция (https://javascript.ru/forum/misc/55369-povotoryayushhayasya-funkciya.html)

qwe88 24.04.2015 22:09

Повоторяющаяся функция
 
Добрый день!
Никак не могу понять, как реализовать. В общем есть много кнопок, каждая кнопка вызывает определенную функцию. Разница в функциях только в цифре.
Вот пример:
function naztoa2(){
    var knopga2 = document.getElementById("knopga2");
    var knopg2 = document.getElementById("knopg2");
    var forb2 = document.getElementById("forb2");
    var fors2 = document.getElementById("fors2");
    var forbk2 = document.getElementById("forbk2");
    var forsk2 = document.getElementById("forsk2");
    knopga2.className="vidsamknopa";
    knopg2.className="vidsamknop";
    forb2.style.display = "none";
    fors2.style.display = "";
    forbk2.style.display = "none";
    forsk2.style.display = "";
}


Подскажите, пожалуйста, как мне 2 запихнуть в х, а вызов сделать такой:
naztoa(2) - у первой кнопки
naztoa(3) - у второй
и т.д.

laimas 24.04.2015 22:51

Если разница только в цифре, то зачем много функций?

qwe88 24.04.2015 22:53

Вот и хочу из много сделать одну, и никак не могу понять как это сделать.
id у блоков, которые меняются, только цифра отличается

Deff 25.04.2015 01:30

Вариант:
function elemHide(a){
   document.getElementById(a).display = "none";
}
function elemNoHide(a){
   document.getElementById(a).display = "";
}
function addClass(a,b){
   document.getElementById(a).className=b;
}
function setArrActions(arr){
   var lng = arr.length;
   for(var i=0;i<lng;i++){
     var act = arr[i].split('-');
     if(act[0]==2) {addClass(act[1],act[2]);continue;}
     if(act[0]==1) {elemHide(act[1]);continue;}
     if(act[0]==0) {elemNoHide(act[1]);continue;}
   }
}
// Maccив деяний: 2- добавляем класс, 1 - элемент скрываем, 0 - удаляем скрытие
var naztoaXX = "2-knopgaXX-vidsamknopa,2-knopgXX-vidsamknop,1-forbXX,1-forbkXX,0-forsXX,0-forskXX";
var naztoa2Arr = "naztoaXX".replace(/XX/gim,"2").split(',');
setArrActions(naztoa2Arr);
var naztoa3Arr = "naztoaXX".replace(/XX/gim,"3").split(',');
setArrActions(naztoa3Arr);
var naztoa4Arr = "naztoaXX".replace(/XX/gim,"4").split(',');
setArrActions(naztoa4Arr);

====================
Ну или используя исходник:
naztoaXX = function (){
    var knopgaXX = document.getElementById("knopgaXX");
    var knopgXX = document.getElementById("knopgXX");
    var forbXX = document.getElementById("forbXX");
    var forsXX = document.getElementById("forsXX");
    var forbkXX = document.getElementById("forbkXX");
    var forskXX = document.getElementById("forskXX");
    knopgaXX.className="vidsamknopa";
    knopgXX.className="vidsamknop";
    forbXX.style.display = "none";
    forsXX.style.display = "";
    forbkXX.style.display = "none";
    forskXX.style.display = "";
}
function generate_naztoaN(n){eval("window['naztoa'+n]="+naztoaXX.toString().replace(/XX/gim,n))}

generate_naztoaN(3);
alert(naztoa3);

generate_naztoaN(1);
alert(naztoa1);

На выходе получаеm функции:naztoa1() ,naztoa2() и т.д.

laimas 25.04.2015 06:56

id у блоков, которые меняются, только цифра отличается

Ну и получайте эту цифру как аргумент для одной функции, которую можно извлечь из ID объекта. Если ID именовать так - name-N, то цифра, это this.id.split('-').pop() или для nameN - this.id.replace(/\D/, '').

qwe88 25.04.2015 12:55

Ничего себе как все сложно))
Спасибо вам огромное))

qwe88 25.04.2015 13:52

Подскажите, пожалуйста, что не так?
Нужно что бы у дива поставился class
<input type="button" onclick="generate_naztoaN(3); naztoa3; " />

<div id="knopga3"></div>

<script>
naztoaXX = function (){
    var knopgaXX = document.getElementById("knopgaXX");
    knopgaXX.className="vidsamknopa";
   
	
}
function generate_naztoaN(n){eval("window['naztoa'+n]="+naztoaXX.toString().replace(/XX/gim,n))}

</script>

Deff 25.04.2015 15:25

qwe88,
Проще(и правильнее) для этой цели использовать функцию с двумя аргументами из Варианта 1
function addClass(a,b){
   document.getElementById(a).className=b;
}
addClass(knopga1,vidsamknopa);
addClass(knopga2,vidsamknopa);
addClass(knopga3,vidsamknopa);


Для Вашей текущей идеологии, имхо проще так:
<script>
function addClassva(a){ //va - ассоциируем  с 'vidsamknopa'
   document.getElementById(a).className='vidsamknopa';
}
</script>
<input type="button" onclick="addClass('knopga3')" />
<div id="knopga3"></div>

qwe88 25.04.2015 17:29

Супер!
Спасибо огромное!

qwe88 25.04.2015 19:33

В итоге у меня получилось так:
<input type="button" onclick="addClassva(3)" />
<div id="knopga3"></div>

<script type="text/javascript">
function addClassva(a){
   document.getElementById("knopga" + a).className='vidsamknopa';
}
</script>


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