我的问题分为两部分。一个总体问题,一个与明确代码相关的问题。
一般问题:
是将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/