2013-11-01 3 views
1

Есть ли способ инициировать настраиваемые события, установленные другим экземпляром jQuery? Например:Запуск настраиваемого события jQuery, заданного разными экземплярами

 
// Load version 1.9.1 
... 
jQuery191(document).on('customEvent', function() {console.log('Callback fired.')}); 

// Load version 1.6.2 and setup noConflict 
... 
jQuery162(document).trigger('customEvent'); 

Хотя это не recommended загрузить более одной версии библиотеки, простой вариант использования представляет собой плагин, который тянет в конкретной версии JQuery, если текущий экземпляр меньше, чем ожидалось. Какие-либо предложения?

+0

Вы пробовали это? Я не понимаю, почему это не сработает, хотя, как вы говорите, не идеально использовать две разные версии jQuery. –

+1

Пользовательские события @RoryMcCrossan не являются реальными событиями и обрабатываются с использованием внутренних данных, хранящихся в jQuery. Поскольку каждый экземпляр jQuery имеет свой собственный 'jQuery.expando', используемый для внутренних данных. Обработчики событий полностью изолированы между разными экземплярами, даже если они имеют одну и ту же версию. –

+0

@ t.niese Хорошая точка. Считайте меня обученным. –

ответ

1

Вы должны позаботиться о том, чтобы у вас был другой экземпляр (даже если такая же версия) на странице, поскольку это может привести к неожиданному поведению и может привести к утечкам памяти, например. если вы удалите элемент с jQuery191, который имеет данные (.data(...) или прослушиватели событий), которые были сохранены с jQuery162, это останется в памяти, пока вы не перезагрузите страницу и наоборот.

Но вернемся к вашему вопросу. Я бы не рекомендовал его, но вы могли бы удвоить событие (запустить его с обеих версий). Проблема с этим подходом заключается в том, что он все замедлит. И еще одна проблема заключается в том, что у вас есть две пузырьковые фазы. Поэтому, если вы предотвратите событие в jQuery191, оно все равно будет выполнено в jQuery162 и наоборот.

Таким образом, это может быть решение, которое работает для вас, но это также может сделать вещи более трудными. Итак, вам нужно проверить свое «я», если это решение - это то, что вы можете использовать. Возможно, вы также можете удалить одну из удваивающих частей.

(function() { 
    //keep the original functions 
    var trigger191 = jQuery191.fn.trigger; 
    var trigger162 = jQuery162.fn.trigger; 

    jQuery191.fn.trigger = function(evt) { 
     trigger191.apply(this,arguments); //call orginal function 

     //only double certain events 
     if(evt == "my-custom-event") { 
      var resultset162 = jQuery162(jQuery191.makeArray(this));//create a ne result set of the 162 version 
      trigger162.apply(resultset162,arguments); //call the original function of 162 to avoid an endless loop 
     } 
    }; 

    jQuery162.fn.trigger = function(evt) { 
     trigger162.apply(this,arguments); //call orginal function 

     //only double certain events 
     if(evt == "my-custom-event") { 
      var resultset191 = jQuery191(trigger162.makeArray(this)); 
      trigger191.apply(resultset191,arguments); //call the ofiginal function of 191 to avoid an endless loop 
     } 
    }; 

})(); 

(я надеюсь, что код работает таким образом. Я уверен, что он должен работать, но я не могу проверить это прямо сейчас)

+0

Это похоже на мою первоначальную линию мышления. Мне нужно провести какое-то тестирование, чтобы выяснить штрафы за производительность. – stavarotti

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