【问题标题】:Trying to implement live querySelectorAll尝试实现实时 querySelectorAll
【发布时间】:2019-04-16 00:19:36
【问题描述】:

我正在尝试在我的代码中实现这个答案:https://stackoverflow.com/a/30581545/10471818,但是我收到错误:Uncaught TypeError: Cannot read property 'classList' of undefined,这是我的代码:

我应该怎么做?它显示了这一行的错误:$items[nextItem].classList.add('show'); 我认为它确实会实时更新以无法正确定位数字

let slide = {};
async function updateProduct(colorElement) {
    await resetBorder();
    await hideSlideshow();
    document.querySelector(`.${colorElement}`).classList.add('border-enabled');
    document.querySelector(`.${colorElement}-slideshow`).style.display = 'block';
    slide.current = `.${colorElement}-slideshow`;
}

(function () {
    let counter = 0,
        $items = querySelectorAllLive(document, `${slide.current} figure`),
        itemsAmount = $items.length;
        console.log($items);

    const showItem = function () {
        const nextItem = Math.abs(counter % itemsAmount);

        [].forEach.call($items, function (el) {
            el.classList.remove('show');
        });

        $items[nextItem].classList.add('show');
    };

    document.querySelector('.next').addEventListener('click', function () {
        counter++;
        showItem();
        updateOrder();
    }, false);

    document.querySelector('.prev').addEventListener('click', function () {
        counter--;
        showItem();
        updateOrder();
    }, false);
})();

function querySelectorAllLive(element, selector) {
    var result = Array.prototype.slice.call(element.querySelectorAll(selector));

    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            [].forEach.call(mutation.addedNodes, function (node) {
                if (node.nodeType === Node.ELEMENT_NODE && node.matches(selector)) {
                    result.push(node);
                }
            });
        });
    });

    observer.observe(element, {
        childList: true,
        subtree: true
    });

    return result;
}
.slideshow {
  position: relative;
  display: block;
  overflow: hidden;
}

figure {
  position: absolute;
  opacity: 0;
  transition: 1s opacity;
}

figure.show {
  opacity: 1;
  position: static;
  transition: 1s opacity;
}

.prev {
  position: absolute;
  left: 7%;
  top: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: rotate(90deg);
  -ms-transform: rotate(90deg);
  transform: rotate(90deg);
}

.next {
  position: absolute;
  right: 7%;
  top: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: rotate(-90deg);
  -ms-transform: rotate(-90deg);
  transform: rotate(-90deg);
}

.box {
  height: 50px;
  width: 50px;
  -webkit-box-shadow: 0 0 7px black;
  box-shadow: 0 0 7px black;
}

.platin {
  background: rgb(255, 255, 255);
  background: linear-gradient(220deg,
    rgba(255, 255, 255, 1) 0%,
    rgba(110, 110, 110, 1) 100%);
}
<div class="slideshow platin-slideshow">
            <figure class="show" data-product="950 PLATIN - €7500"><img id="mi-image" src="assets/img/svg/950 PLATIN.svg"
                    height="280"></figure>
            <figure data-product="950 PLATIN - BLUE SAPPHIRE - €7500"><img id="mi-image" src="assets/img/svg/950 PLATIN - BLUE SAPPHIRE.svg"
                    height="280"></figure>
            <figure data-product="950 PLATIN - GREEN SAPPHIRE - €7500"><img id="mi-image" src="assets/img/svg/950 PLATIN - GREEN SAPPHIRE.svg"
                    height="280"></figure>
            <figure data-product="950 PLATIN - YELLOW SAPPHIRE - €7500"><img id="mi-image" src="assets/img/svg/950 PLATIN - YELLOW SAPPHIRE.svg"
                    height="280"></figure>
        </div>
<span class="prev"><img src="assets/img/svg/arrow.svg" height="80"></span>
<span class="next"><img src="assets/img/svg/arrow.svg" height="80"></span>

<div class="box platin" onClick="updateProduct('platin')"></div>

【问题讨论】:

  • 你能用 HTML 添加你的完整代码吗?看起来当前的代码还可以
  • 包含完整的 HTML
  • 你怎么称呼updateProductcolorElement的值是多少?
  • 对不起,也包括在内

标签: javascript


【解决方案1】:

我解决了这个问题:

let slide = {
    current: '.silver-slideshow'
};
async function updateProduct(colorElement) {
    await resetBorder();
    await hideSlideshow();
    document.querySelector(`.${colorElement}`).classList.add('border-enabled');
    document.querySelector(`.${colorElement}-slideshow`).style.display = 'block';
    slide.current = `.${colorElement}-slideshow`;
}

let counter = 0;
const showItem = function (items) {
    let $items = document.querySelectorAll(`${items} figure`),
        itemsAmount = $items.length;

    const nextItem = Math.abs(counter % itemsAmount);

    [].forEach.call($items, function (el) {
        el.classList.remove('show');
    });

    $items[nextItem].classList.add('show');
};

document.querySelector('.next').addEventListener('click', function () {
    counter++;
    showItem(slide.current);
    updateOrder();
}, false);

document.querySelector('.prev').addEventListener('click', function () {
    counter--;
    showItem(slide.current);
    updateOrder();
}, false);

【讨论】:

    【解决方案2】:

    你声明

    let slide = {};
    

    然后执行自调用函数

    (function () {
        let counter = 0,
            $items = querySelectorAllLive(document, `${slide.current} figure`),
            itemsAmount = $items.length;
            console.log($items);
            ...
     }
    

    当时幻灯片只是一个 empy 对象,您可以在其中尝试访问 slide.current,即 undefined

    如果我错了,请纠正我

    【讨论】:

    • 是的,这就是为什么我尝试实现实时 querySelectorAllLive 函数来实时检查更改还是它不能像这样工作?
    • slide 在模板字符串解析它时只是一个空对象。第一次 slide.current 存在是在 slide.current = .${colorElement}-slideshow;
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多