我的问题分为两部分。一个总体问题,一个与明确代码相关的问题。

一般问题:
是将Javascript读取到加载的内存中,并通过此“安装”,还是每次执行某项操作时都读取Javascript?如何安装处理程序?一旦我在一个元素上.click(),那么处理程序是否就在内存中,包括其中的函数了?我曾经遇到.mouseleave()的麻烦,每次我离开元素时,都再次安装了该函数,这绝对是一件混乱的事情……那么,如何在.click()中使用它呢?然后,函数是否再次读取还是保留在内存中? .mouseleave()的解决方案是:here

具体问题:
我刚刚发现,我使用here.click()函数在第一次单击时运行一次,在第二次单击时运行两次,依此类推?您可以看到它,当您打开链接时,打开控制台并单击图像。单击它再次将其关闭,然后单击ANY(!!)图像,然后按说明进行加载。奇怪吧?尽管切换到true仅在以后的代码中出现,它还是将console.data("installed")布尔值登录为true。
希望您能够帮助我。

jQuery代码:

$('.pfiles').data("installed", false);
if (!$('.pfiles').data("installed")) {
    $('.pfiles img').click(function() {
        var scroll = $('body').scrollTop(),
            imgThis = $(this).attr('src'),
            txtThis = $(this).attr('src').split('/')[2].split('.')[0] + ".txt",
            $this = $(this),
            bigImgH = $(this).height(),
            bigImgW = $(this).width();
        $('.progress').show();
        console.log($('.pfiles').data("installed"));
        $('.pfiles').fadeOut(200, function() {
            $('.big').fadeIn(400);
            $('.frame').height($('.big').height());
        });

        $.ajax({
            type: 'GET',
            url: imgThis,
            dataType: 'HTML',
            success: function(data) {
                $('.big').empty().append("<img src='" + imgThis + "'/>");

                if (bigImgW / bigImgH <= 1.3529411176) {
                    $('.big img').css({'height': '100%'});
                } else {
                    $('.big img').css('width', '100%');
                }

                $('body').scrollTop(0);
                $('.big img').click(function(){
                    $('.big').fadeOut(400, function() {
                        $('.pfiles').fadeIn(400);
                        $('body').scrollTop(scroll);
                        $('.big').empty();
                        $('.frame').height($('.incontent').height());
                    });
                });
                // progress();
            }
        });
    });
    $('.pfiles').data("installed", true);
}


“ HTML”代码

<?php
//Profile catch
$path = 'img/profile';
$profiles = scandir($path);
natsort($profiles);
$profiles = array_reverse($profiles);
$profiles = array_diff($profiles, array('.', '..', '.DS_Store', 'txt'));
?>

<div class="incontent" style="background:white">
<div class="progress">
    <div class="bardiv">
        <div class="bar"></div>
        <p class="bartext text"></p>
    </div>
</div>
<div class="big"></div>
<div class="pfiles">
    <?php
        foreach ($profiles as $pfiles) {
            echo '<img onclick="" src="img/profile/'.$pfiles.'">';
        }
    ?>
</div>




我已经用.data()尝试了相同的技巧,但是每次单击都会保持console.logging(甚至是对!),而且对多个XHR加载都无济于事...(在服务器上没有切换!)

最佳答案

页面处于活动状态时,页面中的Javascript代码将在页面加载时解析并运行,并保留在浏览器的内存中。当用户与页面进行交互时,这些事件发生时,将根据需要调用您的代码可能已安装的任何事件处理程序。

一旦安装了.click()处理程序,该处理程序将在该DOM元素的生存期内保持不变,或者直到您删除click处理程序为止。直到将其删除,每次单击该项目时,都会调用click处理程序。

您只应为给定功能安装一次.click()处理程序。如果您多次安装它,则在单击该项目时将多次调用它。如果您每次单击单击处理程序的次数越来越多,那么显然您的代码每次都单击时将安装另一个单击处理程序,因此您需要修改代码以免这样做。

为了更具体地提供帮助,我们需要知道遇到问题的哪个单击处理程序,并且可能需要查看一些相关的HTML。



您可以通过只为.big img使用一个常量事件处理程序,而不是不断创建一个新的事件处理程序,来简化事件处理代码。您可以使用以下委托事件处理来做到这一点:

$(".big").on("click", "img", function() {
    $(".big").fadeOut(400, function() {
        $('.pfiles').fadeIn(400);
        $('body').scrollTop(scroll);
        $('.big').empty();
        $('.frame').height($('.incontent').height());
    });
});


将此代码放在问题中的任何代码之前,以便仅初始化一次。



这是一个潜在的问题。在代码块的开始,您将具有以下内容:

$('.pfiles').data("installed", false);
if (!$('.pfiles').data("installed")) {


这意味着即使您之前将数据设置为if,也将始终执行true块。您可以仅删除第一行,因为$('.pfiles').data("installed")的默认值为false。您不需要初始化它。然后,在以后调用此方法时,它将尊重您稍后在代码中将其设置为true的事实。

关于javascript - JavaScript(jQuery)和处理程序是从内存运行还是每次读取?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20336570/

10-12 15:12
查看更多