仅在用户点击项目时加载内容。

时间:2011-07-29 20:21:22

标签: javascript jquery loading

我在博客上有一个情况,我有共享按钮。您单击共享按钮,一个框下拉,显示您可以共享帖子的一些地方。它看起来很酷,但是因为从各种服务器(Facebook,Twitter等)中获取了大量数据,所以它需要比我希望加载页面更长的时间,因为它会在加载这些按钮时遇到麻烦。

如何(最好使用jQuery)我可以这样做,以便当用户点击共享按钮时加载facebook等的按钮,而不是当页面加载时,所以我可以减少页面加载时间?

我一直想知道你是怎么做的,但我从来没有真正需要这样做。

编辑:作为参考,当您单击它时,共享按钮会执行此操作。这不是很复杂。

$('.share').click(function(e) {

            $('.popup-share').fadeOut('100');

    if($(this).parents('.share-is-care').children('.popup-share').is(':visible')) {
        $(this).parents('.share-is-care').children('.popup-share').fadeOut('100');
    }
    else {
        $(this).parents('.share-is-care').children('.popup-share').fadeIn('100');
    }

}

2 个答案:

答案 0 :(得分:1)

如果要加载动态内容,可以使用AJAX函数动态地将该内容添加到页面中,这是将一些代码放入容器的示例:

$('.share').click(function(e) {
    if($(this).parents('.share-is-care').children('.popup-share').is(':visible')) {
        $(this).parents('.share-is-care').children('.popup-share').fadeOut('100');
    } else {
        $.get('http://url_to_get.whatever', function (data) {
            $(this).parents('.share-is-care').children('.popup-share').html(data).fadeIn('100');
        });
    }
}

如果您只想在点击上添加一些静态代码(比如加载外部页面或其他内容的iframe),您可以执行以下操作:

$('.share').click(function(e) {
    if($(this).parents('.share-is-care').children('.popup-share').is(':visible')) {
        $(this).parents('.share-is-care').children('.popup-share').fadeOut('100');
    } else {
        $(this).parents('.share-is-care').children('.popup-share').html('<iframe src="http://www.foo.bar/script.bam"></iframe>').fadeIn('100');
    }
}

答案 1 :(得分:0)

如果你想拥有你描述的功能,那么你可能需要学习一些AJAX。

从本质上讲,你目前正在嵌入一个提供类似系统的其他方的脚本(Facebook,Twitter,Google,......)。这会加载页面加载并使用各种类似的按钮填充一些元素。现在,您需要延迟执行嵌入式脚本,直到发生某些事件(用户单击共享按钮)。

有一篇详细的博客文章,其中包含Facebook的示例代码,例如按钮,但所有网站的流程基本相同。请参阅http://www.torbenleuschner.de/blog/119/ladezeit-facebook-like-button-per-jquery-nachladen/(德语)

关键是要有一个空元素来保存按钮,这些按钮仅在事件发生后填充(在您的情况下单击)。例如:

<div class="popup-share"></div>

然后您需要以与当前使用相同的方式等待事件。但是,不是在加载的页面上创建按钮创建脚本,我们将假设它们包含在buttons-fragment.html中。

// Delay function's execution until click and call it exactly once
$('.share').one('click', function loadLikeButtons(e) {
    // Get the empty element
    var likeButtonContainer = $('.popup-share');
    // Fetch the code which contains the buttons (this is AJAX in the background)
    $.get('your-server.com/buttons-fragment.html', {}, function fillInLikeButtons(data){
        // The code in this inner function runs as soon as the code for the buttons is available / was successfully loaded.
        // The argument data contains the same HTML fragment that you are currently using to create the buttons
        // Place the buttons (or button initialization scripts within the still empty button holder
        likeButtonContainer.html(data);
    });
});

注意具有更好性能的解决方案省略了获取HTML片段的AJAX请求。而是使用页面加载传输它,但将其保存在JavaScript变量中。单击共享按钮将其注入空按钮保持元素。我没有提出这个解决方案,因为我认为在你的问题的答案中只有一个解决方案更容易理解。您可能想要打开另一个关于如何使用页面加载传输HTML片段并将其注入某些事件的问题。

另请注意,我从未真正测试过上面输入的代码。你也许可以打错字。

作为附注(不是答案的一部分):在向您的网站添加类似按钮以及与性能相关的内容时,请注意与隐私相关的问题。我们假设按钮的创建类似于以下代码:

<script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script>
<fb:like layout="box_count" show_faces="false" width="55" font="arial"></fb:like>

一旦浏览器遇到片段,它就会从Facebook加载脚本。在这样做的同时,您的页面地址也会被传输,并可能从Facebook设置Cookie。因此,如果有人仍然登录Facebook,Facebook将能够在您的网站加载后立即跟踪他/她访问您的网站。通过上面给出的答案,这只发生在单击共享按钮时(因为这会导致加载外部脚本)。