2017-02-23 59 views
-1

我正在经历地狱,现在试图完成最基本的事情。我已经研究并试图使用replace,classLists等,但无法使其工作。注意:对于任何可以帮助的人,我不想使用JQuery,因为我仍在学习JavaScript。JavaScript - 用另一个交换元素类

我的目标:将具有“热”类的元素交换为冷,并将一类“冷”交换为热<在“无序列表”元素“杂货”内。

function swapClass(){ 

document.getElementById("groceries").querySelectorAll(".hot").classList.toggle("cold"); 
document.getElementById("groceries").querySelectorAll(".cold").classList.toggle("hot");} 

非常感谢。我希望我能在某个地方走上正确的路线。我也尝试过一个for循环,但肯定意识到这甚至不是必需的。也试过了。

+0

你会得到什么结果? – Soviut

+2

@Kinduser绝对是https://developer.mozilla.org/en/docs/Web/API/Element/classList – Soviut

+0

这样,你不是先切换热 - >冷,然后立即切换所有原始.cold再加上所有最近切换的冷 - 立即再次热? –

回答

0

querySelectorAll()返回一个节点列表,所以你必须通过每个项目列表中的迭代:

function swapClass() 
{ 
    var groceries = document.getElementById("groceries"); 
    var hotItems = groceries.querySelectorAll(".hot"); 
    var coldItems = groceries.querySelectorAll(".cold"); 

    for (var item of hotItems) 
    { 
     item.classList.add("cold"); 
     item.classList.remove("hot"); 
    } 

    for(var item of coldItems) 
    { 
     item.classList.add("hot"); 
     item.classList.remove("cold"); 
    } 
} 
+0

好的,我觉得在我尝试过使用循环等之前会有更多的步骤,但由于我的讲师教学/测试JavaScript的方式,我认为它会是几行代码(如其他功能)他已经为我们写了。此外,我修改了代码以匹配上面的内容,但我仍然导致元素1(期待热,导致冷)和元素4(期望冷,导致热)? – TLG123

1

你需要做的是在两个步骤:

  1. 获取列表hot元素和cold元素。
  2. 交换它们。

下面是做这件事:

function swapClass() { 
    // We'll be using these variables in a few places, so let's define them here. 
    var i, element; 

    // Get a reference to the top-level element. 
    var groceriesElement = document.getElementById("groceries"); 

    // Get a list of hot and cold elements. 
    var hotElements = groceriesElement.querySelectorAll(".hot"); 
    var coldElements = groceriesElement.querySelectorAll(".cold"); 

    // Swap the class names. 
    for (i = 0; i < hotElements.length; i++) { 
    element = hotElements[i]; 
    element.classList.add("cold"); 
    element.classList.remove("hot"); 
    } 
    for (i = 0; i < coldElements.length; i++) { 
    element = coldElements[i]; 
    element.classList.add("hot"); 
    element.classList.remove("cold"); 
    } 
} 

注意classList isn't supported in older browsers,但可能并不重要你。如果是这样,你可以包括a polyfill

1

MDN将成为您最好的朋友,他们拥有您可以想到的所有Web API的完整文档。

https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll

https://developer.mozilla.org/en-US/docs/Web/API/Element/classList

querySelectorAll()返回一个节点列表,其类似于一个JS阵列。此类型上没有classList属性,因此您必须对NodeList中的每个元素进行操作。

这是这里的大问题,另一个是你执行交换的方式。在所有'.hot'元素上切换(冷却)类,然后在所有'.cold'元素上切换'热门'类,即可切换(如果存在则删除,如果不存在则添加)。如果你希望在这个操作之前没有元素既热又冷(这看起来基于你的问题),那么结果就是所有'.hot'元素现在都是'.cold',所有'.cold'元素都是现在'.cold'和'.hot'。图片来看,你有4个元素:

<div class="hot"></div> 
<div class="hot"></div> 
<div class="cold"></div> 
<div class="cold"></div> 

函数中的第一条语句执行。你把所有的热元素和切换冷,造成这样的:

<div class="hot cold"></div> 
<div class="hot cold"></div> 
<div class="cold"></div> 
<div class="cold"></div> 

然后你把所有的冷元素和切换热,造成这样的:

<div class="cold"></div> 
<div class="cold"></div> 
<div class="cold hot"></div> 
<div class="cold hot"></div> 

你想要做什么是得到完整的列表,然后在这两个列表中切换两个类别:

var list = document.querySelectorAll('#groceries .hot, #groceries .cold'); 
list.forEach(el => el.classList.toggle('hot')); 
list.forEach(el => el.classList.toggle('cold')); 
+0

'杂货'需要一个散列(#)。否则,这可能是最简洁的答案。 –

+1

感谢您的更正:) – jchitel

+0

好吧,那有点合理。我的讲师以最具误导性和可怕的方式教给我们Web,因为我必须遵循一些功能测试,所以我假设(和其他人一样)它只是几行代码,而不是它的代码。他测试他们的方式是非常单调乏味的。谢谢。 – TLG123

相关问题