1

我正在使用本教程:

http://www.devinrolsen.com/jquery-image-swapping-with-fade-effect/

但我无法让它工作。我相信这与我的其他脚本有些冲突。

我有一个目录,在 catalogue.php 中输入了所有 jquery 操作。然后是显示目录或单个页面的 reader.php。我激活了 simpletabs jquery 脚本。

现在我尝试像上面的教程那样实现 jquery 图像交换。

但是图像点击的事件根本没有开始。我尝试了教程中的所有代码,但它不起作用,它只是将图像单独加载到窗口中。

所以我试图调试它,只是为了显示一个警告框:

$("a.img_thumb").on("click", function (e) {
    alert('Works!');
});

但是没有触发警报。(虽然其他 javascript 正在工作,但选项卡、加载程序等)

我也试过:

$(function(){
    $("a.img_thumb").on("click", function (e) {
        alert('Works!');
    });
});

现在我也试过了:

$(document).ready(function() {
    $("a.img_thumb").on("click", function (e) {
        alert('Works!');
    });
});

这些都是我在 catalogue.php 中的所有 jquery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="js/simpletabs_1.3.js"></script>
<script>
    $(document).bind('ajaxStart', function(){
        $('#loading').css("display", "block");
    }).bind('ajaxStop', function(){
        $('#loading').css("display", "none");
    });
    function show_object(itemid,object_type){
        var request = $.ajax({
            url: "reader.php",
            type: "GET",
            data: "id="+ itemid,
            dataType: "html"
        });
        $('table.object_list_' + object_type).hide();
        request.done(function(msg) {       
            $('div.show_object_' + object_type).append(msg);       
        });
        request.fail(function(jqXHR, textStatus) {
            alert( "Request failed: " + textStatus );
        });
    };
    $("a.img_thumb").on("click", function (e) {
        alert('Works!');
    });
</script>

这是源代码的一部分,图像是从 xml 文件动态创建的

    <a href="http://domain.com/itemimages/img50293090.jpg" class="img_thumb">
<img src="http://domain.com/itemimages/img50293090.jpg" alt="pic" class="thumbnail"></a>

谢谢,不知道哪里出错了

附加信息

catalogue.php 和 reader.php 这两个脚本构建了一个目录。名称不好,因为 catalogue.php 除了有一些 css 和 jquery 之外什么都没有。这是 catalogue.php 的整个脚本:

<?php
//If needed, paste
header('Content-Type: text/html; charset=utf-8');
?>
<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="js/simpletabs_1.3.js"></script>
    <script>
        $(document).bind('ajaxStart', function(){
            $('#loading').css("display", "block");
        }).bind('ajaxStop', function(){
            $('#loading').css("display", "none");
        });
        function show_object(itemid,object_type){
            var request = $.ajax({
                url: "reader.php",
                type: "GET",
                data: "id="+ itemid,
                dataType: "html"
            });
            $('table.object_list_' + object_type).hide();
            request.done(function(msg) {       
                $('div.show_object_' + object_type).append(msg);       
            });
            request.fail(function(jqXHR, textStatus) {
                alert( "Request failed: " + textStatus );
            });
        };
        $(document.body).on("click", "a.img_thumb", function (e) {
            alert('Works!');
        });

    </script>

    <style type="text/css" media="screen">
        @import "css/simpletabs.css";
    </style>
    <style type="text/css">
        #loading {
            display:none;
            position:absolute;   
            left:30px;   
            top:90px;   
            z-index: 1000;          
        }
        img.list_image {
            heigth:90px; 
            width:90px;
        }
        td.list_info {
            width:150px;
        }
        p.tab_header {
            font-weight:bold;
        }
        table.infotable {
            width:800px;
        }
        td.key {
            width:200px;
        }
        td.value {
            width:400px;
        }
        #show_info {
            width:50%;
            float:left;
        }

        #show_pictures {
            width:50%;
            float:right;
        }
        #show_maplinks {
            width:100%;
            clear:all;
        }
        #main_image {
            width:200px;
            margin:3px;
        }
        #thumbs {
            width:200px;
        }
        img.thumbnail {
            max-width:60px;
            max-height:60px;
            margin:3px;
            float:left;
        }
    </style>
</head> 
<body>
    <div id="catalogue" class="simpleTabs">
        <img src="loading.gif" id="loading"/>
<?php
include('reader.php');
?>
    </div>

如果未设置 $_GET['id'],reader.php 将显示包含项目的列表。如果设置了 GET,那么它会显示具有大量数据和图像的单个项目。

reader.php 差不多有 1000 行,所以我不会在这里发布。

但是,正如评论中所讨论的那样。可能是问题出在某种程度上,因为当用户单击列表中的一项时,图像是用 ajax 加载的?所以图像在初始加载时不存在

终于搞定了,谢谢大家!

在创建图像的 reader.php 中,我添加了一个 onclic 函数:

<div id="thumbs">
    <?php foreach ($original_images as $image) { ?>
    <a href="<?php echo $image['url'] ?>" class="img_thumb">
        <img src="<?php echo $image['url'] ?>" alt="kuva" class="thumbnail" onclick="alertme()"/>
    </a>
    <?php } ?>
</div>

jquery 看起来像这样:

function alertme() {
    alert('Works!');
};

这有效。这是怎么回事?

4

2 回答 2

1

如果该片段来自您的 HEAD,那么您将错过“onload”事件。也更改您的代码段:

function show_object(itemid,object_type){
    var request = $.ajax({
        url: "reader.php",
        type: "GET",
        data: "id="+ itemid,
        dataType: "html"
    });
    $('table.object_list_' + object_type).hide();
    request.done(function(msg) {       
        $('div.show_object_' + object_type).append(msg);       
    });
    request.fail(function(jqXHR, textStatus) {
        alert( "Request failed: " + textStatus );
    });
};
$(function() {  //  $(document).load(function....
    $(document).bind('ajaxStart', function() {
        $('#loading').css("display", "block");
    })
    .bind('ajaxStop', function(){
        $('#loading').css("display", "none");
    });
    $("a.img_thumb").on("click", function (e) {
        alert('Works!');
    });
})

此外,这可能是一个“时间”问题。可能是您的代码在 HTML 被“写入”到文档正文之前正在运行。太测试了,只需将您的计时器包装work在一个计时器中并运行它。等待时间,然后查看事件是否触发。

$(function() {
    setTimeout(function() {
        $(document).bind('ajaxStart', function() {
            $('#loading').css("display", "block");
        })
        .bind('ajaxStop', function(){
            $('#loading').css("display", "none");
        });
        $("a.img_thumb").on("click", function (e) {
            alert('Works!');
        });
    }, 3000);   //  3 second timer, this event won't be set till 3 seconds after the page is loaded
})

如果这是一个时间问题(在设置事件侦听器后加载动态数据),那么只需转到加载新 HTML 的位置,并将事件代码放在那里。确保在加载和编写所有新 HTML 之后将其放在最后。

delegate您可能会做的另一件事是使用.on(). 这应该将事件添加click到 even dynamic content。这通常是我最后的手段,因为我喜欢控制精确的元素事件,但这是一种在一个地方维护代码的“干净”方式。

使用 .delegate()

$("body").on("click", "a.img_thumb", function (e) {
    alert('Works!');
});
于 2013-05-01T12:21:43.757 回答
0

为了避免为尚不存在的对象创建事件监听器,您可以在父对象上创建监听器(body或者更接近的对象会更好)

试试这个:

$(document.body).on("click", "a.img_thumb", function (e) {
    alert('Works!');
});

在这种情况下,侦听器被添加到正文中,它为单击事件注册,但仅当单击事件a.img_thumb位于body. 这样,当您添加侦听器时,链接不必存在。

于 2013-05-01T12:15:44.137 回答