Javascript JQuery.on(';load';)未按预期工作
我正在尝试测试加载图像的时间,以便更改不透明度并使其淡入,我希望使用.hphoto类对所有图像执行此操作 这就是我尝试使用JQuery的方式:Javascript JQuery.on(';load';)未按预期工作,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我正在尝试测试加载图像的时间,以便更改不透明度并使其淡入,我希望使用.hphoto类对所有图像执行此操作 这就是我尝试使用JQuery的方式: function handle_photoloads() { $(".hphoto").each(function (i,obj) { console.log("Yo"); if ($(obj).complete) { console.log("1"); $(obj)
function handle_photoloads() {
$(".hphoto").each(function (i,obj) {
console.log("Yo");
if ($(obj).complete) {
console.log("1");
$(obj).css('opacity','1');
} else {
console.log("incomplete");
$(obj).on('load',function () {
console.log("2");
$(obj).css('opacity','1');
});
}
});
}
$(document).ready(function() {
handle_photoloads();
});
我得到的输出是“Yo”和“complete”,我得到的每个输出中有一个是我拥有的.hphoto对象的数量,所以有些东西在工作。为什么加载处理程序没有按预期触发?这一行有问题:
if ($(obj).complete) {
您在jQuery对象上寻找的是complete
属性,而不是它所包装的DOM元素。由于obj
引用DOM元素,最简单的事情是:
if (obj.complete) { // Where `obj` refers to the DOM element
否则,请使用prop
,但在包装已知为元素的内容时,通常不会使用它:
if ($(obj).prop("complete")) { // Where `obj` refers to the DOM element
但是请注意,检查
complete
标志,然后添加处理程序,错过事件的可能性很小。浏览器中的JavaScript只有一个UI线程,但浏览器不是单线程的。这是一个完全有效的事件序列:
$(obj).prop(“complete”)
并返回值false
load
事件注册的事件处理程序;没有看到任何,它不会为UI线程下一次能够处理挂起的调用队列的时间添加任何处理程序回调load
事件complete
,如果已设置,请调用您的处理程序并注销它。在上述罕见的相反情况下,您可能会收到两个调用,而不是一个(因为事件发生在挂接处理程序之后,但在您检查complete
之前),但“有时两个”比“有时零”要好:-)
jQuery巧妙命名的one
函数在这种情况下非常有用:
function handle_photoloads() {
$(".hphoto").each(function (i,obj) {
var photo = $(obj); // Or = $(this), which would be more common
console.log("Yo");
photo.one("load", function() { // Note `one`, not `on`
photo.css('opacity','1');
});
if (photo.prop("complete")) {
photo.trigger("load");
}
});
}
one
在第一次调用处理程序时将其删除。因此,无论何时,我们只得到一个回调
(在上面,您可以使用
if(photo.prop(“complete”)
,而不是if(photo[0].complete)
)这一行是一个问题:
if ($(obj).complete) {
您在jQuery对象上寻找的是complete
属性,而不是它所包装的DOM元素。由于obj
引用DOM元素,最简单的事情是:
if (obj.complete) { // Where `obj` refers to the DOM element
否则,请使用prop
,但在包装已知为元素的内容时,通常不会使用它:
if ($(obj).prop("complete")) { // Where `obj` refers to the DOM element
但是请注意,检查
complete
标志,然后添加处理程序,错过事件的可能性很小。浏览器中的JavaScript只有一个UI线程,但浏览器不是单线程的。这是一个完全有效的事件序列:
$(obj).prop(“complete”)
并返回值false
load
事件注册的事件处理程序;没有看到任何,它不会为UI线程下一次能够处理挂起的调用队列的时间添加任何处理程序回调load
事件complete
,如果已设置,请调用您的处理程序并注销它。在上述罕见的相反情况下,您可能会收到两个调用,而不是一个(因为事件发生在挂接处理程序之后,但在您检查complete
之前),但“有时两个”比“有时零”要好:-)
jQuery巧妙命名的one
函数在这种情况下非常有用:
function handle_photoloads() {
$(".hphoto").each(function (i,obj) {
var photo = $(obj); // Or = $(this), which would be more common
console.log("Yo");
photo.one("load", function() { // Note `one`, not `on`
photo.css('opacity','1');
});
if (photo.prop("complete")) {
photo.trigger("load");
}
});
}
one
在第一次调用处理程序时将其删除。因此,无论何时,我们只得到一个回调
(在上面,您可以使用
if(photo.prop(“complete”)
,而不是if(photo[0].complete)
)这一行是一个问题:
if ($(obj).complete) {
您在jQuery对象上寻找的是complete
属性,而不是它所包装的DOM元素。由于obj
引用DOM元素,最简单的事情是:
if (obj.complete) { // Where `obj` refers to the DOM element
否则,请使用prop
,但在包装已知为元素的内容时,通常不会使用它:
if ($(obj).prop("complete")) { // Where `obj` refers to the DOM element
但是请注意,检查
complete
标志,然后添加处理程序,错过事件的可能性很小。浏览器中的JavaScript只有一个UI线程,但浏览器不是单线程的。这是一个完全有效的事件序列:
$(obj).prop(“complete”)
并返回值false
load
事件注册的事件处理程序;没有看到任何,它不会为UI线程下一次能够处理挂起的调用队列的时间添加任何处理程序回调load
事件complete
,如果已设置,请调用您的处理程序并注销它。在上述罕见的相反情况下,您可能会收到两个调用,而不是一个(因为事件发生在挂接处理程序之后,但在检查之前)