2015-10-09 6 views
2

Я хочу знать, как объявить объект JQuery до того, как он существует.Как объявить объект JQuery до его существования?

Я объясняю свою проблему:

Я строю приложение с JQuery и я организовать свой код, как это описано в документации JQuery здесь: https://learn.jquery.com/code-organization/concepts/

Я написал код, подобный этому:

var foo = { 
    init : function(){ 
     foo.config = { 
      element : $('.myDiv') 
     } 
    } 
}; 

var bar = { 
    fooBar : function(){ 
     $(someData).each(function(){ 
      $('.anotherDiv').append("<div class='myDiv'></div>"); 
     }); 

     foo.config.element.click(function(){ 
      alert('It doesn\'t works for me'); 
     }); 
    } 
} 

$(function(){ 
    foo.init(); 
    bar.fooBar(); 
}); 

Итак, когда я нажимаю на div, предупреждение не отображается. Я знаю, что существует метод delegate() или on(), но он не работает.

Я думаю, это потому, что, когда страница загружается, объект еще не существует.

Является ли моя гипотеза жизнеспособной?

+1

'on()' это решение, мы не можем сказать, почему он не работает для вас, потому что вы не показали нам свою попытку использовать его. – Quentin

ответ

1

Вам необходимо найти элемент DOM не в момент выполнения foo.init();, но на данный момент вам нужен элемент - назначить его обработчик click.

Изменение element к функции:

var foo = { 
    init : function(){ 
     foo.config = { 
      element : function() { return $('.myDiv'); } 
     } 
    } 
}; 

var bar = { 
    fooBar : function(){ 
     $(someData).each(function(){ 
      $('.anotherDiv').append("<div class='myDiv'></div>"); 
     }); 

     foo.config.element().click(function(){ 
      alert('It doesn\'t works for me'); 
     }); 
    } 
} 
+1

Ницца, это работает как шарм, но вы можете объяснить, почему? – JohnnyBeGoody

+1

@JohnnyBeGoody - он работал, потому что '$ ('. MyDiv')' ищет элемент DOM не в тот момент, когда вы вызываете 'foo.init();', но в данный момент вы вызываете 'foo.config.element () '. – Igor

+0

Хорошо, да, я понимаю, спасибо за трюк! – JohnnyBeGoody

2

Если он еще не существует, вы должны использовать .on - после вашего дизайна выше, и при условии, есть некоторый контейнер, который присутствует на странице загрузки:

foo.config = { 
    //element : $('.myDiv'), 
    element: ".myDiv", 
    container: $("body") 
} 

Handler:

foo.config.container.on("click", foo.config.element, function(){ 

}); 
+1

Элемент должен быть строкой – charlietfl

+0

@charlietfl - Ahh yep, сделал редактирование - спасибо – tymeJV

+0

@Quentin - Не знал, что ... – tymeJV

0

Ваш создан прямой

var foo = { 
    init : function(){ 
     foo.config = { 

прямой выбор предметов на данный момент (не один созданный еще)

  element : $('.myDiv') 
     } 
    } 
}; 

var bar = { 
    fooBar : function(){ 
     $(someData).each(function(){ 
      $('.anotherDiv').append("<div class='myDiv'></div>"); 
     }); 

свяжешь обработчик пустой группы

 foo.config.element.click(function(){ 
      alert('It doesn\'t works for me'); 
     }); 
    } 
} 

Вы можете использовать косвенную обработку, как это событие:

var foo = { 
     init: function() { 

Created косвенную щелчка слушателя в документе. Один будет обрабатывать все распространенные события щелчка из каждого .myDiv, даже созданного в будущем.

  $(document).on('click', '.myDiv', function() { 
        alert('This mast work on any created div with class "myDiv"'); 
       }); 
       foo.config = { 
        elementSelector: '.myDiv' 
       } 
      } 
     }; 
    var bar = { 
     fooBar : function(){ 
      $(someData).each(function(){ 
       $('.anotherDiv').append("<div class='myDiv'></div>"); 
      }); 
     } 
    } 
Смежные вопросы