2017-09-15 88 views
0

所以我做了很多研究在这个题目.. 我试图做一个动态ligthbox无论哪个加载名称的图像或文件扩展名。 我正在使用自举灯箱。 它工作在3个步骤动态加载图片灯箱(PHP,JSON,使用Javascript,JQuery的,HTML)

  1. PHP文件解析为JSON文件,其中包含指定的文件夹中的所有图像。
  2. 的Javascript获取PHP创建JSON,并创建HTML,类坑道文件名。
  3. JQuery的检测click事件。对()上的图像,并给出收藏图像相同SRC

这工作得很好。如果我不通过我自己使用带有源第2步和硬编码的HTML元素。 如果我然后把我的获取文件放回到HTML中,我的JQuery将不会识别动态创建的元素。 其他Stack用户询问过相同的问题。 所以我想我可能会发现在那些一些帮助,但我学到的唯一的事情就是,我应该使用。对().live()的代替。点击(),而我却没有请使用.click()

因此,我添加了一些console.log()的我的JQuery。 ,我发现开溜,我click事件不运行,之前一切,一切运行,但我单击事件不会承认这些元素动态创建,或元素通过改变以任何方式使用Javascript

编辑:的问题是,我装了图像中的JavaScript已经拼命地跑后,对于这个工作,我不得不改变:

$('[class="thumbnail"]').on('click', function (event) { 

$(document).on('click', '.thumbnail', function (event) { 

编辑完


PHP以JSON

<?php 
header('Content-Type: text/json'); 
echo '{"images":['; 
if ($handle = opendir('img/gal/')) { 
$result = ""; 
    while (false !== ($entry = readdir($handle))) { 

     if ($entry != "." && $entry != "..") { 
      $result .= '{"name":"'.$entry.'"},'; 

     } 
    } 

    echo substr($result, 0,-1); 
    closedir($handle); 
} 
echo "]}"; 
?> 

JSON为HTML

fetch('gal.php') 
    .then((response) => { 
     if (response.status == 200) { 
      return response.json(); 
     } else { 

     } 
    }) 
    .then((json) => { 
     var content = document.getElementsByClassName('gallery'); 
     for (var i = 0; i < json.images.length; i++) { 
      content[0].innerHTML += "<div class='col-xs-12 col-sm-3'> <a href='#' class='thumbnail' data-toggle='modal' data-target='#lightbox'><img src='img/gal/" + json.images[i].name + "' alt='..' ></a></div>"; 
     } 
    }).catch((error) => { 
     console.log(error); 
    }); 

的收藏点击事件处理

$(document).ready(function() { 
    var $lightbox = $('#lightbox'); 
    console.log('test1'); 
    $('[class="thumbnail"]').on('click', function (event) { 
     console.log('test2'); 
     var $img = $(this).find('img'), 
      src = $img.attr('src'), 
      alt = $img.attr('alt'), 
      css = { 
       'maxWidth': $(window).width() - 100, 
       'maxHeight': $(window).height() - 100 
      }; 

     console.log(src); 
     console.log('test3'); 

     $lightbox.find('.close').addClass('hidden'); 
     $lightbox.find('img').attr('src', src); 
     $lightbox.find('img').attr('alt', alt); 
     $lightbox.find('img').css(css); 
    }); 
    $lightbox.on('shown.bs.modal', function (e) { 
     var $img = $lightbox.find('img'); 
     $lightbox.find('.modal-dialog').css({ 
      'width': '40vw' 
     }); 
     $lightbox.find('.close').removeClass('hidden'); 
    }); 
    console.log('test4'); 
}); 

我在控制台结果如下:

test1 
test4 

如果我删除我的,我得到这个:

test1 
test4 
test2 
img/gal/asdf.jpg 
test3 

我希望有人能帮助我,这是窃听我这么很差 ..

+0

为什么'$( '[类= “缩略图”]')的'代替'$( '缩略图')',我从来没有用过,并在这样的jQuery中看到类 –

+0

其实它最初是作为数据目标=“#灯箱”,我认为这可能是那个窃听,所以我改变了它,忘了它,但那部分工作正常,如果我删除我的** JSON到HTML **文件 – Schulzen

+0

您可以通过缩略图onclick事件调用javascript函数。这可能会起作用。 –

回答

0

点击事件没有被处理,到期到监听器所绑定的元素将在稍后添加,这是由于您的脚本动态地添加了元素。

要解决此问题,您需要绑定在文档上而不是元素上。

尝试更换此

$('[class="thumbnail"]').on('click', function (event) { 

用下面

$(document).on('click','.thumbnail',function(event){