Javascript 代码在调试时正确执行,但没有浏览器开发工具就无法运行 运行
Javascript code executes correctly when debugging, but doesn't work without browser Dev Tools running
我正在尝试使用 PhotoSwipe 为网页构建一个简单的图像 uploader/gallery 查看器。图库查看器插件可以正常工作,并且需要一个数组(下面代码中的 items
),其中包含图像 src 以及每个图像的宽度和高度。函数 readImageDimensions()
获取数据,稍后将其保存到 items
.
当我调试代码时,它运行完美,图库获取数据,但如果我跳过调试器,item
变量索引了两个对象,但 src, w, h
都为空值。当代码未 运行 通过调试过程时,代码中是否有异步运行或以其他方式中断流程的内容?
上传和展示图片的代码:
var thumbsDiv = "";
var items = [];
document.addEventListener("DOMContentLoaded", init, false);
function init() {
document.querySelector('.file-uploader').addEventListener('change', onFilesSelected, false);
thumbsDiv = document.querySelector(".thumbs-div");
}
function onFilesSelected(e) {
if (!e.target.files || !window.FileReader) return;
thumbsDiv.innerHTML = "";
var width = 0;
var height = 0;
items = [];
function readImageDimensions(data) {
var image = new Image();
image.src = data;
width = image.width;
height = image.height;
}
var files = e.target.files;
var filesArr = Array.prototype.slice.call(files);
filesArr.forEach(function (f) {
if (!f.type.match("image.*")) {
return;
}
var reader = new FileReader();
reader.onloadend = function (e) {
var result = e.target.result;
var html = '<div class="img-wrap"><span class="close">×</span><img src="' + result + '"/>' + f.name + '</div>';
thumbsDiv.innerHTML += html;
readImageDimensions(result);
items.push({
src: result,
w: width,
h: height
});
}
reader.readAsDataURL(f);
});
}
画廊实例化代码:
var openGallery = function () {
var pswpElement = document.querySelectorAll(".pswp")[0];
var options = {
index: 0
};
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
gallery.init();
}
问题实际上是图像数据是异步加载的,程序在加载之前尝试读取图像尺寸。我使用 HMR 的评论进一步研究 onload()
处理程序并修改 readImageDimensions()
如下:
function readImageDimensions(data) {
var image = new Image();
console.log(data);
image.onload = function () {
width = image.width;
height = image.height;
items.push({
src: data,
w: width,
h: height
});
}
image.src = data;
}
这样,onload()
通过读取宽度和高度获得 "primed",并且在整个图像数据加载到浏览器缓存之前不会这样做。该代码还将数据推送到 items[]
数组,显然我会将方法重命名为更好的名称,例如 setImageDataForGallery()
.
我正在尝试使用 PhotoSwipe 为网页构建一个简单的图像 uploader/gallery 查看器。图库查看器插件可以正常工作,并且需要一个数组(下面代码中的 items
),其中包含图像 src 以及每个图像的宽度和高度。函数 readImageDimensions()
获取数据,稍后将其保存到 items
.
当我调试代码时,它运行完美,图库获取数据,但如果我跳过调试器,item
变量索引了两个对象,但 src, w, h
都为空值。当代码未 运行 通过调试过程时,代码中是否有异步运行或以其他方式中断流程的内容?
上传和展示图片的代码:
var thumbsDiv = "";
var items = [];
document.addEventListener("DOMContentLoaded", init, false);
function init() {
document.querySelector('.file-uploader').addEventListener('change', onFilesSelected, false);
thumbsDiv = document.querySelector(".thumbs-div");
}
function onFilesSelected(e) {
if (!e.target.files || !window.FileReader) return;
thumbsDiv.innerHTML = "";
var width = 0;
var height = 0;
items = [];
function readImageDimensions(data) {
var image = new Image();
image.src = data;
width = image.width;
height = image.height;
}
var files = e.target.files;
var filesArr = Array.prototype.slice.call(files);
filesArr.forEach(function (f) {
if (!f.type.match("image.*")) {
return;
}
var reader = new FileReader();
reader.onloadend = function (e) {
var result = e.target.result;
var html = '<div class="img-wrap"><span class="close">×</span><img src="' + result + '"/>' + f.name + '</div>';
thumbsDiv.innerHTML += html;
readImageDimensions(result);
items.push({
src: result,
w: width,
h: height
});
}
reader.readAsDataURL(f);
});
}
画廊实例化代码:
var openGallery = function () {
var pswpElement = document.querySelectorAll(".pswp")[0];
var options = {
index: 0
};
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
gallery.init();
}
问题实际上是图像数据是异步加载的,程序在加载之前尝试读取图像尺寸。我使用 HMR 的评论进一步研究 onload()
处理程序并修改 readImageDimensions()
如下:
function readImageDimensions(data) {
var image = new Image();
console.log(data);
image.onload = function () {
width = image.width;
height = image.height;
items.push({
src: data,
w: width,
h: height
});
}
image.src = data;
}
这样,onload()
通过读取宽度和高度获得 "primed",并且在整个图像数据加载到浏览器缓存之前不会这样做。该代码还将数据推送到 items[]
数组,显然我会将方法重命名为更好的名称,例如 setImageDataForGallery()
.