2013-02-27 57 views
4

下面是我的简单代码,其中想要为Gmail样式的代码添加书签。toggleClass在ajax案例中无法正常工作

$(this).toggleClass('favitedited');

以上声明不起作用。得到ajax响应后,明星不会变成黄色的。 但如果你把上面的语句放在ajax块之外,它就可以工作。不能理解为什么会发生。

<html> 
<head> 
<style> 
.star { 
    background-color: transparent; 
    background-image: url('http://www.technicalkeeda.com/img/images/star-off.png'); 
    background-repeat:no-repeat; 
    display: block; 
    height:16px; 
    width:16px; 
    float:left; 
} 

.star.favorited { 
    text-indent: -5000px; 
    background-color: transparent; 
    background-image: url('http://www.technicalkeeda.com/img/images/star-on.png'); 
    background-repeat:no-repeat; 
    height:16px; 
    width:16px; 
    float:left; 
} 

span{ 
color: #2864B4; 
} 
</style> 

<script type="text/javascript" src="http://www.technicalkeeda.com/js/javascripts/plugin/jquery.js"></script> 
<script> 
    $(document).ready(function(){ 
     $('.star').click(function() { 
       var id = $(this).parents('div').attr('id');    

       $.ajax({ 
         type: "post", 
         url: "http://www.technicalkeeda.com/demos/bookmark", 
         cache: false,    
         data:{'bookmarkId': id}, 
         success: function(response){ 
          alert('response' +response); 
          if(response=='true'){         
           $(this).toggleClass('favorited');            
          }else{ 
           alert('Sorry Unable bookmark..'); 
          } 

         }, 
         error: function(){      
          alert('Error while request..'); 
         } 
        }); 
      }); 
    }); 
</script> 
</head> 
<body> 
<div id="1000"><a href="javascript:void(0);" class="star" ></a><span>Php CodeIgniter Server Side Form Validation Example</span></div> 
<div id="2000"><a href="javascript:void(0);" class="star"></a><span>Live Search Using Jquery Ajax, Php Codeigniter and Mysql</span></div> 
<div id="3000"><a href="javascript:void(0);" class="star"></a><span>Voting system Using jQuery Ajax and Php Codeigniter Framework</span></div> 
</body> 
</html> 
+0

是的,如果你硬编码响应为真,仍然不能正常工作 – Vicky 2013-02-27 02:19:56

回答

5

在Ajax回调this不是.star元件,它是一个对象jqXHR。这样做:

$(".star").click(function() { 
    var $this = $(this); 
    /* snip */ 
    if (response == 'true') { 
     $this.toggleClass('favorited'); 
    /* snip */ 
+0

谢谢@爆炸药丸 – Vicky 2013-02-27 02:22:32

+0

right-o!出于好奇,在这些情况下,我看到很多$ this的赋值。这个命名约定是否对像elem这样的基本字符串有什么实际好处? – 2013-02-27 02:22:43

+1

@KaiQing我倾向于命名包含以'$'开头的jQuery集合的变量,不管它们是什么,所以'$ this'只是自动产生的。除了清晰度之外,没有任何好处;如果您对您/您的开发团队不清楚,请随时使用 – 2013-02-27 02:23:41

2

$(this)已不在您的回复范围内。你可以在你的回应打过去了引用它是这样的...

$('.star').click(function() { 
    var elem = $(this); 

然后

elem.toggleClass('favorited'); 
0

要保持(几乎所有)相同,设置AJAX调用的上下文:

$ .ajax({上下文:this, success:function(){...} });

在另一方面,我刚刚做了类似的推荐给其他人关于如何设置点击事件东西...

$('document.body').on('click', '.star', function() {....}); 

会给你相同的功能,提高性能,并自动适应任何项目添加或删除与星级的文件。