Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.07.2014, 17:27
Интересующийся
Отправить личное сообщение для madflash001 Посмотреть профиль Найти все сообщения от madflash001
 
Регистрация: 10.06.2014
Сообщений: 18

Подмена функции
Добрый день.
Я пишу JavaScript для Tampermonkey (UserJS) и передо мной возникла такая проблема:
На сайте, с которым я работаю, есть функция old, которая вызывает alert, после чего исполнение скрипта, естественно, останавливается.
Выглядит это так:
function old (param) {
    // Код до алерта
    alert ('Алерт');
    // Код после алерта
}

Мне нужно подменить эту функцию на свою (в которой не будет alert'а).
Пробовал так:

function old (param) {
    // Код до алерта
    alert ('Алерт');
    // Код после алерта
}
old = function (param){
    // Код до алерта
    // Код после алерта
}

Почему то не выходит, хотя, вроде бы, и должно.
Выполняется старая функция (с алертом).
Ответить с цитированием
  #2 (permalink)  
Старый 18.07.2014, 17:33
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

смотря где эта функция находится, может внутри какогото объекта
Ответить с цитированием
  #3 (permalink)  
Старый 18.07.2014, 17:36
Интересующийся
Отправить личное сообщение для madflash001 Посмотреть профиль Найти все сообщения от madflash001
 
Регистрация: 10.06.2014
Сообщений: 18

Функция глобальная, то есть находится просто в <script></script>.
А вызов функции происходит OnClick'ом при нажатии на кнопку (хотя это, по моему, не важно).
Ответить с цитированием
  #4 (permalink)  
Старый 18.07.2014, 17:51
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

переопределять функцию надо ДО того как ее привяжут к событию!

<html>
	<head>
		<title>example</title>
		<style>
		.big_container
		{
		width: 300px;
		height: 300px;
		border: 1px solid black;
		}
		</style>
	</head>
	<body>
		<div class="big_container"></div>
		<script>
function one ()
	{
	console.log(1);
	}		

document.querySelector('.big_container').onclick = one;

one = function ()
	{
	console.log(2);
	}
		</script>
	</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 18.07.2014, 18:02
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Либо переопределять просто созданием функции с таким же именем.
<html>
  <head>
    <title>example</title>
    <style>
    .big_container
    {
      width: 300px;
      height: 300px;
      border: 1px solid black;
    }
    </style>
  </head>
  <body>
    <div class="big_container"></div>
    <script>
    function one()
    {
    console.log(1);
    }

    document.querySelector('.big_container').onclick = one;

    function one()
    {
      console.log(2);
    }
    </script>
  </body>
</html>

Дело в том, что интерпретатор сначала считывает всю область видимости, определяет именнованные функции, и только потом начинает выполнение кода.
Ответить с цитированием
  #6 (permalink)  
Старый 18.07.2014, 18:03
Интересующийся
Отправить личное сообщение для madflash001 Посмотреть профиль Найти все сообщения от madflash001
 
Регистрация: 10.06.2014
Сообщений: 18

При запуске вашего примера в консоль, почему то выводится весь его код, но смысл я понял. Большое спасибо за помощь.
Ответить с цитированием
  #7 (permalink)  
Старый 18.07.2014, 19:33
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от Erolast
Либо переопределять просто созданием функции с таким же именем.
Ага, но только в рамках одного скрипта, который ТС менять не будет. А так это не сработает:
<style>
    .big_container
    {
      width: 300px;
      height: 300px;
      border: 1px solid black;
    }
</style>
<div class="big_container"></div>
<script>
function one() {
  alert(1);
}
 
document.querySelector('.big_container').onclick = one;
</script>
<script>
// что за мудацкий стиль оформления кода??? 
function one()
{
console.log(2);
}
</script>
Ответить с цитированием
  #8 (permalink)  
Старый 18.07.2014, 19:41
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Сообщение от madflash001
Функция глобальная, то есть находится просто в <script></script>.
А вызов функции происходит OnClick'ом при нажатии на кнопку (хотя это, по моему, не важно).
Это очень важно
В JavaScript операция (присваивания "=") присваивает переменным ссылку на объект для объектов для примитивных типов копирует по значению
т.е. на пальцах
объект.onclick = old //приведет к тому что в onclick будут хранится ссылка на функцию
если после этого глобальному свойству "old" присвоить любое значение то это ни как не повлияет на функцию на которую раньше указывало свойство "old" а в onclick хранится именно ссылка
Ответить с цитированием
  #9 (permalink)  
Старый 18.07.2014, 21:50
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

MallSerg,
Ты щечки то немного сдуй. Ты ни хера не понимаешь, что происходит.
Сообщение от MallSerg
приведет к тому что в onclick будут хранится ссылка на функцию
Не В онклик, а сам онклик - это и есть ссылка на функцию.
В этом контексте, нет никакой разницы, в каком объекте ты определил что-либо. в одном случае это будет global.old в другом -- object.old никакой разницы нет. Спорить я не буду, сразу говорю -- ты баран.
Ответить с цитированием
  #10 (permalink)  
Старый 18.07.2014, 22:26
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Сообщение от newobject Посмотреть сообщение
ты баран.
а хамить не красиво, если он даже действительно не прав. нужно по-человечески объяснять
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение прототипа функции tsigel Общие вопросы Javascript 11 15.05.2014 01:03
Добавление функции внутрь другой функции Lion_astana jQuery 9 28.12.2013 14:33
Установить имя конструктора Андрей Параничев Общие вопросы Javascript 8 17.11.2011 10:09
arguments вызвавшей функции mister_maxim Общие вопросы Javascript 4 12.10.2010 16:21
Подскажите, как работает простой код (замыкание функции)? Dotod Общие вопросы Javascript 5 02.12.2009 04:03