如何识别具有相同类的序列中的哪个div被单击

时间:2015-07-30 05:28:28

标签: javascript html css arrays javascript-events

我有两个数组:

codes=[code1, code2, code3];
quantities=[23, 67, 87];

和这个HTML

<div id='cart_body'></div>

和这个脚本

Delete=function(){

}

document.getElementById('cart_body').innerHTML='';
    cart_text='';
    emp='<div class="close_button" onClick='Delete()'>x</div>';
    open_span='<span class="close_span ">';
    close_span='</span>';
    elf='<br class="none"/>';
    for(i=0; i<product_codes.length; i++){
//the two lines directly below this line are actually one continuous line
        cart_text+=(open_span+codes[i]+"  
        (x"+quantities[i]+")"+close_span+emp+elf);
    }


    document.getElementById('cart_body').innerHTML=cart_text;

和这个css:

.close_button{
display: inline-block;
background-color: grey;
height: 12px;
width: 12px;
border-radius: 6px;
}
span{

display: inline-block;
}

此脚本的目的是编写文本行。每行有一个代码,一个数量,以及一个div。 div也有一些造型进入圆形按钮,但这一点是无关紧要的。

我的问题是:我可以写什么,以便删除函数可以检测类“close_button”中哪个div触发了该函数?

基于此,该函数需要删除该行文本(包含被点击的div的行,代码和数量),以及从他们删除这两个项目(代码和数量)各自的阵列。

我该怎么做?

如果我不够清楚,请随意问:)

感谢您的帮助!

P.S。 (特别感谢工作小提琴的答案); - )

P.P.S。请定期使用JavaScript。没有图书馆或框架。

**即将到来的小提琴

编辑:小提琴Here

点击单击我的按钮。在实际的代码中,我不知道数组中会有多少项,但每个项中的数量都相同。就像我说的那样,我点击了任何一个小的圆形按钮,当它被点击时,删除它自己和同一行上的所有文本,以及该行上文本所代表的数组中的项目。

5 个答案:

答案 0 :(得分:0)

该函数可以更好地命名为 deleteDiv ,或者更通常地命名为 deleteElement ,可以用来删除任何元素。

您可以使用 this 传递对调用侦听器的元素的引用:

emp = '<div class="close_button" onClick="deleteElement(this)">x</div>';

那么函数可以是:

function deleteElement(el) {
  el.parentNode.removeChild(el);
} 

答案 1 :(得分:0)

我可以写什么,以便删除功能可以检测类“close_button”中哪个div触发了该功能?

为此,我首先建议将每个元素放在<div>而不是<span>和单独的<div>中。然后我们可以删除父级:

cart_text+= "<div>"+(open_span+codes[i]+"   (x"+quantities[i]+")"+close_span+emp+elf)+"</div>";

要删除父级,您可以item.parentNode.remove();,在this事件中将元素作为onclick传递:

<div class="close_button" onclick="deleteItem(this)">x</div>

删除元素的功能:

deleteItem = function(item) {
    item.parentNode.remove();
}

Here is a fiddle example.

数组中的项目怎么样?

为此,我们需要从元素中获取文本,删除包含(x[Number])的文本,然后修剪它。从那里我们需要遍历数组并找到具有匹配文本的元素,并从我们的数组中删除该元素。为此,我创建了一个单独的函数来从数组中删除元素:

function removeTextFromArray(array, text){
    for (var i=array.length-1; i>=0; i--) {
        if (array[i] === text) {
            array.splice(i, 1);
            quantities.splice(i, 1); // Removes from quantities at same position
            return array;
        }
    }
}

要获取文本,并删除我们在该文本中不需要的内容:

deleteItem = function(item) {
    item.parentElement.remove();
    // Gets the text in the close_span class of the parent div  
    var textInNode = item.parentNode.getElementsByClassName("close_span")[0].innerHTML;
    // Removes the items in (...) and trims the string.
    textInNode = textInNode.replace(/ *\([^)]*\) */g, "").trim();
    // Takes the string and removes it from the codes array
    codes = removeTextFromArray(codes, textInNode);  
}

Here is a Fiddle Example of that.

答案 2 :(得分:0)

这里一切正常。只需点击运行

product_codes=['code1', 'code2', 'code3'];
quantities=[23, 67, 87];

function deleteIt(e){
  e.parentNode.remove();
}

document.getElementById('cart_body').innerHTML='';
cart_text='';
emp='<div class="close_button" onclick="deleteIt(this)">x</div>';
open_span='<span class="close_span ">';
close_span='</span>';
elf='<br class="none"/>';
for(i=0; i<product_codes.length; i++){
    cart_text+='<div>'+(open_span+product_codes[i]+"(x"+quantities[i]+")"+close_span+emp+elf)+'</div>';
}

document.getElementById('cart_body').innerHTML=cart_text;
.close_button{
display: inline-block;
margin:4px;
  position:relative;
background-color: red;
color:blue;
border:1px solid transparent;
border-radius: 50%;
padding:2px 7px;

cursor:default;  
 
}
.close_button:hover{
border: 1px solid blue;
}
span{

display: inline-block;
}
<div id='cart_body'></div>

答案 3 :(得分:0)

x = document.getElementsByClassName("e");

for (var i=0; i < x.length; i++) {
  x[i].onclick = function() {deleteIt(this)}
  
}

function deleteIt(x) {

    x.style.display = "none"
    
  }
<div class=e>Some text 0</div>
<div class=e>Some text 1</div>
<div class=e>Some text 2</div>
<div class=e>Some text 3</div>
<div class=e>Some text 4</div>
<div class=e>Some text 5</div>

编辑纯JS,感谢这篇文章Applying onClick to Element Array in a For Loop

答案 4 :(得分:0)

如您所愿,这里是以下解决方案,不使用任何frameowrk或库。

HTML:

<div id='cart_body'></div>
<button OnClick='myfunction()'>Click me</button>

JS:

    codes=['hi', 'random text', 'lorem ipsum'];
quantities=[1, 45, 32];
 deleteDiv = function(e) {
    console.log(e);

     var code_name_str = e.currentTarget.parentNode.getElementsByTagName('span')[0].innerText.split('(')[0];

     var code_name = code_name_str.substring(0, code_name_str.length - 1);
     var code_index = codes.indexOf(code_name);
     if (code_index > -1) {
        codes.splice(code_index, 1);
     }
         console.log(codes);
         var code_quantity_str = e.currentTarget.parentNode.getElementsByTagName('span')[0].innerText.split('(')[1];

     var code_quantity = code_quantity_str.substring(0, code_quantity_str.length - 1);
     var quantity_index = quantities.indexOf(parseInt(code_quantity));
     if (quantity_index > -1) {
        quantities.splice(quantity_index, 1);
     }
      console.log(quantities);
    e.currentTarget.parentNode.parentElement.removeChild(e.currentTarget.parentNode);
}
myfunction = function(){
document.getElementById('cart_body').innerHTML='';
    open_div = '<div>'
        cart_text='';
        emp='<div id="sam" class="close_button"  onclick="deleteDiv(event)">x</div>';
        open_span='<span class="close_span">';
        close_span='</span>';
        elf='<br class="none"/>';
    close_div = '</div>'
        for(i=0; i<codes.length; i++){
            cart_text+=(open_div+open_span+codes[i]+"   ("+quantities[i]+")"+close_span+emp+elf+close_div);
        }
        document.getElementById('cart_body').innerHTML=cart_text;
}

CSS:

#cart_body{
    height: 300px;
    width: 300px;
    text-align: center;
    border: 1px solid black;
}
span{
    text-align: center;
    display: inline-block;
}
    .close_button{
    border:  1px solid black;
    width: 12px;
    height:  12px;
    border-radius: 90px;
    font-size: 12px;
    text-align:  center;
    line-height: 11px;
    background-color: lightGrey;
    display:  inline-block;
    margin-left:  20px;
    }
body{
    font-size: 12px;

}
.close_button:hover{
    color: red;
    border: 2px solid red;
    font-weight: bold;
    }

小提琴链接:

https://jsfiddle.net/uhwLg8ss/4/