Вызов click () в jQuery вызывает только связанные с ним события jQuery?

У меня есть сайт Magento, который включает в себя прототип библиотеки JavaScript.

Некоторое время назад я также добавил jQuery.

Однако до этого я включил лайтбокс на основе прототипа. Это было вызвано добавлением атрибута rel="lightbox[gallery]".

Теперь я хочу, чтобы лайтбокс появлялся при загрузке страницы. Я ничего о прототипе не знаю, поэтому я попытался создать скрытую ссылку с помощью jQuery, а затем вызвать $('#special').click(), но безрезультатно. Однако, если я действительно нажимаю на ссылку, она работает нормально.

Весь мой код jQuery находится в такой функции

jQuery.noConflict();
jQuery(function($) {
 // Now I can use $ in here... :)

});

Итак, jQuery click() запускает только те события, которые связывает jQuery? Если да, как я могу вызвать событие щелчка или активировать лайтбокс в прототипе?


person alex    schedule 15.02.2010    source источник
comment
проверьте, нет ли у вас конфликтов из-за ярлыка $ ()   -  person fmsf    schedule 15.02.2010
comment
Что касается последнего редактирования: AFAIK, prototype.js раньше делал некоторые изворотливые вещи вроде этого (модифицируя Object.prototype), но я почти уверен, что они уже устранили это повреждение мозга.   -  person Shog9    schedule 15.02.2010


Ответы (5)


Итак, jQuery click () запускает только те события, которые связаны с jQuery?

Он также будет запускать события, связанные с помощью атрибутов onEventName старого стиля. Но он не запускает события, связанные через addEventListener() или attachEvent() (которые, AFAIK, Prototype использует для привязки событий ...)

Однако вы можете смоделировать реальное событие щелчка. Просто потребуется немного больше усилий ...

См. Как имитировать щелчок для привязки тега ?

См. Также: Запуск события с помощью прототипа

person Shog9    schedule 15.02.2010
comment
Я попытался сделать это (re: прототип пользовательского щелчка), но не работал var p = $; p('special').simulate(click); - person alex; 15.02.2010
comment
Выдал ошибку. simulate не метод $. Я поместил var p над jQuery.noConflict(), чтобы я мог по-прежнему ссылаться на прототип внутри jQuery(function($) { });. - person alex; 15.02.2010
comment
@alex: О ... Ну, тогда вам, вероятно, нужно включить связанный с event.simulate.js во второй вопрос. ;-) Вот или просто воспользуйтесь скриптом в первом вопросе. - person Shog9; 15.02.2010
comment
Извините, да, я сделал это. Я просто собираюсь отдохнуть от этого ненадолго. Спасибо за вашу помощь. - person alex; 15.02.2010

  1. используйте jQuery вместо $. Функция $ определена как в Prototype, так и в jQuery. возможно, вы пытаетесь вызвать метод «click ()» для объекта, выбранного прототипом, который может не работать (я вообще не знаю прототипа, за исключением того, что он также определяет функцию «$») (примечание: пожалуйста взгляните на http://docs.jquery.com/Using_jQuery_with_Other_Libraries)

  2. Это не совсем ответ на ваш вопрос, но почему бы вам не использовать лайтбокс для jQuery? ;) http://leandrovieira.com/projects/jquery/lightbox/

person migajek    schedule 15.02.2010
comment
Смотрите обновление. Кроме того, для 2 я уже реализовал лайтбокс Prototype по всему сайту. Я хочу придерживаться этого (пока). - person alex; 15.02.2010

При использовании jquery попробуйте использовать jQuery noconflict, чтобы по умолчанию $ ссылался на прототип и использовал jQuery когда вы хотите использовать jQuery. Честно говоря, по моему опыту, когда я когда-либо добавлял два фреймворка и пытался заставить их работать вместе, это всегда проблема и почти ад. Чего особенного вы пытаетесь достичь с помощью jQuery в проекте, созданном с помощью прототипа?

person Teja Kantamneni    schedule 15.02.2010
comment
Я забочусь о конфликтах. Я также включил jQuery, потому что я знаю jQuery и хотел что-то сделать (в отличие от изучения прототипа для одного небольшого проекта) - person alex; 15.02.2010
comment
Я могу лишь поддержать совет об одном фреймворке. Даже с noconflict есть множество запутанных мелких несовместимостей и крайних случаев. - person bobince; 15.02.2010

Чтобы использовать $, как вы просите, сделайте следующее:

jQuery(function() {
  (function($) {
    //
    // your initialization code goes in here
    // and you can use '$' safely as the name
    // of the jQuery object, even though
    // window.$ is something else
    //
  })(jQuery);
});
person Pointy    schedule 15.02.2010
comment
А ты про двойную упаковку? Да, хорошо, jQuery передает объект jQuery, так что это круто. - person Pointy; 15.02.2010
comment
jQuery передает его в качестве первого параметра функции обратного вызова, так что способ, которым это делает сейчас Алекс, в порядке. - person Shog9; 15.02.2010

очень простое решение - добавить $ j = jQuery.noConflict в конец исходного файла jquery. то глобально вы можете просто использовать $ j и не беспокоиться об упаковке функций

person Matt    schedule 20.02.2010
comment
Что ж, при передаче $ в качестве аргумента, такого как jQuery(function($) { }), это означает то же самое. Кроме того, мне не нужно отказываться от привычки использовать $. - person alex; 20.02.2010
comment
верно, но тогда вам потребуется каждый раз, когда вы используете его для переноса ... если вы используете много jquery, это просто экономит время при написании сценариев. в моей последней реализации это все jquery минус собственный magento js, ​​поэтому он, вероятно, сэкономил 1000 строк кода, сделав это как таковое. Это ни в коем случае не окончательное решение, потому что существует множество способов сделать что-то, просто способ сэкономить на некоторых строках кода и сделать разделение библиотек легко видимым. - person Matt; 20.02.2010
comment
Однако я использую его только один раз в этом сценарии. Но если бы я широко использовал его на всем сайте, я бы, вероятно, связал объект jQuery с новой переменной, как вы предложили. - person alex; 21.02.2010