【发布时间】:2013-12-10 13:33:34
【问题描述】:
对于 cakephp 项目中的图像上传,我使用了 java-script。我在 app\View\Layouts default.ctp 中添加了这个 js 文件
js代码
document.querySelector('input[type=file]').addEventListener('change', function(event){
var files = event.target.files;
for (var i = 0; i < files.length; i++) {
if (files[i].type.match(/image.*/)) {
var reader = new FileReader();
reader.onload = function (readerEvent) {
var image = new Image();
image.onload = function (imageEvent) {
var imageElement = document.createElement('div');
imageElement.classList.add('uploading');
imageElement.innerHTML = '<span class="progress"><span></span></span>';
var progressElement = imageElement.querySelector('span.progress span');
progressElement.style.width = 0;
document.querySelector('form div.photos').appendChild(imageElement);
var canvas = document.createElement('canvas'),
max_size = 1200,
width = image.width,
height = image.height;
if (width > height) {
if (width > max_size) {
height *= max_size / width;
width = max_size;
}
} else {
if (height > max_size) {
width *= max_size / height;
height = max_size;
}
}
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').drawImage(image, 0, 0, width, height);
var xhr = new XMLHttpRequest();
if (xhr.upload) {
// Update progress
xhr.upload.addEventListener('progress', function(event) {
var percent = parseInt(event.loaded / event.total * 100);
progressElement.style.width = percent+'%';
}, false);
xhr.onreadystatechange = function(event) {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
imageElement.classList.remove('uploading');
imageElement.classList.add('uploaded');
imageElement.style.backgroundImage = 'url('+xhr.responseText+')';
console.log('Image uploaded: '+xhr.responseText);
} else {
imageElement.parentNode.removeChild(imageElement);
}
}
}
xhr.open('post', 'process.php', true);
xhr.send(canvas.toDataURL('image/jpeg'));
}
}
image.src = readerEvent.target.result;
}
reader.readAsDataURL(files[i]);
}
}
event.target.value = '';
我检查了没有问题。
现在在 add.ctp 文件中我加法器
<input type="file" multiple />
在输出中,我看到了文件类型字段。现在,当我单击此字段并上传图片时,mojila 错误给了我一个错误。那是
document.querySelector(...) 为空错误
我不知道这个错误。在这里为什么说 queryselector 为空?
【问题讨论】:
-
说它是
null,因为传递给document.querySelector()的选择器没有返回可以工作的元素/节点。你能验证元素存在吗?如果您可以发布相关的(最小/SSCCE)HTML,那么我们或许能够提供更具体的帮助。 -
你的意思是没有找到 ?
-
我的意思是它没有找到与您传递给它的 CSS 选择器匹配的元素。但是您已经在两个不同的地方调用它(
querySelector('span.progress span');和querySelector('form div.photos')),它们都没有试图找到 anytype的输入。 -
我刚刚编辑了格式化问题。代码中缺少第一行。这是您正在寻找的选择,@DavidThomas。
-
好吧,准确计算出 哪 行正在生成错误,并且那是(至少一个)导致错误的行。如果没有找到该元素,那是因为选择器错误,或者该元素在 JavaScript 运行时不存在。
标签: javascript