2012-05-20 80 views
0

刚刚尝试了以下方法,发现这不起作用?javascript:使用ajax更改onClick属性不会触发新事件?

(使用jQuery):

function bookmark_add() { 

     $.ajax({ 
      type: "POST", 
      url: "load.php", 
      data: data, 
      success: function(msg) { 
       var msg_array=msg.split("-"); 
       var success=msg_array[0]; 
       var bookmark_id=msg_array[1]; 

       if(success==1) { 
        $('.btn_bookmark').html('Remove Bookmark'); 
        $('.a_bookmark').attr("onClick","bookmark_remove("+bookmark_id+"), return false;"); 
        } 
       } 
     }); 
    } 

此功能工作正常。 <a>元素的属性被正确更改。然而,新的事件(功能bookmark_remove没有被解雇,所以我认为我的方法不起作用,因为一些基本的误解,可能?

有谁能告诉我,这个假设是正确的,给任何暗示为什么?

回答

5

我不能马上告诉你为什么它不工作(可能是几件事情; onClick应该是全部小写的一件事  —的大小写混合的版本仅在HTML好吗标记 [不是XHTML,但HTML],而不是一旦你与DOM交互,这是区分大小写的),但没有理由这样做,而是:

$('.a_bookmark').click(function() { 
    bookmark_remove(bookmark_id); 
    return false; 
}); 

如果锚自带装备预先与现有onclick处理,你可以清除它是这样的:

$('.a_bookmark').attr("onclick", ""); 

所以把它们一起:

$('.a_bookmark').attr("onclick", "").click(function() { 
    bookmark_remove(bookmark_id); 
    return false; 
}); 

显然人不明白我在做什么,所以这里是你的完整ajax与上面建议的更改呼叫:

$.ajax({ 
     type: "POST", 
     url: "load.php", 
     data: data, 
     success: function(msg) { 
      var msg_array=msg.split("-"); 
      var success=msg_array[0]; 
      var bookmark_id=msg_array[1]; 

      if(success==1) { 
       $('.btn_bookmark').html('Remove Bookmark'); 
       $('.a_bookmark').attr("onclick", "").click(function() { 
        bookmark_remove(bookmark_id); 
        return false; 
       }); 
      } 
    }); 
+1

如果OP当前有一个'onclick'属性绑定来添加一个书签,你的监听器和他的属性都会触发我猜。 –

+0

这是错误的,因为bookmark_id值不存在于.click内容中 –

+0

@WampieDriessen:是的。我正在谈论替换他在ajax处理程序中的代码。点击处理程序将是'bookmark_id'上的一个闭包。 –

2
"bookmark_remove("+bookmark_id+"), return false;" 

逗号是错误的。它应该是一个分号。

+1

如果OP想要使用逗号运算符,则需要''return bookmark_remove(“+ bookmark_id +”),false;“'不要过度使用逗号运算符。:-) –

+0

@ T.J.Crowder:是的,Wampie似乎是对的,因为用分号而不是逗号作用... – Chris

+0

@Chris:是的。有很多事情你可以用逗号连接在一起,但是你不能把'return'放在那里 - 它必须在一开始,这会非常容易混淆。 :-)但总体来说,通过jQuery使用DOM2处理程序比旧的DOM0更好...... –

1

,而不是因为你是使用jQuery:

$('.a_bookmark').attr("onClick","bookmark_remove("+bookmark_id+"), return false;"); 

我建议你使用这种形式:

$('.a_bookmark').click(function(){ 
    bookmark_remove(bookmark_id); 
    return false; 
}) 

更具可读性用更少的报价令牌,对不对?