jQuery不通过AJAX加载内容后工作

@H_404_0@
this page我有一个jQuery弹出窗口和缩略图可调整大小的图像。如果我把鼠标放在缩略图上,图像会完全调整大小。此外,当我点击页面中的大黄色电视按钮“QuickBook TV”,弹出窗口完美显示,因为我想要它。

但是,当我点击“下一步”或“上一步”按钮,AJAX用于加载新的内容,我的jQuery不再为弹出或缩略图像的功能。我搜索了一些论坛寻找关于这个问题的信息,但由于有限的jQuery的知识,我一直无法理解我需要做什么。

下面是弹出的jQuery

$(document).ready(function() {

        $(".iframe").colorBox({ iframe: true,width: "1000px",height: "500px" });
        $(".inline").colorBox({ inline: true,width: "50%" });
        $(".callbacks").colorBox({
            onOpen: function() { alert('onOpen: colorBox is about to open'); },onLoad: function() { alert('onLoad: colorBox has started to load the targeted content'); },onComplete: function() { alert('onComplete: colorBox has displayed the loaded content'); },onCleanup: function() { alert('onCleanup: colorBox has begun the close process'); },onClosed: function() { alert('onClosed: colorBox has completely closed'); }
        });

        //Example of preserving a JavaScript event for inline calls.
        $("#click").click(function() {
            $('#click').css({ "background-color": "#f00","color": "#fff","cursor": "inherit" }).text("Open this window again and this message will still be here.");
            return false;
        });
    });

这是缩略图jQuery

$(function() {

var xwidth = ($('.image-popout img').width())/1;
var xheight = ($('.image-popout img').height())/1;

$('.image-popout img').css(
        {'width': xwidth,'height': xheight}
); //By default set the width and height of the image.

$('.image-popout img').parent().css(
        {'width': xwidth,'height': xheight}
);

$('.image-popout img').hover(
    function() {
        $(this).stop().animate( {
            width   : xwidth * 3,height  : xheight * 3,margin : -(xwidth/3)
            },200
        ); //END FUNCTION

        $(this).addClass('image-popout-shadow');

    },//END HOVER IN
    function() {
        $(this).stop().animate( {
            width   : xwidth,height  : xheight,margin : 0
            },200,function() {
                $(this).removeClass('image-popout-shadow');
    }); //END FUNCTION

    }
);

});

解决方法

jQuery选择器在代码执行时选择存在于DOM中的匹配元素,并且不动态更新。当你调用一个函数,例如.hover()来添加事件处理程序时,它只会将它们添加到这些元素。当您执行AJAX调用,并替换您的页面的一部分,您要删除这些元素与事件处理程序绑定到他们,并用新元素替换它们。即使这些元素现在匹配那个选择器,它们也不会得到事件处理程序的绑定,因为要执行的代码已经执行。

事件处理程序

特别是对于事件处理程序(即.click()),你可以使用事件委托来解决这个问题。基本原理是,你绑定一个事件处理程序到静态(当页面加载时,存在,不会被替换)元素,将包含所有的动态(AJAX加载)内容。您可以在jQuery documentation了解更多关于事件委托的信息。

对于您的点击事件处理程序,更新的代码如下所示:

$(document).on('click',"#click",function () {
    $('#click').css({
        "background-color": "#f00","cursor": "inherit"
    }).text("Open this window again and this message will still be here.");
    return false;
});

这将绑定一个事件处理程序到整个文档(所以永远不会被删除,直到页面卸载),这将反应与点击的id属性的元素的点击事件。理想情况下,您应该使用更靠近DOM中动态元素的元素(可能是网页中的< div>),并且包含您的所有网页内容,因为这样会提高效率。

问题出现时,你需要处理.hover(),虽然。 JavaScript中没有实际的悬停事件,jQuery仅仅提供了一个方便的速记方法,用于将事件处理程序绑定到mouseenter和mouseleave事件。但是,您可以使用事件委托:

$(document).on({
    mouseenter: function () {
        $(this).stop().animate({
            width: xwidth * 3,height: xheight * 3,margin: -(xwidth / 3)
        },200); //END FUNCTION

        $(this).addClass('image-popout-shadow');
    },mouseleave: function () {
        $(this).stop().animate({
            width: xwidth,height: xheight,margin: 0
        },function () {
            $(this).removeClass('image-popout-shadow');
        }); //END FUNCTION

    }
},'.image-popout img');

jQuery插件

这涵盖了事件处理程序绑定。然而,这不是你所做的一切。你还初始化了一个jQuery插件(colorBox),没有办法将它们委托给元素。当你加载你的AJAX内容时,你将不得不再次调用这些行;最简单的方法是将它们移动到一个单独的命名函数,然后你可以在两个地方(在页面加载和你的AJAX请求成功回调)调用

function initialiseColorBox() {
    $(".iframe").colorBox({
        iframe: true,height: "500px"
    });
    $(".inline").colorBox({
        inline: true,width: "50%"
    });
    $(".callbacks").colorBox({
        onOpen: function () {
            alert('onOpen: colorBox is about to open');
        },onLoad: function () {
            alert('onLoad: colorBox has started to load the targeted content');
        },onComplete: function () {
            alert('onComplete: colorBox has displayed the loaded content');
        },onCleanup: function () {
            alert('onCleanup: colorBox has begun the close process');
        },onClosed: function () {
            alert('onClosed: colorBox has completely closed');
        }
    });
}

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...