2012-04-12 30 views
1

我想用javascript和css制作一个按钮,点击时会改变点击元素的类,使其对用户显而易见,它是当前选定的按钮。更改标签类的调试方法

页面上有四个按钮。我还没有实施第四个。 蛮力代码(show after)正在工作。

function selected_button(opCode){ 
    switch(opCode){ 
     case 1: 
      document.getElementById('button1').className += "selected"; 
      document.getElementById('button2').className = document.getElementById("button2").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button3').className = document.getElementById("button3").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button4').className = document.getElementById("button4").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      break; 
     case 2: //Really similar to case 1 but shifted numbers around 
      document.getElementById('button2').className += "selected"; 
      document.getElementById('button1').className = document.getElementById("button1").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button3').className = document.getElementById("button3").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button4').className = document.getElementById("button4").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      break; 
     default: //really similar to case 1 but shifted numbers around 
      document.getElementById('button3').className += "selected"; 
      document.getElementById('button1').className = document.getElementById("button1").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button2').className = document.getElementById("button2").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
      document.getElementById('button4').className = document.getElementById("button3").className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
    } 
} 

我想要所以我想出了这个更一般的功能如下:

function general_selected(selected_elem_num, num_elem, elem_name, desired_class){ 
    var i = 0; 
    for(i = 0; i < num_elem + 1; i++){ //dehighlights all options 
      document.getElementById(elem_name + i.toString()).className = 
       document.getElementById(elem_name + i.toString()).className.replace 
       (/(?:^|\s) *should be a parameter here* (?!\S)/ , ''); 
       /* code wrapped for readability - above is all one statement */ 
    } 
    //highlights selected option 
    document.getElementById(elem_name + selected_elem_num).className 
       += desired_class; 
} 

以下两个函数调用应该是几乎相同的:

selected_button(1); 
general_selected(1, 4, 'button', 'selected'); 

虽然我有两个问题:

1)我不知道如何插入所需的类到正则表达式作为参数。

2)for循环中真正长的方法会导致错误。错误似乎是持久的,因为我得到了同样的错误,甚至当我用下面的替换方法在for循环:

document.getElementByID(elem_name + i.toString()).className = desired_class; 

代码松散的基础上的主题: Change an element's class with JavaScript

回答

0

添加事件侦听根节点和跟踪实际目标。

document.addEventListener('click', function(event){ 
    var old = document.querySelector(".selected"); 
    old.className = old.className.replace(/(?:^|\s)selected(?!\S)/ , ''); 
    event.target.className += " selected"; 
}, false); 
+0

您也可以使用'element.classList.remove(“选择”)' – kirilloid 2012-04-12 22:56:41

0
  1. Create the regex dynamically使用new Regex(string)

reg = new Regex('?:^|\s)'+desired_class+'(?!\S)');

  1. 你的循环从0开始,但你的按钮名称开始于1

for(i = 1; i < num_elements + 1 .....

剩下的,就像他们说的,就留给读者做练习