【问题标题】:Javascript rolloverJavascript 翻转
【发布时间】:2013-07-11 18:29:00
【问题描述】:

我遇到了以下挑战:

  • 我的表格有一个基本(静态)交替颜色方案,用于偶数/奇数行,包含不同的选项(类)。
  • 此外,Javascript 应提供:
    1. 显示光标指向哪一行的翻转效果(onmouseover、onmouseout)
    2. 包含通过鼠标单击 (onclick) 选择的选项的行的特定颜色。

我想出了以下代码:

<html>
<head>

<style type="text/css">
tr.moduleRow-odd {
    BACKGROUND-COLOR            : #FF0000;
}

tr.moduleRow-even {
    BACKGROUND-COLOR            : #00FF00;
}

.moduleRowOver-odd, .moduleRowOver-even {
    BACKGROUND-COLOR            : #D7E9F7;
}

.moduleRowSelected-even, .moduleRowSelected-odd {
    BACKGROUND-COLOR            : #0000FF; 
}
</style>

<script type="text/javascript"><!--
var selected;

function selectRowEffect(object, buttonSelect) {
  if (!selected) {
    if (document.getElementById) {
      selected = document.getElementById('defaultSelected');
    } else {
      selected = document.all['defaultSelected'];
    }
  }

if (selected) {

if (selected.className == 'moduleRow-even' || selected.className == 'moduleRowSelected-even') {
selected.className = 'moduleRow-even';
object.className = 'moduleRowSelected-even';
}

if (selected.className == 'moduleRow-odd' || selected.className == 'moduleRowSelected-odd') {
selected.className = 'moduleRow-odd';
object.className = 'moduleRowSelected-odd';
}

}
//selected.className = 'moduleRow';
//object.className = 'moduleRowSelected';
selected = object;

// one button is not an array
  if (document.checkout_payment.payment[0]) {
    document.checkout_payment.payment[buttonSelect].checked=true;
  } else {
    document.checkout_payment.payment.checked=true;
  }
}

function rowOverEffect_1(object) {
  if (object.className == 'moduleRow-odd') object.className = 'moduleRowOver-odd';
}

function rowOverEffect_2(object) {
  if (object.className == 'moduleRow-even') object.className = 'moduleRowOver-even';
}

function rowOutEffect_1(object) {
  if (object.className == 'moduleRowOver-odd') object.className = 'moduleRow-odd';
}

function rowOutEffect_2(object) {
  if (object.className == 'moduleRowOver-even') object.className = 'moduleRow-even';
}

//--></script>

</head>
<body>

<table>
<tr class="moduleRow-odd" onmouseover="rowOverEffect_1(this)" onmouseout="rowOutEffect_1(this)" onclick="selectRowEffect(this, 0)">
   <td>Option 1 - Row-odd</td>
   <td><input type="radio" name="payment" value="option 1" /></td>
</tr>
<tr class="moduleRow-even" onmouseover="rowOverEffect_2(this)" onmouseout="rowOutEffect_2(this)" onclick="selectRowEffect(this, 1)">
  <td>Option 2 - Row-even</td>
  <td><input type="radio" name="payment" value="option 2" /></td>
</tr>
</table>

</body>
</html>

测试时,在选项上单击几次后,我松开了交替的静态背景(奇数行/偶数行获得相同的颜色)和部分翻转。

非常感谢任何帮助。

亲切的问候,

丹尼斯

【问题讨论】:

  • 我建议你把翻转效果留给 CSS。只需将:hover 添加到选择器,仅当鼠标悬停在匹配的节点上时才应用规则。使用 tr:hover 之类的东西作为选择器来帮助您入门
  • 您甚至可以应用颜色过渡来柔化效果。
  • 还有一件事,如果与旧浏览器的兼容性不成问题,请使用:nth-child(even):nth-child(odd) 而不是手动向每一行添加类:)
  • 为了更好地查看观察到的效果,复制表格的最后两行(并重命名为选项 3 和 4)并添加到表格的底部。
  • 您的问题在于 selectRowEffect。基本上你正在做的是,如果选定的行是偶数,那么你正在使点击的行成为偶数......而奇数也是如此,所以发生的事情是你的第一个选择确定了以下点击的类。如果您先选择了一个奇数,则以下所有点击都会使行变得奇数,依此类推..

标签: javascript rollover


【解决方案1】:

我修改了你的 selectRowEffect 函数来解决你的逻辑问题

如您所见,您只需要检查所选行是否为偶数,并将其类恢复为我应该是的(取消选择它)。

然后,您可以将点击的行的类更改为相应的选定类。请注意,我使用了? : 三元运算符,它基本上测试? 之前的条件,如果为真则返回?: 之间的部分,否则返回: 之后的部分。然后返回的值会影响到对象的类名。

这里是fiddle,可以快速查看它的运行情况。

function selectRowEffect(object, buttonSelect) {
    if (!selected) {
        if (document.getElementById) {
            selected = document.getElementById('defaultSelected');
        } else {
            selected = document.all['defaultSelected'];
        }
    }

    if (selected) {
        if (selected.className == 'moduleRowSelected-even') {
            selected.className = 'moduleRow-even';
        }

        if (selected.className == 'moduleRowSelected-odd') {
            selected.className = 'moduleRow-odd';
        }
    }

    object.className = buttonSelect == 1 ? "moduleRowSelected-even" : "moduleRowSelected-odd";

    selected = object;

    // one button is not an array
    if (document.checkout_payment.payment[0]) {
        document.checkout_payment.payment[buttonSelect].checked=true;
    } else {
        document.checkout_payment.payment.checked=true;
    }
}

【讨论】:

  • 绝对棒极了!完美运行。我已经按照您的建议添加了:hover。非常感谢。问候,丹尼斯
  • 嗨,丹妮。很抱歉再次问你,但我高兴得有点早了。我在表中添加了两行额外的行(选项 3 和 4)。颜色方案不变(奇数行=红色,偶数行=绿色)。当我第一次单击选项 2 并随后单击选项 3 时,第二行(=偶数)变为红色(=奇数,而不是绿色)。接下来单击选项 4 会将第 1 行和第 2 行都变为红色。您对此有解决方案吗(因为我计划稍后扩展该表)。提前致谢。
  • 所描述的问题是我的最后一条评论应该是:我在表格中添加了两行额外的行(选项 3 和 4)。颜色方案不变(奇数行=红色,偶数行=绿色)。当我单击选项 1 到 4 并随后返回选项 3 时,第四行(=偶数)变为红色(=奇数,而不是绿色)。你有解决这个问题(因为我打算稍后扩展表格)吗?提前致谢。亲切的问候,丹尼斯。
  • &lt;tr class="moduleRow-odd" onclick="selectRowEffect(this, 0)"&gt; &lt;td&gt;Option 1 Row-odd&lt;/td&gt; &lt;td&gt;&lt;input type="radio" value="option 1" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr class="moduleRow-even" onclick="selectRowEffect(this, 1)"&gt; &lt;td&gt;Option 2 Row-even&lt;/td&gt; &lt;td&gt;&lt;input type="radio" value="option 2" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr class="moduleRow-odd" onclick="selectRowEffect(this, 2)"&gt; &lt;td&gt;Option 3 Row-odd&lt;/td&gt; &lt;td&gt;&lt;input type="radio" value="option 3" /&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr class="moduleRow-even" onclick="selectRowEffect(this, 3)"&gt; &lt;td&gt;Option 4 Row-even&lt;/td&gt; &lt;td&gt;&lt;input type="radio" value="option 4" /&gt;&lt;/td&gt; &lt;/tr&gt;
  • ok 看看 selectRowEffect(this, XX) 基本上第二个参数应该在 0 和 1 之间交替。我之前发布的代码检查你是否传递 0 或 1,这就是决定如果取消选择该行是奇数还是偶数
【解决方案2】:

我把完整的代码sn-p放在下面供其他人使用。所有功劳归功于 Dany Khalife,他让我走上了正轨。

记得调整 javascript 以反映您自己的: - 文件名(在我的例子中:rollover_test) - 输入字段的名称(在我的例子中:payment

<html>
 <head>
<style type="text/css">
tr.moduleRow-odd {
   BACKGROUND-COLOR            : #FF0000;
}

tr.moduleRow-even {
   BACKGROUND-COLOR            : #00FF00;
}

tr.moduleRow-odd:hover, tr.moduleRow-even:hover {
    BACKGROUND-COLOR            : #FFFF00;
}

.moduleRowSelected-odd, .moduleRowSelected-even {
    BACKGROUND-COLOR            : #0000FF; 
}
</style>
 </head>

 <body>
<script>
 var selected;

 function isEven(value) {
    if (value%2 == 0)
        return true;
    else
        return false;
}

function selectRowEffect(object, buttonSelect) {
    if (!selected) {
       if (document.getElementById) {
           selected = document.getElementById('defaultSelected');
       } else {
           selected = document.all['defaultSelected'];
       }
   }

   if (selected) {
       if (selected.className == 'moduleRowSelected-even') {
           selected.className = 'moduleRow-even';
       }

       if (selected.className == 'moduleRowSelected-odd') {
           selected.className = 'moduleRow-odd';
       }
   }

   object.className = isEven(buttonSelect) == false ? "moduleRowSelected-even" : "moduleRowSelected-odd";

   selected = object;

   // one button is not an array
   if (document.rollover_test.payment[0]) {
       document.rollover_test.payment[buttonSelect].checked=true;
   } else {
       document.rollover_test.checked=true;
    }
}
</script>

<table>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 0)">
   <td>Option 1 - Row-odd</td>
   <td><input type="radio" name="payment" value="option 1" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 1)">
  <td>Option 2 - Row-even</td>
  <td><input type="radio" name="payment" value="option 2" /></td>
</tr>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 2)">
  <td>Option 3 - Row-odd</td>
  <td><input type="radio" name="payment" value="option 3" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 3)">
  <td>Option 4 - Row-even</td>
  <td><input type="radio" name="payment" value="option 4" /></td>
</tr>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 4)">
  <td>Option 5 - Row-odd</td>
  <td><input type="radio" name="payment" value="option 5" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 5)">
  <td>Option 6 - Row-even</td>
  <td><input type="radio" name="payment" value="option 6" /></td>
</tr>
</table>
  </body>
</html>

注意: 当您在 selectRowEffect(this, XX) 中将 XX 替换为 0 和 1 时,该脚本同样有效 ,像这样:

<table>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 0)">
   <td>Option 1 - Row-odd</td>
   <td><input type="radio" name="payment" value="option 1" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 1)">
  <td>Option 2 - Row-even</td>
  <td><input type="radio" name="payment" value="option 2" /></td>
</tr>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 0)">
  <td>Option 3 - Row-odd</td>
  <td><input type="radio" name="payment" value="option 3" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 1)">
  <td>Option 4 - Row-even</td>
  <td><input type="radio" name="payment" value="option 4" /></td>
</tr>
<tr class="moduleRow-odd" onclick="selectRowEffect(this, 0)">
  <td>Option 5 - Row-odd</td>
  <td><input type="radio" name="payment" value="option 5" /></td>
</tr>
<tr class="moduleRow-even" onclick="selectRowEffect(this, 1)">
  <td>Option 6 - Row-even</td>
  <td><input type="radio" name="payment" value="option 6" /></td>
</tr>
</table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多