2013-04-11 2 views
0

У меня есть следующий HTML структуру:Создание элемента ID «на лету» не работает в JQuery

<div class='message_top' id='top_7' style='cursor:pointer;'> 
    <div class='top_ime'>From: official</div> 
    <div class='top_status' id='status_7'> 
     <img src='images/message_new.png' height='26' title='New message' /> 
    </div> 
</div> 

В дополнение к этому, есть много других DIVs той же структуры, но с различными идентификационными номерами, например:

<div class='message_top' id='top_15' style='cursor:pointer;'> 
    <div class='top_ime'>From: official</div> 
    <div class='top_status' id='status_15'> 
     <img src='images/message_new.png' height='26' title='New message' /> 
    </div> 
</div> 

Теперь, у меня есть функция JQuery, которая принимает идентификатор .message_top DIV и он должен выполнить действие, используя содержимое .top_status DIV, который принадлежит к нему. Однако по какой-то причине в синтаксисе он, похоже, не распознает идентификатор div .top_status. Я знаю, что я Nto объяснить это очень хорошо, но вот скрипка, которая поможет вашему понять (код и комментарии есть):

http://jsfiddle.net/gMy2f/1/

$(function() { 
    $('.message_top').click(function(){ 
     var id = this.id; 
     status_id = id.replace("top","status"); 
     status = $("#"+status_id).html(); 
     alert(status_id+" "+status); //status variable is empty, but... 
     status2 = $("#status_7").html(); 
     alert(status2);     //status2 has the expected value 
    }); 
}); 

Итак, как вы видите, если я называю .html() метод, используя $("#status_7").html();, он отлично работает, но если я назову его $("#"+status_id).html(); (статус status_id «status_7»), он не работает. Что тут происходит? Я использовал подобный код несколько раз и никогда не имел никаких проблем.

+1

, кажется, работает хорошо, если вы загружаете ваш код в нужное место (подсказка: на док готовы или нагрузки). http://jsfiddle.net/j08691/gMy2f/4/ – j08691

+2

@ j08691 Я только что пробовал свой код, и он терпит неудачу так же, как у меня (как минимум, в Firefox) - и я уверен, что мой способ загрузки хорошо. – jovan

+0

Код работает отлично в firefox 19.0.2, Может быть, проблема совместимости с браузером? – gbtimmon

ответ

6

Используйте местные переменные вместо глобальных. window.status предопределен и доступен только для чтения.

Я просто ответил на этот сегодня: Does Javascript/jQuery have system vars?

Updated jsFiddle.

+0

Действительно. Просто добавление 'var' перед определением переменной устранило проблему. Благодарю. – jovan

+0

@jovan Это может объяснить, почему он работает в jsfiddle, но не в вашем браузере. Я верю, но могу ошибаться, что jsfiddle помещает все javascripts vars в контейнерный объект, чтобы отделить код пользователя от кода страницы, даже если они объявлены глобально. – gbtimmon

+0

@gbtimmon: Mmh. Я так не думаю. Сценарий не работал для меня в Firefox (в Firefox «window.status» по умолчанию используется только для чтения). jsFiddle выполняет код в iframe, но это должно повлиять на это. –