【问题标题】:How can I swap those 2 div?我怎样才能交换那 2 个 div?
【发布时间】:2012-06-18 23:43:02
【问题描述】:

我有一个名为 Target 的空 Div:

<div id="target"></div>

还有一个名为 list 的 div:

<div id="list">
    <ul>
        <li><img id="1" src=".." /></li>
        <li><img id="2" src=".." /></li>
        <li><img id="3" src=".." /></li>
    </ul>
</div>

我想要的是,在用户点击时,将 img 放入 div 目标,并将其大小调整为更大的尺寸。我可以轻松做到这一点。
如果用户单击另一个 div 或另一个按钮(其他地方的箭头或下一步按钮),我希望第一个 div 回到它的位置,并被新的(或列表中的以下内容,或如果是最后一个显示的 div,则为第一个)。
我尝试了几种方法,但我的 jQuery 还不够好。

(在有人问之前,一切都是本地的,如果这改变了任何东西,就没有服务器端)

【问题讨论】:

    标签: jquery


    【解决方案1】:

    我完全不确定这是否是最好的方法,甚至是一种有效的方法,但它似乎可以满足您的需求。

    DEMO: Using cloning

    $("ul li img").on("click", function() {
        var currentImage = $(this);
        var hiddenImage = $("ul li img[hidden='hidden']");
    
        $("#target").html("");
        currentImage.clone().appendTo('#target');
    
        hiddenImage.removeAttr("hidden");
        currentImage.attr("hidden", "hidden");
    });​
    

    根据 cmets,某些元素可能是视频文件。而不是使用clone(),可以移动元素并留下一个占位符。

    DEMO: Using a place-holder

    $("ul li img").on("click", function() {
        var currentImage = $(this);
        var lastImage = $("#target img");
        var placeHolder = $("#last-image-position");
    
        lastImage.insertBefore("#last-image-position");
        $("#last-image-position").remove();
    
        $("<div id='last-image-position'><div>").insertBefore(currentImage);
    
        currentImage.appendTo('#target');
    });​
    

    编辑
    使用实际图像更新了演示。

    【讨论】:

    • 哼...可能会奏效。只有1个问题,当您清除目标div时,其中的克隆图像也会从内存中完全消失吗? (列表中也会有视频,这是我朋友的演示网站,他正在做宣传,电影和视频蒙太奇,我不希望如果浏览太多视频,画廊会变得迟钝)
    • @ThierrySavardSaucier:请参阅编辑以获取替代方案,使用占位符代替。
    • aaa,从来没有真正使用过这个 jsfiddle,它很适合测试东西!但是,是的,你的例子做了我想要的,很多。唯一的问题是这个“占位符”文本最终出现在结果窗格中并显示在第三张图像下的结果区域中,一旦你稍微交换它们,文本就会变得混乱,但这可能只是我搞砸了你的代码,我会尝试在我的页面上测试它并查看结果
    • 只删除div标签之间的文字。这仅用于演示,不需要功能。我添加了 hidden 属性的使用,但如果您删除文本,您可能不需要它。
    【解决方案2】:

    工作演示交换 div 内容:http://jsfiddle.net/BKNjB/2/

    如果我错了,请告诉我。 :)

    行为 - 将有 2 个警报 beforeafter,下面的其余部分更有意义。

    或者可能是这样的:http://jsfiddle.net/vJTyf/6/ 或者像这样交换图像每次点击图像时交换图像的东西:http://jsfiddle.net/vJTyf/9/(是的,你可以这样做它以更整洁的方式:)

    代码

    $(document).ready(function() {
        alert(' Before swap HTML in target is :==> ' + $('#target').html());
    
            var targetHtml = $('#target').html();
            var listHtml = $('#list').html();
    
            $('#target').html(listHtml);
            $('#list').html(targetHtml);
    
        alert(' After swap HTML in target is :==> ' + $('#target').html());
    
    });​
    

    【讨论】:

    • 我认为 OP 不想交换完整的 div 内容。我相信 OP 只想将所选图像添加到目标 div 中,并在单击另一张图像时将目标 div 中的图像替换为新图像,但还将最后选择的图像放回列表中的旧位置。类似的东西。
    • @FrançoisWahl lol 嗯(Buzzinga - 现在我很困惑):P OP 你能不能读一下这个 cmets 并启发我们可怜的人,一些困惑? 但是您可以使用相同的功能来交换图像。在div 之间,请让我知道,CHeerios!
    • @Tats_innit 将其视为图像库。我得到了一个包含图像的列表,当用户单击一个时,该图像进入目标 div。当用户点击另一张图片时,第一张图片返回列表,新图片进入目标 div。
    • @Tats_innit 我的第一次尝试看起来像你的,但它在页面加载(或刷新)时给我一个问题,在 div 中没有图像。如果我尝试你的方式,我会收到一个错误,说明操作左侧的错误(targetHtml 为空)。
    • @ThierrySavardSaucier 很酷,你能做一个更接近的 jsfiddle,我可以帮你吗? :)
    【解决方案3】:

    也许你的意思是这样的:

    $('#target').replaceWith($('#list'));
    

    【讨论】:

    • 对不起,我正在编辑我的帖子,我一直在反射点击标签
    • @ThierrySavardSaucier。第一次修改至少我虽然明白,现在我瞎了……
    • 好的,我正在尝试制作某种简单的幻灯片,我希望如果用户选择图像(iamge id 1),他可以在屏幕中间看到更大的图像(在目标 div 上),如果他点击另一个图像(id 2),新图像(id2)进入目标 div,图像(id 1)返回 ul。抱歉,如果我不是 100% 清楚,英语不是我的主要语言
    • @gdoron:在最后一次编辑之后,问题不再完全一样了。它更具体地用于在目标 div 和图像列表之间交换选定的图像,......我认为。
    • @FrançoisWahl 知道了,我想在列表和目标之间交换图像。我可以从列表中取出 1 项并自己将其放入目标 div 中,这非常简单,但它让这张图片回到它的起始位置给我带来了问题。
    【解决方案4】:

    也许你想要这个

    $(function(){
        $('#list li').on('click', 'img', function(e){
            var img=$(this);
            $('#target').html(img.clone()) .width(img.width()).height(img.height());
        });
    
        $('#target').on('click', function(e){
            $(this).html('').prop('title', '').width(200).height(200); // original size
        })
        .on('mouseenter', function(e){
            if($(this).html()!='') $(this).prop('title', 'Click to clear');
        })
        .on('mouseleave', function(e){
            $(this).prop('title', '');
        });            
    });
    

    DEMO.

    更新:(您要求的)

    $(function(){
        $('#list li').on('click', 'img', function(e){
            if($('#target').html()!='')
            {
                $('#list ul li:empty').html($('#target').html());
            }
            var img=$(this);
            $('#target').html(img).width(img.width()).height(img.height());
        });
    
        $('#target').on('click', function(e){
            $('#list ul li:empty').html($('#target').html());
            $(this).html('').prop('title', '').width(200).height(200);
        })
        .on('mouseenter', function(e){
            if($(this).html()!='') $(this).prop('title', 'Click to clear');
        })
        .on('mouseleave', function(e){
            $(this).prop('title', '');
        });            
    });
    

    DEMO.

    【讨论】:

    • Heera , tx ,这可以工作,但我想要的是一旦图像被点击并进入目标 div,它就会从列表中消失。顺便说一句,你能告诉我 .on("click") 东西是如何工作的文档或信息吗?我在学校从未见过这种情况,而且我看到很多使用这种方法而不是 .click(function(){});
    • 检查更新,我已经按照您的要求进行了更改,谢谢。
    • 似乎也很好用,谢谢,我会测试两者,看看我会使用哪一个
    猜你喜欢
    • 2019-06-21
    • 2015-02-07
    • 2022-09-24
    • 1970-01-01
    • 2012-11-27
    • 2016-07-20
    • 2011-09-03
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多