【问题标题】:Javascript onclick event firing for id but not for classJavascript onclick 事件触发 id 但不是类
【发布时间】:2014-11-02 22:25:41
【问题描述】:

我是 Javascript 的新手,我正在尝试获得一种“点击放大”的效果,点击放大的图像会再次缩小它。通过用原始图像替换缩略图来进行放大。我还想稍后使用我数据库中的图像制作幻灯片。

为了做到这一点,我做了一个测试,我用一个类替换了表示可以放大的 id,并且我还使用了一个全局变量,以便我可以跟踪我正在使用的 url。不确定这是最佳做法,但我还没有找到更好的解决方案。

第一部分工作正常,我的图像更改没问题,值也根据“警报”语句更新。但是,第二部分,具有类的部分永远不会触发。

我做错了什么(除了很可能的许多不良做法)?

如果我不更改类,而是直接更改 id(将 .image_enlarged 替换为 #image_enlarged 等),它似乎调用了第一个函数,即具有 id 的函数,但输出了更新后的 id,这相当令人困惑.

var old_url = "";

$(function(){

   $('#imageid').on('click', function ()
        {       
        if($(this).attr('class')!='image_enlarged'){
            old_url = $(this).attr('src');
            var new_url =  removeURLPart($(this).attr('src'));
            $(this).attr('src',new_url); //image does enlarge
            $(this).attr('class',"image_enlarged");
            $(this).attr('id',"");
            alert($(this).attr('class')); //returns updated class
            }
        });

   $('.image_enlarged').on('click', function (){
       alert(1); //never triggered
       $(this).attr('src',old_url);
       $(this).attr('class',"");
       $(this).attr('id',"imageid");
   });
});

function removeURLPart(e){
   var tmp = e;
       var tmp1 = tmp.replace('thumbnails/thumbnails_small/','');
       var tmp2 = tmp1.replace('thumbnails/thumbnails_medium/',''); 
       var tmp3 = tmp2.replace('thumbnails/thumbnails_large/','');

   return tmp3;
} 

至于html,真的很简单:

<figure>
   <img src = "http://localhost/Project/test/thumbnails/thumbnails_small/image.jpg" id="imageid" />
   <figcaption>Test + Price thing</figcaption>
</figure>

<script>
   document.write('<script src="js/jquery-1.11.1.min.js"><\/script>');
</script>
<script type="text/javascript" src="http://localhost/Project/js/onclickenlarge.js"></script>

【问题讨论】:

  • 您粘贴的 html 不包含包含该类的图像?
  • tag image_enlarged with class, not found in your html!
  • 呃,这个标签应该是javascript添加的,第一次点击后,所以不在html中。

标签: javascript jquery html onclick image-enlarge


【解决方案1】:

来自 API:http://api.jquery.com/on/

.on() 方法将事件处理程序附加到 current selected set of elements 在 jQuery 对象中。

当您执行$('.image_enlarged').on(...) 时,该类没有元素。因此,该函数未在任何元素中注册。

如果你想这样做,那么你必须在更改班级后注册活动。

这是一个基于您的代码的示例:http://jsfiddle.net/8401mLf4/

但这会多次注册事件(每次单击),这是错误的。所以我会做类似的事情:

$('#imageid').on('click', function () {
    if (!$(this).hasClass('image_enlarged')) {
      /* enlarge */
    } else {
      /* restore */
    }
}

JSfiddle:http://jsfiddle.net/8401mLf4/2/

【讨论】:

  • 代码里面已经有这样的检查,所以第一次点击后应该有一个带有类的元素。除非我误解了你在说什么。
  • @spliblib 正如你所说,第一次点击之后就出现了带有类的元素。但是$('.image_enlarged').on()在第一次点击之前被评估。所以$('.image_enlarged') 没有找到任何项目。因此,该函数未注册。
  • 好吧,我知道问题出在哪里了。非常感谢您的回答,现在就像一个魅力。
【解决方案2】:

尝试使用:

addClass('image-enlarged')

代替:

.attr('class',"image_enlarged");

最好的方法是创建一个小图像类和一个大图像类,其中包含两者所需的 css,然后根据您要显示的内容使用 addClass() 和 removeClass。

【讨论】:

  • 感谢您的回复,但这并不能帮助我以任何方式解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
相关资源
最近更新 更多