#jquery
Вопрос:
это моя ситуация:
lt;button id="btnSendInvoice"gt;Button Alt;/buttongt; // Btn Send Invoice $('#btnSendInvoice').click(function() { console.log(BUTTON A) $("#btnSendInvoice").text("Button B") $("#btnSendInvoice").attr("id","btnSetPayment") }); // Btn Set Payment $('#btnSetPayment').click(function() { console.log(BUTTON B) });
Оптический он работает. Если я нажал кнопку A, я попадаю в консоль «Кнопка A», и текст кнопки меняется на кнопку B, а также идентификатор btnSetPayment.
Если я сейчас нажму кнопку «Создать» B, я снова получу кнопку A в консоли. В чем моя ошибка?
Ответ №1:
- Причина, по которой ваш код не сработал, заключается в том, что во время выполнения
$('#btnSendInvoice').click(function() {
строки кода он найдет элемент сid
asbtnSendInvoice
и назначит событие и егоfunction
этому элементу. В начале у вас естьwith
идентификатор кнопки - В следующей строке он выполняется
$('#btnSetPayment').click(function() {
, поэтому он найдет элемент сid
asbtnSetPayment
, но в этот момент такого элемента не будет, поэтому это событие не будет присвоено какому-либо элементу. - Позже, когда вы нажмете на
Button A
него, вы измените егоid
, но событие будет привязано кelement
самому себе, поэтому событие не будет изменено, и оно продолжит запускать ту же старую функцию.
Решение 1
- Обновите существующую
$('#btnSendInvoice').click(function() {
функцию и добавьте условный код, используя такие условия, какif ($(this).attr("id") == "btnSendInvoice") {
amp;if ($(this).attr("id") == "btnSetPayment") {
. Полный код, как показано ниже.
// Btn Send Invoice $('#btnSendInvoice').click(function() { if ($(this).attr("id") == "btnSendInvoice") { console.log("BUTTON A") $("#btnSendInvoice").text("Button B") $("#btnSendInvoice").attr("id", "btnSetPayment") } else if ($(this).attr("id") == "btnSetPayment") { console.log("BUTTON B") } });
lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"gt;lt;/scriptgt; lt;button id="btnSendInvoice"gt;Button Alt;/buttongt;
Решение 2
- Вы можете использовать
delegate
привязку с помощью$(document).on("click", "#btnSendInvoice"
. Используя это, он свяжет событиеdocument
и по щелчку мыши попытается найтиdelegate event
использованиеid
текущего элемента или любого другого допустимогоselectors
. Так что это сработает. Попробуйте, как показано ниже.
P.S. Delegate
события могут повлиять на производительность.
$(document).on("click", "#btnSendInvoice", function() { console.log("BUTTON A") $("#btnSendInvoice").text("Button B") $("#btnSendInvoice").attr("id", "btnSetPayment") }); // Btn Set Payment $(document).on("click", "#btnSetPayment", function() { console.log("BUTTON B") });
lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"gt;lt;/scriptgt; lt;button id="btnSendInvoice"gt;Button Alt;/buttongt;