【问题标题】:Change element ID onmouseover/onmouseout any element in a class更改元素 ID onmouseover/onmouseout 类中的任何元素
【发布时间】:2012-07-08 06:32:28
【问题描述】:

当我将鼠标悬停在特定类中的不同元素上时,我需要更改元素的 ID。然后,我想将元素 id 从我之前鼠标悬停的同一个元素更改回原来在 mouseout 时的值。

在下面的代码中,我提出了一个基本的 HTML 代码来澄清我的问题。我希望将<div id="Set1"> 更改为<div id="Set2"> onmouseover 任何<div class="tomouseover">。 Onmouseout 从同一个元素我希望将原始元素的 id 改回<div id="Set1">

<div id="Set1">Div to change id</div>
<div class="tomouseover">Mouse over to change Set1 to Set2</div>
<div class="tomouseover">Mouse over to change Set1 to Set2</div>

+1 任何想法!我被皇家卡住了......

【问题讨论】:

  • 我不喜欢。这是在谷歌小工具中。如果必须的话,我可以。

标签: javascript html css javascript-events dom


【解决方案1】:

纯 JavaScript:(归功于 Nathan 的回答)

var ele = document.querySelectorAll(".tomouseover");
for(var i=0; i < ele.length; i++){
    ele[i].addEventListener("mouseover", function(){
        document.querySelector("#Set1").setAttribute("id", "Set2");
    });
    ele[i].addEventListener("mouseout", function(){
        document.querySelector("#Set2").setAttribute("id", "Set1");
    });
}

【讨论】:

  • 这很酷,德里克。一天两个答案!努力提高收视率?
  • +1。我什至不知道纯 JavaScript LOL 中存在名为 document.querySelectorAll() 的东西。我一直在使用 jQuery,但我已经忘记了很多纯 JavaScript 的东西。
  • @Nathan - 这很方便,但是......一如既往,IE 6 和 7 不支持......这有点烦人。
  • @Derek 你的意思是 IE 6 和 7 不支持 document.querySelectorAll() 吗?太糟糕了,我希望 IE 更像 Chrome、Firefox 和 Safari。
  • @Nathan - 看看光明的一面。 IE 8 确实支持.querySelectorAll(),这绝对很酷!
【解决方案2】:

您可以尝试 Derek 的回答,但您很快就会发现 IE8 在 quirks 模式或 IE 7 及更低版本中不支持 querySelector,并且 addEventListener 不受支持IE 8 及更低版本。

纯 js 的选择包括编写自己的 getElementsByClassname 函数(不是特别困难)或使用事件委托,以便为每个事件仅附加一个侦听器,并且需要一个简单的 hasClass 功能。

总之,这里有一个例子:

任何 javscripter 都应该在库中拥有或能够在几分钟内编写代码的一些标准库函数:

// Minimalist addEvent function, ok for the current web
function addEvent(el, fn, evt) {
  if (el.addEventListener) {
    el.addEventListener(evt, fn, false) 
  } else if (el.attachEvent) {
    el.attachEvent('on' + evt, fn);
  } 
}

// Returns true or false depending on whether element el has class classname
function hasClassname(el, classname) {
  var re = new RegExp('(^|\\s)' + classname + '(\\s|$)');
  return re.test(el.className); 
}

完成这项工作的函数:

// Toggle the id. Note that this deals with the case where
// the element to toggle isn't found to prevent errors being thrown
function toggleId(e) {
  e = e || window.event;
  var el = e.target || e.srcElement;
  var o;

  if (hasClassname(el, 'tomouseover')) {

    if (e.type == 'mouseover') {
      o = document.getElementById('set1');

      if (o) o.id = 'set2';

    } else if (e.type == 'mouseout') {
      o = document.getElementById('set2');

      if (o) o.id = 'set1';
    }
  }
}

// Attach the listener onload, could also add from a bottom
// script or inline. If inline, use `toggleId(event)`
window.onload = function() {
  addEvent(document.body, toggleId, 'mouseover');
  addEvent(document.body, toggleId, 'mouseout');
}

以上内容将适用于所有浏览器回到 IE6 和 NN 3 左右,并将继续适用于 W3C 或 IE 事件模型的未来浏览器。

【讨论】:

  • 哇。这对我的代码来说太过分了,但我会试一试!感谢您指出这一点-我没有注意到...
  • 仅供参考,YouTube 也不支持 IE 8。
  • @Derek - 字面意思是侧面弹出......我意识到你的声誉比 RobG 低 8901-10。我更喜欢我的东西在 IE8 中也能工作,这是许多蹩脚的小工具用户仍在使用的版本。下次忠诚:)
  • addEventhasClassname 函数只需编写一次即可添加到库中。与“命名空间”对象捆绑以保持整洁。然后你只是在编写逻辑,无论你使用哪个库(你的或其他人的)你都需要这样做。至于 IE 8 支持,+50% 的 IE 用户使用 8 或更低版本。网络是关于包容性和尽可能广泛的覆盖面(在合理范围内)。正是这种方法阻止了 IE 主宰网络。然而,通过编写不兼容的代码来排除 IE 的开发人员不仅懒惰,而且违背了使 Web 成为现在这样的精神。
【解决方案3】:

如果你可以使用jQuery,下面的代码可以在鼠标移到.tomouseover 上时将#Set1 的id 更改为#Set2,并在鼠标移出时更改回#Set1

$('.tomouseover').mouseover(function() {
    $('#Set1').attr('id','Set2');
}).mouseout(function() {
    $('#Set2').attr('id','Set1');
});​

jsFiddle 示例:http://jsfiddle.net/XNu5H/

希望这会有所帮助!

【讨论】:

  • 你能把它转成 JavaScript 吗:D
  • @wagtail - 如果这是你想要的,请查看我的答案。
  • @Derek 我不够快哈哈,我正在将我的转换为纯 JavaScript,但我不是那么好:P
  • @Nathan - 我把你的名字放在答案中,因为代码是从你的代码转换而来的。 ;)
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
相关资源
最近更新 更多