【问题标题】:Execute jQuery after changing DOM更改 DOM 后执行 jQuery
【发布时间】:2012-11-23 09:02:42
【问题描述】:

这段代码在将图像拖入 div 元素后将图像添加到 DOM。

var showImage = function (ev) {
    var file = ev.target.file;

    var thumb = new Image(100,100);
    thumb.src = ev.target.result;
    thumb.className = 'thumbFoto';
    thumb.title = file.name;
    thumb.alt = file.name;

    var anchor = document.createElement('a');
    anchor.className = 'thumbLink';
    anchor.href = ev.target.result;
    anchor.rel = 'album1';
    anchor.title = file.name;
    anchor.appendChild(thumb);

    dropZone.appendChild(anchor);
}

此代码使用

链接到页面
<script type="text/javascript" src="js/code.js"></script>

图片添加到网页后,我想使用 Fancybox 预览它们。 当页面加载时(在我将任何图像拖到它上面之前),这个脚本在 html-header 中执行:

<script type="text/javascript">
    $(document).ready(function() {
        /* Apply fancybox to albums */
        $("a.thumbLink").fancybox();
    });
</script>

现在如何确保可以使用 Fancybox 预览最近添加的图像?

【问题讨论】:

  • 如何拖动图像?您应该在 stop() 拖动事件上调用 $("a.thumbLink").fancybox();
  • 如果您使用的是fancybox v1.3.4,该版本不支持动态添加元素。检查stackoverflow.com/a/9084293/1055987 以获得解决方法。 2.x版本使用live,所以只需要正常初始化fancybox即可。

标签: javascript dom dom-events fancybox


【解决方案1】:

尝试使用“责任链”模式通过单个对象路由所有 DOM 更改。这样,对象就可以跟踪对 dom 的任何更改。然后我会使用 ConversationJS 来触发一个函数,它可以在 DOM 更改上做任何你想做的事情:https://github.com/rhyneandrew/Conversation.JS

【讨论】:

    【解决方案2】:

    我假设你使用 jQuery UI 可拖动对象,你可以在你的可拖动对象的stop() 事件上调用你的fancybox,像这样:

    $( ".selector" ).draggable({
        stop: function( event, ui ) {
            $("a.thumbLink").fancybox();
        }
    });
    

    编辑:

    根据您的代码,您可以简单地将您的fancybox 调用方置于showFileInList 的函数中,如下所示:

    var showFileInList = function (ev) {
        var file = ev.target.file;
    
        if(document.getElementById("fileDropText")){
            var textToBeRemoved = document.getElementById("fileDropText");
            var imageToBeRemoved = document.getElementById("fileDropImg");
            textToBeRemoved.parentElement.removeChild(textToBeRemoved);
            imageToBeRemoved.parentElement.removeChild(imageToBeRemoved);
        }
    
        var thumb = new Image(100,100);
        thumb.src = ev.target.result;
        // var thumb = createThumb(ev.target.result);
        thumb.className = 'thumbFoto';
        thumb.title = file.name;
        thumb.alt = file.name;
    
        var anchor = document.createElement('a');
        anchor.className = 'thumbLink';
        anchor.href = ev.target.result;
        anchor.rel = 'album1';
        anchor.title = file.name;
        // anchor.addEventListener("click", showImagePreview, false);
        anchor.appendChild(thumb);
    
        // fileList.insertBefore(anchor, dropZone);
        dropZone.appendChild(anchor);
    
        // show fancybox
        $("a.thumbLink").fancybox({type: "inline", href: "#fileDrop"});
    }
    

    查看工作代码HERE

    【讨论】:

    • 用于将图像从桌面拖动到浏览器的代码只是 javascript。没有 jQuery,没有 Ajax 或其他任何东西。你可以在这里找到它:student.kuleuven.be/~s0179967/code.js
    • 非常感谢您为帮助我所做的努力。但我可能还没有让自己足够清楚。目标是将图像从桌面拖到拖放区。那里会自动生成一个缩略图。然后,当您单击缩略图时,完整的图像应该会显示为 fancybox。就像下面紫色区域中的图像一样。在student.kuleuven.be/~s0179967/public/index.html 上试用 Javascript 代码可以在这里找到:student.kuleuven.be/~s0179967/public/js/code.js
    • @user1879060 试试我编辑的FIDDLE,它现在可以按你的意愿工作了。另请参阅功能 showFileInList 下必须更改的 javascript。
    • 奇怪。当我添加您的单行代码时,它会显示带有fancybox 的完整“fileDrop”div。按下 next 也会改变 fancybox 中的图片标题,但不会改变图片本身...
    • @user1879060 当然,不客气 :) 你也可以在这里写下你自己的答案,以便其他人遇到类似问题时可以参考。
    猜你喜欢
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多