2014-10-10 2 views
1

i am triyng, чтобы получить доступ к элементу, используя свой новый атрибут.Невозможно получить доступ к элементу, используя свой новый идентификатор

HTML

<div class="element">Element1</div> 

Сценарий

$('.element').one("click", function() 
{ 
    $.getScript('/script.js'); 
}); 

$('#activated').click(function() 
{ 
    alert(1); 
}); 

Внутри файла script.js:

$('.element').attr("id", "activated"); 

The script.js добавляет идентификатор #activated в DIV, но .click() не будет работать с использованием нового идентификатора.

Может кто-нибудь, пожалуйста, скажите мне, почему?

+0

Это потому, что вы, вероятно, запускаете '$ ('# activated'). Click (...' в '$ (document) .ready (...' и так как вы динамически вставляете 'активированный 'id, его там нет до тех пор, пока вы не нажмете 'element' div, что произойдет долго после того, как' $ (document) .ready (... 'выполнил.Так что' $ ('# activated') 'не будет найдено. –

+0

@SaniHuttunen, сценарий работал в $ (document) .ready, но я удалил его и все еще ту же проблему. – Marian07

ответ

4

$('#activated') оценивается до того, как какой-либо элемент имеет этот идентификатор, поэтому он не находит элементов, и никакие элементы привязки не привязаны ни к каким элементам.

Вы можете использовать делегирование событий, чтобы обойти это. Обработчик щелчок будет приложена к телу документа сразу, но это будет только вызвать его функцию обратного вызова, если целевой элемент соответствует «#activated» селектор:

$(document.body).on('click', '#activated', function() 
{ 
    alert(1); 
}); 
+0

Это работает, спасибо за код и объяснение. – Marian07

1

Когда линия $('#activated').click(function() выполнена, не существует ни одного элемента с Идентификатор activated в документе, поэтому jQuery возвращает пустую коллекцию и метод click бесшумно терпит неудачу. Вы можете использовать метод делегирования событий:

$(document).on('click', '#activated', function() 

или проверить идентификатор щелкнутого элемента в первом обработчике события:

$('.element').on("click", function() 
{ 
    if (this.id === 'activated') 
    { 
     // ... 
    } 
    else 
    { 
     $.getScript('/script.js'); 
    } 
}); 
+0

Обратите внимание, что со вторым методом '$ .getScript ('/ script.js '); 'может выполняться несколько раз, если кнопка нажата несколько раз, прежде чем script.js загрузится один раз. (Если эффект script.js является идемпотентным, то это может быть полезной функцией: если он не загружается в первый раз, пользователь снова может нажать кнопку, чтобы снова загрузить сценарий.) – AgentME

+0

Благодарим за код и объяснение! Ваш код работает! – Marian07

+0

@AgentME Да, это правда, спасибо, что упомянули об этом! – undefined

0

попробовать $(document).on('click','#activated',function(){ // do somthing here }); это могло бы работать. Скажи мне, что это не так.

+2

Метод 'click' вызывает метод' on' за кулисами, поэтому эффективно это не имеет значения, если вы хотите делегировать событие, следует использовать другую версию метода 'on'. – undefined

+0

@undefined: а теперь? – Meer

+0

Теперь это должно сработать. – undefined

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