【问题标题】:How to write this jquery string in pure javascript?如何用纯 javascript 编写这个 jquery 字符串?
【发布时间】:2019-08-14 17:43:09
【问题描述】:

如何用纯 javascript 编写这个 jquery 字符串?我用注释标记了字符串。

function loadGoods() {
    $.getJSON('goods.json', function (data) {
        var out = '';
        for (var key in data){
            out+='<div class="single-goods">';
            out+='<h3>'+data[key]['name']+'</h3>';
            out+='<img src="'+data[key].image+'">';
            out+='<p>Price: '+data[key]['cost']+'</p>';
            out+='<button class="add-to-cart" data-art=" '+key+' "> buy</button>';
            out+='</div>';
        }
            document.getElementById('goods').innerHTML = out;                        
            $('button.add-to-cart').on('click', addToCart); // this string  
    });
}

如果写这个字符串:

document.querySelector ('button.add-to-cart'). addEventListener ('click', addToCart);

该按钮仅通过单击第一个产品卡来捕获事件,但其他产品卡按钮不会捕获按钮单击事件并且不会将商品添加到购物车。

addToCart - 为了更好地理解我将在下面编写的函数

函数addToCart:

function addToCart() {
    var articul = this.getAttribute('data-art');       
    if (cart[articul]!=undefined) {                         
        cart[articul]++;
    }
    else {
        cart[articul] = 1;
    }
    localStorage.setItem('cart', JSON.stringify(cart) );
    showMiniCart();
}

【问题讨论】:

标签: javascript jquery


【解决方案1】:

如果您使用正确的选择器,querySelector 将返回集合的第一个,而 querySelectorAll 将返回所有按钮

所以

document.querySelectorAll('button.add-to-cart').forEach(function(but) {
  but.addEventListener("click",addToCart);
})

但您可以改为从容器委托。

即使在 jQuery 中这也是一个好主意,因为您的按钮是动态添加的

$('#goods').on('click','button.add-to-cart',addToCart); 

变成

document.getElementById('#goods').addEventListener('click', addToCart);

和功能

function addToCart(e) { 
  var tgt = e.target; 
  if (!tgt.matches("button.add-to-cart")) return;
  var articul = tgt.getAttribute('data-art');       
  if (cart[articul]) cart[articul]++;
  else cart[articul] = 1;
  localStorage.setItem('cart', JSON.stringify(cart) );
  showMiniCart();
}

【讨论】:

  • 这是更聪明的答案,但发帖者不会知道为什么,除非你告诉他为什么以及这样做的原因。多对一等
  • @oligofren 请查看我在您发表评论时写的更新
【解决方案2】:

function addToCart(item) {
    console.log('clicked ' + item.target.getAttribute('data-art'));
}


(function(){
    var buttons = document.querySelectorAll("button.add-to-cart");
    buttons.forEach(function (item, index) {
        item.addEventListener("click", addToCart);
    });
})()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<button class="add-to-cart" data-art="aaaa"> buy</button>
<button class="add-to-cart" data-art="bbbb"> buy</button>
<button class="add-to-cart" data-art="cccc"> buy</button>
<button class="add-to-cart" data-art="dddd"> buy</button>

【讨论】:

  • 你能在列表上调用 addEventListener 吗?
  • @mplungjan 稍微更改了我的代码以使其更简洁。但是您的解决方案非常优雅:)
  • 我的意思是:item.addEventListener("click",function(e){ addToCart(this); },false); 可以写成item.addEventListener("click",addToCart);
  • @mplungjan 哦,我现在明白了。我已经更新了答案。感谢您的更正:)
猜你喜欢
  • 2015-03-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多