【问题标题】:HTML + javascript mouse over, mouseout, onclick not working in firefoxHTML + javascript鼠标悬停,鼠标悬停,onclick在Firefox中不起作用
【发布时间】:2010-05-10 05:47:52
【问题描述】:

我的问题是在表格行上获得 onMouseover、onMouseout、onMousedown、onClick。我正在为此调用 javascript 用户定义函数。

onMouseover --- 背景颜色应该改变。 onMouseout --- 重置为原始颜色 onClick --- 应设置第一列复选框/单选按钮并更改背景颜色 onMousedown --- 背景颜色应该改变。

我的 html 代码是:- <tr onMouseOver="hover(this)" onMouseOut="hover_out(this)" onMouseDown="get_first_state(this)" onClick="checkit(this)" >

而javascripts中的方法是:-

var first_state = false;

var oldcol = '#ffffff'; var oldcol_cellarray = new Array();

函数悬停(元素){

if (! element) element = this;
while (element.tagName != 'TR') {
    element = element.parentNode;
}

if (element.style.fontWeight != 'bold') {
    for (var i = 0; i<element.cells.length; i++) {
        if (element.cells[i].className != "no_hover") {
            oldcol_cellarray[i] = element.cells[i].style.backgroundColor;
            element.cells[i].style.backgroundColor='#e6f6f6';

        }
    }
}

}

// --------------------------------------------- --------------------------------------------------

函数 hover_out(元素) {

if (! element) element = this;
while (element.tagName != 'TR') {
    element = element.parentNode;
}

if (element.style.fontWeight != 'bold') {
    for (var i = 0; i<element.cells.length; i++) {
        if (element.cells[i].className != "no_hover") {
            if (typeof oldcol_cellarray != undefined) {

                element.cells[i].style.backgroundColor=oldcol_cellarray[i];
            } else {
                element.cells[i].style.backgroundColor='#ffffff';

            }
        //var oldcol_cellarray = new Array();

        }
    }
}

}

// --------------------------------------------- --------------------------------------------------

函数 get_first_state(元素) {

while (element.tagName != 'TR') {
    element = element.parentNode;
}
first_state = element.cells[0].firstChild.checked;

}

// --------------------------------------------- --------------------------------------------------

function checkit(元素){

while (element.tagName != 'TR') {
    element = element.parentNode;
}
if (element.cells[0].firstChild.type == 'radio') {
    var typ = 0;
} else if (element.cells[0].firstChild.type == 'checkbox') {
    typ = 1;
}
if (element.cells[0].firstChild.checked == true && typ == 1) {
    if (element.cells[0].firstChild.checked == first_state) {
        element.cells[0].firstChild.checked = false;
    }
    set_rowstyle(element, element.cells[0].firstChild.checked);
} else {
    if (typ == 0 || element.cells[0].firstChild.checked == first_state) {
        element.cells[0].firstChild.checked = true;

    }
    set_rowstyle(element, element.cells[0].firstChild.checked);
}
if (typ == 0) {
    var table = element.parentNode;
    if (table.tagName != "TABLE") {
        table = table.parentNode;
    }
    if (table.tagName == "TABLE") {
        table=table.tBodies[0].rows;
        //var table = document.getElementById("js_tb").tBodies[0].rows;
        for (var i = 1; i< table.length; i++) {
            if (table[i].cells[0].firstChild.checked == true && table[i] != element) {
                table[i].cells[0].firstChild.checked = false;
            }
            if (table[i].cells[0].firstChild.checked == false) {
                set_rowstyle(table[i], false);
            }
        }
    }
}

}

函数 set_rowstyle(r, on) {

if (on == true) {
    for (var i =0; i < r.cells.length; i++) {
        r.style.fontWeight = 'bold';
        r.cells[i].style.backgroundColor = '#f2f2c2';

    }
} else {
    for ( i =0; i < r.cells.length; i++) {
        r.style.fontWeight = 'normal';
        r.cells[i].style.backgroundColor = '#ffffff';
    }
}

}

它在 IE 中按预期工作。

但是来到 Firefox 后,我很惊讶看到这么多编码后的输出。

在 Firefox 中:-- onMouseOver 正在按预期工作。该特定行的颜色变化。

onClick -- 永久设置背景颜色..即使我在不​​同的行上执行 onmouseover。单击的上一行颜色不会重置为白色。 -- 不如预期

单击 2 行..设置两行的背景..只应设置最新的行颜色。之前选择的其他行应该被设置回来..不像预期的那样,即如果我点击所有行..所有内容的背景颜色都会改变...

即使我点击该行。第一列,即单选按钮或复选框未设置..

请帮我在 Firefox 中解决这个问题。请让我知道我的代码需要更改的地方...

提前致谢!!

【问题讨论】:

标签: javascript


【解决方案1】:

很抱歉让所有内容都内联,但这应该适用于所有浏览器:

<tr onmouseover="this.className += ' hover'" onmouseout="this.className = this.className.replace(/(^|\s)hover(\s|$)/,' ');" onclick="if(this.getElementsByTagName('input')[0].checked){this.className = this.className.replace(/(^|\s)click(\s|$)/,' ');this.getElementsByTagName('input')[0].checked = false;}else{this.className += ' click';this.getElementsByTagName('input')[0].checked = true;}">

这是一个您可以测试的完整页面:

<html>
<head>
<style type="text/css">
tr.click{
background:yellow;
}

tr.hover{
background:green;
}
</style>
</head>
<body>
<table border="1">
<tr onmouseover="this.className += ' hover'" onmouseout="this.className = this.className.replace(/(^|\s)hover(\s|$)/,' ');" onclick="if(this.getElementsByTagName('input')[0].checked){this.className = this.className.replace(/(^|\s)click(\s|$)/,' ');this.getElementsByTagName('input')[0].checked = false;}else{this.className += ' click';this.getElementsByTagName('input')[0].checked = true;}">
<td>
<input type="checkbox" readonly="readonly"/> click me
</td>
</tr>
<tr onmouseover="this.className += ' hover'" onmouseout="this.className = this.className.replace(/(^|\s)hover(\s|$)/,' ');" onclick="if(this.getElementsByTagName('input')[0].checked){this.className = this.className.replace(/(^|\s)click(\s|$)/,' ');this.getElementsByTagName('input')[0].checked = false;}else{this.className += ' click';this.getElementsByTagName('input')[0].checked = true;}">
<td>
<input type="checkbox" readonly="readonly"/> click me
</td>
</tr>
<tr onmouseover="this.className += ' hover'" onmouseout="this.className = this.className.replace(/(^|\s)hover(\s|$)/,' ');" onclick="if(this.getElementsByTagName('input')[0].checked){this.className = this.className.replace(/(^|\s)click(\s|$)/,' ');this.getElementsByTagName('input')[0].checked = false;}else{this.className += ' click';this.getElementsByTagName('input')[0].checked = true;}">
<td>
<input type="checkbox" readonly="readonly"/> click me
</td>
</tr>
</table>
</body>
</html>

我强烈建议将所有内容移至外部 JS 文件并使用某种初始化函数来分配事件侦听器,而不是像我一样将它们全部内联。

我希望这在某种程度上有所帮助。

【讨论】:

  • 非常感谢 :-) 效果很好!我只有 4 个月大的 javascript。如果您能详细解释一下,我会很高兴? this.className.replace(/(^|\s)hover(\s|$)/,' ');
  • this 指的是表格行(我想你已经知道了)className 指的是类属性replace(pattern, replacement) 是一个字符串方法,用于通过正则表达式或字符串替换文本this.className.replace(/(^|\s)hover(\s|$)/,' ') 将在 class 属性中查找单词“hover”,该单词前面是 whitepsace 或字符串的开头,后面是空格或字符串的结尾,然后将其替换为单个空格。去这里了解更多关于正则表达式的信息:developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…
  • 感谢您的详细解释。
【解决方案2】:

可能有一个特殊的原因您没有这样做,但是您是否考虑过使用诸如 JQuery 之类的库来解决这个问题?使用 JQuery 的类 CSS 选择器和 .parent/.parents 可以非常轻松简单地完成您在此处尝试实现的目标。

正如 MartyIX 所说,我将首先在 Firebug / Chrome 中使用 console.log 和/或断点来准确检查正在执行的代码块。使用 javascript 调试工具一开始可能有点令人生畏,直到您了解每个选项(步入、跨步)的工作方式,但它们确实允许您检查代码是否按照您认为的方式正常工作。

我在 checkit() 中注意到的一件事 - 声明变量的位置要小心。我不是 javascripts 变量范围的专家,但对我来说,typ 变量似乎只存在于 if 块中。我会在 if 块之前声明“var typ”并使用第三个值或第二个变量来检查是否找到任何复选框或单选(如果没有找到复选框和单选会发生什么?)

【讨论】:

  • Thanku :-) 我会尝试用 firebug 调试。
猜你喜欢
  • 2015-08-08
  • 2015-04-04
  • 1970-01-01
  • 2017-10-14
  • 2017-02-07
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多