В моем сайте у меня есть функция JQuery, созданная с помощью метода jQuery.fn как так:jquery.fn перезаписывается
jQuery.fn.equalHeights = function() {
var currentTallest = 0;
jQuery(this).each(function(){
if (jQuery(this).height() > currentTallest) {
currentTallest = jQuery(this).height();
}
});
jQuery(this).css('min-height', currentTallest);
};
Я использую эту функцию, чтобы уравнять размер боковых панелей на моем сайте, так что я называю это после того, как страница закончила загрузку, чтобы убедиться, что все на месте, прежде чем я сделаю калибровку.
jQuery(window).load(function(){
jQuery('#sidebar-one, #sidebar-two, #content').equalHeights();
});
Это отлично работает для некоторых из моих страниц пользователей добавят еще один экземпляр библиотеки JQuery на свою страницу в области тела, за исключением (по любой причине). Эта вторая библиотека заставляет мою функцию перестать работать должным образом. Я предполагаю, что это связано с тем, что второй jQuery перезаписывает любые функции, созданные с помощью метода jQuery.fn. Есть ли способ предотвратить это?
Примечания: Мой сайт работает с Drupal 7, поэтому я не могу легко переместить скрипты в нижней части страницы. Функция equalHeights не была написана мной; Я считаю, что нашел его здесь в стеке, поэтому мои знания о методе fn (и JS в целом) не настолько обширны.
EDIT: На основе всех великих предложений ниже, это, как я, наконец, получил его работать.
Во-первых, я даю моему «по умолчанию» экземпляр JQuery новую переменную для ссылки:
var JQ = jQuery.noConflict();
Во-вторых, я называю более эффективную версию функции equalHeights, используя новую переменную JQuery:
JQ.fn.equalHeights = function() {
var tallest = 0;
return this.each(function(){
var h = JQ(this).height();
tallest = h > tallest ? h : tallest;
}).css("minHeight", tallest);
};
в-третьих, я называю функцию, используя новую переменную JQuery:
JQ('#sidebar-one, #sidebar-two, #content').equalHeights();
Так теперь в любое время, когда мне нужно ссылаться на мою исходную библиотеку jQuery, я просто использую JQ, и мне не нужно беспокоиться о том, что другая библиотека переходит на любую из моих функций.
Я понимаю, что это не лучший способ устранить эту проблему, и я собираюсь работать над устранением дополнительных библиотек jQuery, но это, по крайней мере, будет поддерживать боковые панели должным образом в среднем.
NB: нет никакой необходимости, чтобы обернуть 'this' внутри плагина, хотя вам нужно внутри' .each' петли - просто сделать 'return this.each (...). css (...)' – Alnitak
Я пытался вытащить его из плагина без успеха. Я попробую ваш 'return this.each()' и посмотреть, как это работает. – Cloudkiller
Я говорил только о плагине. Во всяком случае, вам, вероятно, понадобится '$ .noconflict()', чтобы дать вам постоянную ссылку на главную копию jQuery, которая не будет перезаписана более поздней копией. – Alnitak