Доброго времени суток, дорогие форумчане. Ситуация такая: В header'е я подключаю свою JS библиотеку с некоторыми функциями. Все прекрасно работает и все дела, но сегодня одна из моих функций начала переопределяться из чужого кода. Выяснил, что одно из расширений хрома использует функцию с точно таким же именем, поэтому моя функция переопределяется и определенный функционал сайта пропадает. Изменить имя функции? но ведь подобные расширения могут встречаться и в дальнейшим у других юзеров. Возможно ли в JS коде при определении моей функции дать запрет на ее переопределение? Если нет, то с такими ситуациями можно бороться только путем добавления префикса к функции (например my_site_functuion) или есть более адекватный способ? С уважением Евгений.
Код (Text): // левая функция function getNum(n){ alert( 'Результат левой функции: ' + (n + 15 )); // 20 } // Ваши функции (function(){ function getNum(n){ alert('Результат вашей функции: ' + n * 10); // 50 } getNum(5); // вызываем свою })(); getNum(5); // вызываем левую
Протелепатируем-с. У вас прямо в html, у какого-то элемента, прописано что-то вроде onclick="foo()" и вызывается уже функция "foo" не ваша, а из расширения Chrome. Угадал?
Нет. У меня так: header.php Код (Text): <!DOCTYPE html> <html> <head> <!-- код --> <script src="<?=$base_url?>js/my_script.js"></script> <!-- код --> </head> <body> <!-- код --> <!-- еще код --> <!-- много кода --> <script>my_function('ololo');</script> <!-- еще немного кода --> my_script.js Код (Text): function my_function(ololo){ return 'Возможно эта функция будет переопределена левыми расширениями браузеров'; }
Для меня останется загадкой, почему нужно раскидывать код по углам страницы. Хотя, если это какой-то экстраординарный случай, на который у меня даже не хватает воображения, то... В общем, выбора у вас не так много: или те же префиксы, о которых вы говорили, или создать объект с набором функций: Код (Text): // Ваши функции var myFunk = { getNum: function(n){ this.out.insertAdjacentHTML('beforeend','<p>Результат: ' + (n * 10) + '</p>'); }, getStr: function(s){ this.out.insertAdjacentHTML('beforeend','<p>Hello, ' + s + '</p>'); }, out: document.querySelector('#output') }; // левые функция function getNum(n){ alert( 'Результат левой функции: ' + (n + 15 )); } function getStr(s){ alert('Goodbye, ' + s); } // Вызываем ваши функции myFunk.getNum(5); myFunk.getStr('world');
Способ с объектом красивее, но все равно придется переписывать много кода =( А что Вы имели ввиду под "раскидывать код по углам"?
У вас есть подключенная библиотека. Так по какой причине, функция вызывается после "много кода"? Есть же наверно какое-то событие, по которому надо её вызвать и это можно сделать из той же библиотеки, внутри замыкания.
Аа.. Вы про это. Так и есть. Вызов функции в большинстве случаев происходит из самой же библиотеки. Тут я для наглядности вызвал ее из html
Вот и задумайтесь над тем, как избежать таких ситуаций в реале. Не используйте onclick и иже с ним внутри html-элементов, а устанавливайте обработчики событий адекватно - addEventListener, создайте область видимости для своей библиотеки и тогда проблем не возникнет, да и переписывать ничего не придётся.