Я предоставляю виджет Javascript другим сайтам, и мое использование Jquery в виджете конфликтует с использованием Prototype хост-сайтом.
Вы можете увидеть конфликт в действии здесь: http://www.phillyrealestateadvocate.idxco.com/idx/8572/results.php?lp=100000&hp=500000&sqFt=0&bd=2&ba=0&searchSubmit=&city%5B%5D=131< /а>
В правой части страницы нажмите зеленую кнопку «Задать вопрос» — появится всплывающее окно, и как только вы откроете всплывающее окно, в консоль JS начнут поступать ошибки «неверная длина массива» (и не t stop.) После этого всплывающее окно не может закрыться, но его можно перетаскивать. Код/контент во всплывающем окне находится в iframe, поэтому он по-прежнему работает нормально, но всплывающее окно просто не закрывается.
Firebug выдает мне следующую ошибку: invalid array length
в Prototype.js, но когда я раскрываю ее для деталей, в ней есть ссылки на jquery.min.js, поэтому это заставило меня поверить, что они конфликтуют.
Код моего виджета полностью находится в анонимной функции и загружает Jquery, используя модель, описанную здесь Алексом Марандоном: http://alexmarandon.com/articles/web_widget_jquery/
Я использую вызов noConflict, но, возможно, он не работает так, как я его разместил?
Вот начало моего скрипта виджета, который содержит ссылки на jquery.min.js и jqueryui:
(function() {
// Localize jQuery variable
var jQuery;
/******** Load jQuery if not present *********/
if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.6.2')
{
var script_tag = document.createElement('script');
script_tag.setAttribute("type","text/javascript");
script_tag.setAttribute("src",
"http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
script_tag.onload = scriptLoadHandler;
script_tag.onreadystatechange = function () { // Same thing but for IE
if (this.readyState == 'complete' || this.readyState == 'loaded') {
scriptLoadHandler();
}
};
// Try to find the head, otherwise default to the documentElement
(document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
}
else
{
$.getScript( "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js" ,
function()
{
// The jQuery version on the window is the one we want to use
jQuery = window.jQuery;
main();
}
);
}
/******** Called once jQuery has loaded ******/
function scriptLoadHandler()
{
$.getScript( "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js" ,
function()
{
// Restore $ and window.jQuery to their previous values and store the
// new jQuery in our local jQuery variable
jQuery = window.jQuery.noConflict(true);
main();
}
);
}
/******** Our main function ********/
function main()
{
// Do a bunch of stuff here
}
})(); // We call our anonymous function immediately
Любая помощь приветствуется!
Изменить: теперь у меня есть пользовательский интерфейс Jquery непосредственно в виджете, поэтому я полностью исключил вызовы getScript. К сожалению, это не решило конфликт. Вот новый код:
(function() {
// Localize jQuery variable
var jQuery,
/******** Load jQuery if not present *********/
if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.6.2')
{
var script_tag = document.createElement('script');
script_tag.setAttribute("type","text/javascript");
script_tag.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js");
script_tag.onload = scriptLoadHandler;
script_tag.onreadystatechange = function () { // Same thing but for IE
if (this.readyState == 'complete' || this.readyState == 'loaded') {
scriptLoadHandler();
}
};
// Try to find the head, otherwise default to the documentElement
(document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
}
else
{
jQuery = window.jQuery;
main();
}
/******** Called once jQuery has loaded ******/
function scriptLoadHandler()
{
jQuery = window.jQuery.noConflict(true);
main();
}
/******** Our main function ********/
function main()
{