【问题标题】:Need help on making my Javascript unobtrusive需要帮助以使我的 Javascript 不显眼
【发布时间】:2011-11-11 19:55:08
【问题描述】:

所以我在 HTML + Javascript 中创建了一个订单表单,我想要使用 Javascript 的目的是当有人将鼠标悬停在汤的“标签”上时,隐藏的 div 将可见(稍后我打算获取将显示有关其标签悬停在上面的汤的信息的代码)。我已经设法让它工作了,但我知道我实现的 Javascript 代码很突兀,我想将相同的代码(或等效代码)放到我的外部 Javascript 文件中以使其不突兀。

这是我表单中的一段代码(使用“突兀”的 Javascript):

<form method="post" action="#" name="souporderform" id="souporderform" onsubmit="return validate()">
**<div id="soupinfo"></div>** <!-- hidden div -->

<table>

<tr><th>Item</th><th>Price</th><th>Quantity</th><th id="subtotal_header">Subtotal</th>
<tr>
<td><label for="chicken_quantity" onmouseover="document.getElementById('soupinfo').style.visibility = 'visible';" onmouseout="document.getElementById('soupinfo').style.visibility = 'hidden';">Chicken Soup</label></td>
<td>$3.50<input type="hidden" id="chicken_price" value="3.50"></td>
<td class = "center"><select id="chicken_quantity" name="chicken_quantity" size="1">
<option value="10">10</option>
<option value="9">9</option>
<option value="8">8</option>
<option value="7">7</option>
<option value="6">6</option>
<option value="5">5</option>
<option value="4">4</option>
<option value="3">3</option>
<option value="2">2</option>
<option value="1">1</option>
<option value="0" selected>0</option>
</select>
</td>
<td id="chicken_subtotal"></td>

我确信对于查看此内容的经验丰富的 Javascript 编码人员来说,突兀的 Javascript 是显而易见的......

这是与“隐藏”div 相关的 CSS 代码片段:

#soupinfo{
position:absolute;
background-color:#ff0000;
color:#000000;
width:100px;
height:20px;
margin-top:-20px;
margin-left:0px;
border:1px solid black;
visibility:hidden;
}

我确实有一个外部 Javascript 文件,这是我试图以一种不显眼的方式复制我想要的内容:

var soupInfoDiv = document.getElementById("soupinfo");
var formLabel = document.getElementsByTagName("label");

for(var i = 0; i < formLabel.length; i++){
formLabel[i].onmouseover = soupInfoDiv.style.visibility = 'visible';
formLabel[i].onmouseout = soupInfoDiv.style.visibility = 'hidden';
}

这段代码放在一个名为“setup”的函数中,在页面加载时执行,代码如下:

if (document.getElementById) {
window.onload = setup;
}

因此,如果有人可以帮助我,我将非常感激 :)。如果提供代码片段使整体问题难以破译,我可以将所有代码上传到我的网站并在此处分享。

【问题讨论】:

  • 为了减轻您的开发困难,您是否查看过 JavaScript 库?我建议jQuery
  • 你为什么要检查document.getElementById的存在?

标签: javascript unobtrusive-javascript onmouseover onmouseout unobtrusive


【解决方案1】:

正如 Blender 所评论的,我还建议为此使用 javascript 库,例如 jQuery 或 MooTools。现在,如果我对您的理解正确,您只需将鼠标悬停在元素 x 上时,您希望显示元素 y。这可以通过使用 html 5 的数据属性(适用于旧版浏览器)和一个 javascript 框架(我将在这里使用 jQuery,但如果您需要 mootools 来代替,只需询问,我会翻译它即可完成) )。

首先你应该像这样记下你想要悬停的元素:

<div data-hover-elm="id_of_item_to_show">.......</div>

它可能是一个 div、一个标签或任何你想要的东西。

然后,在外部的js文件中,你需要做的就是:

$(function() {
    var elms = $('[data-hover-elm]');
    $.each(elms, function() {
        var $this = $this,
            $itm = $('#' + $this.attr('data-hover-item'));
        $this.hover(function() {
            $itm.show();
        }, function() {
            $itm.hide();
        });
    });
});

【讨论】:

  • 或者只是$('[data-hover-elm]').hover(function(){$('#' + $(this).data('hover-item')).show();}, function(){$('#' + $(this).data('hover-item')).hide();})。无需单独绑定每个hover 事件。 data() 方法可用于获取data- 属性。另外,您可以使用$('[data-hover-elm]').each(...) 代替$.each($('[data-hover-elm]'), ...)
  • 大家好,感谢您的所有想法 :)... @Logan F. Smyth - 您的解决方案完美运行 :)。所以在这样的情况下(以及其他事情,例如复选框、单选按钮等)你必须使用函数吗?我只是想通过使用循环遍历表单中的每个“标签”元素并使用鼠标事件来使其工作,但我理解您的解决方案并将其作为学习练习。尽管我已经做了一年的 php 和 Java,但 Javascript 对我来说仍然很新,但几个月后我应该至少掌握基本知识......
  • @logan f.smyth - 忘记添加这个来回复......所以当你在一般情况下实现处理程序时,它们是否需要集成为函数?我已经明白了,这将有助于确认我的想法,仅此而已:)。
  • 只是一个提示 Rob,您应该接受其中一个作为答案以获得您的接受率!= 0%。
【解决方案2】:

我看到的主要问题是 mouseover 和 mouseout 处理程序需要是函数。

var soupInfoDiv = document.getElementById("soupinfo");
var formLabel = document.getElementsByTagName("label");

for(var i = 0; i < formLabel.length; i++){
  formLabel[i].onmouseover = function() {
    soupInfoDiv.style.visibility = 'visible';
  }
  formLabel[i].onmouseout = function() {
    soupInfoDiv.style.visibility = 'hidden';
  }
}

我建议你考虑使用 jQuery,因为所有这些,包括 window.load 都可以简化为:

$(function() {
  $('#souporderform label').hover(
    function() {
      $('#soupinfo').css('visibility', 'visible');
    },
    function() {
      $('#soupinfo').css('visibility', 'hidden');
    }
  );
});

【讨论】:

  • window.onload 不是$(document).ready(),而是$(window).load()。但是,文档就绪是首选,因为它比窗口加载早得多,并且对于事件绑定完全稳定。
猜你喜欢
  • 2017-10-05
  • 2015-08-06
  • 2021-05-16
  • 1970-01-01
  • 2022-01-04
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多