简体   繁体   English

JavaScript:使用URL作为变量将onClick添加到Div

[英]JavaScript: Adding onClick to Div with URL as a Variable

The code below makes a Div for every object it finds in an array. 下面的代码为其在数组中找到的每个对象创建一个Div。 It then adds a header, a paragraph, an image, and an anchor. 然后,它添加标题,段落,图像和锚点。

The div's actually look like rectangles on top of one another. div实际上看起来像是一个互相叠放的矩形。 What I would like to do is add an onclick attribute to the divs based on the keys within my objects ( coffeShops[i].menu). 我想做的就是根据对象(coffeShops [i] .menu)中的键向div添加一个onclick属性。 When I do so though, clicking just doesn't do anything and i get this error message in console 当我这样做时,单击只是不执行任何操作,并且我在控制台中收到此错误消息

"Uncaught TypeError: Cannot read property 'menu' of undefined" “未捕获的TypeError:无法读取未定义的属性'菜单'”

This only happens when I try window.open with the object key coffeShops[i].menu. 仅当我使用对象键coffeShops [i] .menu尝试window.open时,才会发生这种情况。 If I swap that out with " http://www.google.com " it works just fine. 如果我将其替换为“ http://www.google.com ”,它就可以正常工作。 Also, the links from that variable show up in the console just fine. 同样,该变量的链接也可以很好地显示在控制台中。 So I know it's getting the data from the object just fine. 所以我知道它可以很好地从对象中获取数据。 But for some reason it doesn't want to open from the div. 但是由于某种原因,它不想从div打开。

FYI I'm extremely new to this so apologies if the explanation doesn't make sense. 仅供参考,对于这种解释,我非常陌生,因此如果解释不合理,我们深表歉意。

    var containerDiv = document.getElementById("container");
    console.log(containerDiv);


   for (var i = 0; i < coffeeShops.length; i++){

      var launchMenu = function(){
        window.open(coffeeShops[i].menu);
      }

      console.log(coffeeShops[i].menu);

        var coffeeShopDiv = document.createElement("div");
        coffeeShopDiv.className = "coffeeShop";
        coffeeShopDiv.onclick = launchMenu;
        containerDiv.appendChild(coffeeShopDiv);

        var coffeeShopImage = document.createElement("img");
        coffeeShopImage.src = coffeeShops[i].image;
        coffeeShopImage.className = "coffeeImage";
        coffeeShopDiv.appendChild(coffeeShopImage);

        var coffeeShopHeader = document.createElement("h1");
        coffeeShopHeader.className = "coffeeHeader"
        coffeeShopHeader.innerHTML = coffeeShops[i].name;
        coffeeShopDiv.appendChild(coffeeShopHeader);

        var coffeeShopPar = document.createElement("p");
        coffeeShopPar.className = "coffeeDescription"
        coffeeShopPar.innerHTML = coffeeShops[i].description;
        coffeeShopDiv.appendChild(coffeeShopPar);

        var coffeeMenu = document.createElement("a");
        coffeeMenu.href = coffeeShops[i].menu;
        coffeeMenu.innerHTML = "MENU"
        coffeeShopDiv.appendChild(coffeeMenu);



    };

EDITED: in light of comment 编辑:根据评论

It looks like you need to separate the function which opens the new window from the code which generates page items. 看来您需要将用于打开新窗口的函数与生成页面项的代码分开。 By slightly restructuring your code this can be achieved by using the element.addEventListener() method. 通过稍微重构代码,可以使用element.addEventListener()方法来实现。

/* place the 'launchMenu' outside of 
   the for-loop so it can be accessed
   by each of the target elements */

function launchMenu(event){
    /* get the class attribte of
       the clicked element */
    var clickedClass = event.target.className;
    var targetElement,
        link;
    /* is the clicked element the containing div? */
    if (clickClass !== 'coffeeShop') {
       /* nope */
       targetElement = event.target.parentNode;
    } else {
       /* yep */
       targetElement = event.target;
    }
    /* get 'data-url' of target */
    link = targetElement.getAttribute('data-url');
    /* open the new window */
    window.open(link);
}

/* elsewhere: create elements as before */
for (var i = 0; i < coffeeShops.length; i++){
    var coffeeShopDiv = document.createElement("div");
    coffeeShopDiv.className = "coffeeShop";
    /* add 'data-' attribute to target div */
    coffeeShopDiv.setAttribute('data-url', coffeeShops[i].menu);
    containerDiv.appendChild(coffeeShopDiv);

    var coffeeShopImage = document.createElement("img");
    coffeeShopImage.src = coffeeShops[i].image;
    coffeeShopImage.className = "coffeeImage";
    coffeeShopDiv.appendChild(coffeeShopImage);

    var coffeeShopHeader = document.createElement("h1");
    coffeeShopHeader.className = "coffeeHeader"
    coffeeShopHeader.innerHTML = coffeeShops[i].name;
    coffeeShopDiv.appendChild(coffeeShopHeader);

    var coffeeShopPar = document.createElement("p");
    coffeeShopPar.className = "coffeeDescription"
    coffeeShopPar.innerHTML = coffeeShops[i].description;
    coffeeShopDiv.appendChild(coffeeShopPar);

    var coffeeMenu = document.createElement("a");
    coffeeMenu.className = 'coffeeMenu';
    coffeeMenu.innerHTML = "MENU"
    coffeeShopDiv.appendChild(coffeeMenu);

    /* attach an eventListener to each
       created '.coffeeShopDiv' element */
    coffeeMenu.addEventListener(
        'click', launchMenu, false
    );   
};

The target element ( coffeeShopDiv ) now contains a url-reference in its 'data-url' attriubte and has an event listener assigned. 现在,目标元素( coffeeShopDiv )在其“数据URL”属性中包含一个URL引用,并分配了一个事件侦听器。

When the target element, or any of her child elements, are clicked the launchMenu() function will be invoked. 单击目标元素或其任何子元素时,将调用launchMenu()函数。 This function checks which element was clicked by comparing the className attribute to the class name of 'coffeeShopDiv' - such that if the class name of the clicked element is not 'coffeeShop' the targetElement variable is assigned to the clicked elements parent Node (that is, 'coffeShopDiv'). 此函数通过将className属性与'coffeeShopDiv'的类名进行比较来检查单击了哪个元素-这样,如果单击的元素的类名不是'coffeeShop',则targetElement变量将分配给单击的元素父节点(即,'coffeShopDiv')。

The 'data-url' reference is obtained and used in window.open() . 获得了“ data-url”引用,并在window.open()

Also see: 另请参阅:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM