javascript - 使用带有外部 JavaScript 文件的 onMouseOver 和 onMouseOut 突出显示表格行

标签 javascript html css

我需要突出显示表格行(不包括表格标题),但我不能使用 CSS 悬停。我必须使用 JavaScript onMouseOver 和 onMouseOut 事件。 JavaScript 必须包含在外部文件中。

我已经在使用外部 JavaScript 文件在页脚中打印日期。出于某种原因,onMouseOver 和 onMouseOut 没有调用“trackTableHighlight”或“highlightTableRow”。我做错了什么?

这是 test.html:

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" type="text/css" href="test.css">
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Test</title>
<script src="test.js"></script>
</head>
<body>
    <div id="wrapper">
        <header>
            <h1>Test</h1>
        </header>

        <nav>
            <ul>
                <li><a href="">Home</a></li>
            </ul>   
        </nav>

        <div class="main">
            <div class="middle-content">
                <br>
                <table class="stripe_table">
                    <tr>
                        <th></th>
                        <th></th>       
                        <th></th>
                        <th></th>
                    </tr>
                    <tbody onMouseOver="trackTableHighlight(event, '#8888FF')" onMouseOut="highlightTableRow(0)">
                        <tr>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td></td>
                            <td></td>
                            <td></td>
                        </tr>
                    </tbody>
                </table>
            </div>
            <footer>
                <p>
                    Today is: 
                    <script>printDate();</script>
                </p>
            </footer>
        </div>
    </div>
</body>
</html>

这是 test.js:

function printDate()
{
    document.write(Date());
}

function trackTableHighlight(mEvent, highlightColor)
{
  if (!mEvent)
    mEvent=window.event;

  // Internet Explorer
  if (mEvent.srcElement)
  {
    highlightTableRow( mEvent.srcElement, highlightColor);
  }
  // Netscape and Firefox
  else if (mEvent.target)
  {
    highlightTableRow( mEvent.target, highlightColor);      
  }
}

function highlightTableRow(myElement, highlightColor)
{
  var i=0;
  // Restore color of the previously highlighted row
  for (i; i<savedStateCount; i++)
  {
    restoreBackgroundStyle(savedStates[i]); 
  }
  savedStateCount=0;

  while (myElement && 
    ((myElement.tagName && myElement.tagName!="TR") || !myElement.tagName))
  {
    myElement=myElement.parentNode;
  }

  if (!myElement || (myElement && myElement.id && myElement.id=="header") )
    return;

  if (myElement)
  {
    var tableRow=myElement;

    if (tableRow)
    {
      savedStates[savedStateCount]=saveBackgroundStyle(tableRow);
      savedStateCount++;
    }

    var tableCell=findNode(myElement, "TD"); 

    var i=0;
    while (tableCell)
    {
      if (tableCell.tagName=="TD")
      {
        if (!tableCell.style)
        {
           tableCell.style={};
        }
        else
        {
          savedStates[savedStateCount]=saveBackgroundStyle(tableCell); 
          savedStateCount++;
        }
        tableCell.style["backgroundColor"]=highlightColor;

        tableCell.style.cursor='default';
        i++;
      }
      tableCell=tableCell.nextSibling;
    }
  }
}

这是 test.css:

html {
    height: 100%;
}

body {
    font-family: Arial, Helvetica, sans-serif;
    background: linear-gradient(to bottom, #FFFFFF, #4F6D93) no-repeat;
    color: #666666;
    height: 100%;
    background-repeat: no-repeat;
    background-attachment: fixed;
}

header {
    background-color: #000033;
    color: #FFFFFF;
    height: 60px;
    text-align: center;
    padding-top: 15px;
}

nav {
    font-weight: bold;
    padding: 20px;
    float: left;
    width: 160px;
}

nav ul {
    list-style-type:none;
    margin: 0px;
    padding-left: 0px;
    font-size: 1.2em;
}

h1 {
    font-family: "Times New Roman", Georgia, Serif;
    margin-top: 0px;
}

footer {
    font-size: 75%;
    font-style: italic;
    text-align: center;
    font-family: "Times New Roman", Georgia, Serif;
    padding: 20px;
}

#wrapper {
    margin: auto;
    width: 80%;
    background-color: #90C7E3;
    min-width: 960px;
    max-width: 2048px;
    box-shadow: 3px 3px 3px #333333;
    position: relative;
}

.middle-content {
    padding-left: 1%;
    padding-right: 1%;
    padding-bottom: 1%;
}

.main {
    background-color: #FFFFFF;
    border: 3px solid white;
    margin-left: 190px;
    padding-left: 30px;
    margin-bottom: 5%;
}

table {
    margin-left:auto; 
    margin-right:auto;
    border-collapse: collapse;
    width: 80%;
    text-align: center;
}

table, th, td {
    border: 2px solid #90C7E3;
}

th, td {
    padding: 15px;
}

th {
    background: #000033;
    color: white;
}

td:nth-child(2) {
    text-align: left;
}

最佳答案

这是 jsfiddle 中的一个小测试:https://jsfiddle.net/a2Lxqxqe/2/ (我不确定浏览器兼容性问题,但您可以看到它在 Chrome 中运行良好):

document.addEventListener("DOMContentLoaded", function(event) { 
  var tr = document.getElementsByTagName("tr");

  for (var i = 0; i < tr.length; i++) {
      tr[i].addEventListener("mouseover", function() {
          this.style.backgroundColor = "#8888FF";
      });

      tr[i].addEventListener("mouseout", function() {
          this.style.backgroundColor = "transparent";
      });
  }
});


function printDate() {
  document.write(Date());
}

如果您需要支持 IE8 及更低版本和/或 Opera 6 及更低版本,则可以使用 attachEvent() 而不是 addEventListener。这是对此的一点引用:http://www.w3schools.com/jsref/met_document_addeventlistener.asp

我将代码包装在 document.addEventListener("DOMContentLoaded", function(event){ ... }) 中,以便代码在加载 DOM 后执行,否则您将得到一个悬停时出错。

关于javascript - 使用带有外部 JavaScript 文件的 onMouseOver 和 onMouseOut 突出显示表格行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36773608/

相关文章:

javascript - AngularJS - 如何将纯 JavaScript 插件转换为 Angular 指令(?)

javascript - instanceof 检查 JavaScript 工厂模式

javascript - 使用 JavaScript 对 localStorage 进行编辑的性能?

html - 在元素之间显示伪元素

asp.net - 标题的背景图像不起作用

html - 如何将图像变成圆形? Bootstrap 3

javascript - Expressjs 从变量路由

javascript - “fn”不是 Angular 和 Webpack 的函数

html - 如何设置两张图片超越另一张图片?

javascript - 滚动浏览 Chrome 中的某个部分时,jQuery Waypoint 粘性菜单出现闪烁问题