2012-05-20 5 views
0

Только что попытался найти следующий подход, чтобы это не сработало?javascript: изменение атрибута onClick с ajax не запускает новое событие?

(с помощью 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 content –

+0

@WampieDriessen: Да. Я говорю о замене кода, который у него есть в обработчике ajax. Обработчик клика будет закрытием над 'bookmark_id'. –

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

запятая неправильно. он должен быть точкой с запятой.

+1

Правда. Если бы OP хотел использовать оператор запятой, ему нужно было бы «возвращать bookmark_remove (« + bookmark_id + »), false;» «Одна из многих причин не переусердствовать с оператором запятой ,:-) –

+0

@ T.J.Crowder: да, вампи кажется прав, потому что с точкой с запятой вместо запятой это работает ... – Chris

+0

@ Крис: Да. Есть много вещей, которые вы можете связать вместе с оператором запятой, но вы не можете поставить 'return' там - это должно было быть в самом начале, что было бы очень * запутанным. :-) Но лучше всего использовать DOM2-обработчик через jQuery, чем старый материал DOM0 ... –

1

Поскольку вы используете JQuery, вместо:

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

Я предлагаю вам использовать эту форму:

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

более удобным для чтения с меньшим количеством цитат лексем, не так ли?

Смежные вопросы