【问题标题】:querySelectorAll functions's live alternativequerySelectorAll 函数的实时替代方案
【发布时间】:2013-09-24 03:44:03
【问题描述】:

基于this tutorial(这里是直播demo

尝试在我的项目中实现此功能。如你所见

<button class="md-trigger" data-modal="modal-16">Blur</button>

触发模态。问题是,在我的项目中,这个按钮是 ajax 结果并且不会触发模式。

因此需要对modalEffects.js 进行一些更改(代码如下)。

但不知道必须改变什么?

var ModalEffects = (function () {

    function init() {

        var overlay = document.querySelector('.md-overlay');

        [].slice.call(document.querySelectorAll('.md-trigger')).forEach(function (el, i) {

            var modal = document.querySelector('#' + el.getAttribute('data-modal')),
                close = modal.querySelector('.md-close');

            function removeModal(hasPerspective) {
                classie.remove(modal, 'md-show');

                if (hasPerspective) {
                    classie.remove(document.documentElement, 'md-perspective');
                }
            }

            function removeModalHandler() {
                removeModal(classie.has(el, 'md-setperspective'));
            }

            el.addEventListener('click', function (ev) {
                classie.add(modal, 'md-show');
                overlay.removeEventListener('click', removeModalHandler);
                overlay.addEventListener('click', removeModalHandler);

                if (classie.has(el, 'md-setperspective')) {
                    setTimeout(function () {
                        classie.add(document.documentElement, 'md-perspective');
                    }, 25);
                }
            });

            close.addEventListener('click', function (ev) {
                ev.stopPropagation();
                removeModalHandler();
            });

        });

    }

    init();

})();

【问题讨论】:

  • querySelectorAll 没有现成的选择,就像任何其他获取 DOM 元素的方法一样,它获取那里的任何东西,而不是将来可能存在的东西?事件委托是另一回事!
  • @adeneo 你有什么建议?
  • 取决于你真正想要做什么?
  • @adeneo:如果稍后再次检查集合,其他获取 DOM 元素的方法,如 getElementsByTagName() 将包含调用后添加的元素。但是,将任何集合转换为数组都会在数组转换时冻结它。
  • @adeneo 你读过我的问题了吗?

标签: javascript jquery ajax modal-dialog live


【解决方案1】:

只允许延迟初始化阶段。

init(); 更改为return init

然后当DOM准备好并且内容已经加载完毕,调用ModalEffects();

但是最好的方法是使用事件委托,它基本上是监听容器上的事件(例如document.body)而不是每个单独的元素。这不仅减少了所需的事件处理程序的数量,而且还自动考虑了 DOM 更改。

【讨论】:

  • 我同意你的观点,这个复杂的功能是为页面上的所有按钮创建的。但我只使用一种类型的按钮。所以我认为必须有办法简化这段代码。你能帮我简化一下吗?
  • @heron,不是现在,但只要我有足够的时间,我会的。同时你也可以尝试自己做stackoverflow.com/questions/1687296/…我相信你;)
  • 我修改为这个pastebin.com/HB6hWJgK。现在它不起作用。我做错了什么?
  • @heron,你的 jsfiddle 似乎与这个问题没有直接关系。我认为你应该接受这个答案,然后再问一个。
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多