Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.11.2016, 14:21
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Не видит функцию.
Вот тут почему - то всё работает:

Смысл этого кода, в том, чтобы при нажатии по ссылке не переходить по адресу, а вывести адрес на экран.
Тут заменяется адрес 2х ссылок на вызов функции.

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<script type="text/javascript">
			function reply_guild(action, sign) // Обработчик ссылок(при переходе по ним)
			{
				alert('/bla-bla.php?action=' + action + '&sign=' + sign) // Вывести оригинальную ссылку
			}
			function main()
			{
				var list = document.querySelectorAll('a')	// Найти все ссылки(все две)
				var ref = list[0].href						// Получить адрес ссылки
				var sign = ref.substring(ref.indexOf('&sign=') + 6, ref.length) // Получить хэш в конце ссылок(у обоих он одинаков)

				list[0].href = "javascript:reply_guild('accept' , '" + sign + "')" // Заменить адрес у 1й ссылки на вызов функции
				list[1].href = "javascript:reply_guild('skip' , '" + sign + "')" // Заменить адрес у 2й ссылки на вызов функции
			}
			document.addEventListener('DOMContentLoaded', main) // Вызвать функцию после постройки DOM
		</script>
	</head>
	<body>
		<center>
			<a href="/bla-bla.php?action=accept&sign=40f45705adc40e6d9510addd79473bd0">Принять</a>
			<br>
			<a href="/bla-bla.php?action=skip&sign=40f45705adc40e6d9510addd79473bd0">Отказаться</a>
		</center>
	</body>
</html>


Вверху - это урезанный пример.
У меня же ругается на то, что нет этой функции:
Uncaught ReferenceError: reply_guild is not defined(…)

Я же делаю так:

Подгружаю к некой странице(вкладке, как угодно) скрипт.
И в нём есть эта функция.

Далее из этого скрипта посылаю сообщение другому скрипту, другой скрипт делает GET запрос на некий адрес, из ответа дергается часть страницы, содержащая эти 2 ссылки.
Пока работаю с текстом, заменяю этим ссылкам адреса на вызов функции, и отправляю в первый скрипт.
Первый скрипт вставляет этот текст на страницу(как DOM).
Всё.

И нифига не работает.

Последний раз редактировалось Артист, 11.11.2016 в 14:26.
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2016, 14:49
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Для начала тебе стоит понять, что скрипты твоего расширения и скрипты страницы работают в разных окружениях. Прозрачным это всё выглядит лишь для удобства, на деле же страница ничего не знает о твоём скрипте, а скрипт о странце. Взаимодействие осуществляется лишь через дополнительные спец. обёртки, а никак не напрямую и только тогда, когда ты явно исполняешь некие действия.

Тут ты устанавливаешь вызов функции текстом. Текст ничего не знает о функциях, он просто текст.
Соответственно, когда юзер кликает на такую ссылку (*утирировано*) браузер преобразует текст в код в контексте страницы и пытается вызвать функцию по её имени. Но на самой странице такой функции нет, функция твоего скрипта скрыта от станицы(иначе могли бы быть атаки на привилегированный код со стороны страницы).
Нужные функции надо назначать явно, например:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <script type="text/javascript">
function reply_guild(action, sign) // Обработчик ссылок(при переходе по ним)
{
  alert('/bla-bla.php?action=' + action + '&sign=' + sign) // Вывести оригинальную ссылку
}

function main()
{
  var list = document.querySelectorAll('a')   // Найти все ссылки(все две)
  var ref = list[0].href                      // Получить адрес ссылки
  var sign = ref.substring(ref.indexOf('&sign=') + 6, ref.length) // Получить хэш в конце ссылок(у обоих он одинаков)

  list[0].addEventListener('click', function(event){
      event.preventDefault();
      reply_guild('accept', sign);
  }, false)
  list[1].addEventListener('click', function(event){ //назначить обработчик на нажатие
      event.preventDefault(); //предотвратить переход по ссылке
      reply_guild('skip', sign); //выполнить функцию с нужными параметрами
  }, false)
}
document.addEventListener('DOMContentLoaded', main) // Вызвать функцию после постройки DOM
        </script>
    </head>
    <body>
        <center>
            <a href="/bla-bla.php?action=accept&sign=40f45705adc40e6d9510addd79473bd0">Принять</a>
            <br>
            <a href="/bla-bla.php?action=skip&sign=40f45705adc40e6d9510addd79473bd0">Отказаться</a>
        </center>
    </body>
</html>
__________________
29375, 35

Последний раз редактировалось Aetae, 11.11.2016 в 14:52.
Ответить с цитированием
  #3 (permalink)  
Старый 11.11.2016, 16:27
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Спасибо, понял ))
И получается проще просто назначить функцию, уже в ней получить ссылку, и запретить переход вернув false...

Последний раз редактировалось Артист, 11.11.2016 в 21:08.
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2016, 20:52
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Ещё один нубский вопрос, как передать значение в функцию(чтобы event остался)?
А то так проверять немного не умно:

document.querySelector('#accept').addEventListener('click', reply_guild, false) // Ссылка согласиться
document.querySelector('#skip').addEventListener('click', reply_guild, false) // Ссылка отказаться

function reply_guild(event)
{
	event.preventDefault()

	var ref = this.href // Получить текст ссылки

	if(ref.indexOf('action=accept') > -1) // Если в тексте accept - значит это первая ссылка
	{
		alert('Принять')
	}
	else alert('Отказаться')
}

Последний раз редактировалось Артист, 13.11.2016 в 20:54.
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2016, 21:15
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

Так проверять - нормально, если действия однотипные. Что ты подразумеваешь под "event остался" я не понял.
Если чтоб передавать и event и параметры - см. мой пост. Без дополнительной функции-обёртки по-хорошему не обойтись.
__________________
29375, 35

Последний раз редактировалось Aetae, 13.11.2016 в 21:19.
Ответить с цитированием
  #6 (permalink)  
Старый 13.11.2016, 21:20
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Хз, вроде проще передать в функцию цифру чем получать ссылку и искать в ней подстроку...

Ну если я вот так передам:
addEventListener('click', reply_guild(1), false)


Тогда здесь event будет == 1, а не идентификатору(чего - то).
function reply_guild(event)


А так я уверен не будет работать:
document.querySelector('#accept').addEventListener('click', reply_guild(1), false) // Ссылка согласиться
document.querySelector('#skip').addEventListener('click', reply_guild(0), false) // Ссылка отказаться

function reply_guild(event, n)
{
	event.preventDefault()

	if(n == 1) // Если в тексте accept - значит это первая ссылка
	{
		alert('Принять')
	}
	else alert('Отказаться')
}
Ответить с цитированием
  #7 (permalink)  
Старый 13.11.2016, 21:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

funcname() - это вызов функции. Самые-самые рсновы javascript, блин. В твоём коде ты её сразу вызываешь, а не ждёшь клика.
Ещё раз смотри мой пример, как должно быть. Если всё ещё непонятно, то го в учебник и с самого начала. Потому что это уже вопрос не по конкретной задаче, а по основам, без которых ты всё равно нихрена не напишешь.
__________________
29375, 35

Последний раз редактировалось Aetae, 13.11.2016 в 21:40.
Ответить с цитированием
  #8 (permalink)  
Старый 13.11.2016, 22:48
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Сообщение от Aetae Посмотреть сообщение
Если всё ещё непонятно, то го в учебник и с самого начала. Потому что это уже вопрос не по конкретной задаче, а по основам, без которых ты всё равно нихрена не напишешь.
Спасибо. )
Что - то я там ничего конкретного не нашел про функции, только кучу непонятного...
Да я уже почти заканчиваю ))
1к строк...

Сообщение от Aetae Посмотреть сообщение
funcname() - это вызов функции. Самые-самые рсновы javascript, блин. В твоём коде ты её сразу вызываешь, а не ждёшь клика.
Ещё раз смотри мой пример, как должно быть.
А, да не, я просто разные участки в один тег засунул, так - то у меня вот:
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<script type="text/javascript">
			function reply_guild(event) // Обработчик ссылок(при переходе по ним)
			{
				event.preventDefault()

				var ref = this.href // Получить текст ссылки

				if(ref.indexOf('action=accept') > -1) alert('Принять') // Если в тексте accept - значит это первая ссылка
				else alert('Отказаться')
			}
			function main()
			{
				document.querySelector('#accept').addEventListener('click', reply_guild, false)
				document.querySelector('#skip').addEventListener('click', reply_guild, false)
			}
			document.addEventListener('DOMContentLoaded', main) // Вызвать функцию после постройки DOM
		</script>
	</head>
	<body>
		<center>
			<a id="accept" href="/bla-bla.php?action=accept&sign=40f45705adc40e6d9510addd79473bd0">Принять</a>
			<br>
			<a id="skip" href="/bla-bla.php?action=skip&sign=40f45705adc40e6d9510addd79473bd0">Отказаться</a>
		</center>
	</body>
</html>


Там вроде можно просто вернуть false из функции, чтобы отменить переход по ссылке.
И передать параметр.

Последний раз редактировалось Артист, 13.11.2016 в 22:58.
Ответить с цитированием
  #9 (permalink)  
Старый 13.11.2016, 23:12
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

О, заработало:

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<script type="text/javascript">
			function reply_guild(e)
			{
				e.preventDefault()

				if(this.type) alert('Принять')
				else alert('Отказаться')
			}
			function main()
			{
				document.querySelector('#accept').addEventListener('click', {handleEvent: reply_guild, type: true})
				document.querySelector('#skip').addEventListener('click', {handleEvent: reply_guild, type: false})
			}
			document.addEventListener('DOMContentLoaded', main)
		</script>
	</head>
	<body>
		<center>
			<a id="accept" href="/bla-bla.php?action=accept&sign=40f45705adc40e6d9510addd79473bd0">Принять</a>
			<br>
			<a id="skip" href="/bla-bla.php?action=skip&sign=40f45705adc40e6d9510addd79473bd0">Отказаться</a>
		</center>
	</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 14.11.2016, 14:00
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Блин, ссылку не получает, пишет undefined...

<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
		<script type="text/javascript">
			function reply_guild(e)
			{
				e.preventDefault()

				if(this.type) alert('Принять ' + this.href)
				else alert('Отказаться ' + this.href)
			}
			function main()
			{
				document.querySelector('#accept').addEventListener('click', {handleEvent: reply_guild, type: true})
				document.querySelector('#skip').addEventListener('click', {handleEvent: reply_guild, type: false})
			}
			document.addEventListener('DOMContentLoaded', main)
		</script>
	</head>
	<body>
		<center>
			<a id="accept" href="/bla-bla.php?action=accept&sign=40f45705adc40e6d9510addd79473bd0">Принять</a>
			<br>
			<a id="skip" href="/bla-bla.php?action=skip&sign=40f45705adc40e6d9510addd79473bd0">Отказаться</a>
		</center>
	</body>
</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расширение для Safari. Как вызвать функцию из popover в global page? housewm Opera, Safari и др. 0 21.12.2013 06:07
Помогите подключить функцию в onclick moloko Элементы интерфейса 10 30.07.2013 08:27
Почему объект "Кнопка" не видит соседнию фун-ю? Игорь Александрович Общие вопросы Javascript 13 07.04.2011 20:42
Как получить указатель на элемент вызвавший функцию pelayo Общие вопросы Javascript 9 29.06.2010 23:32
Браузер доказывает что не видит функцию SleepWalker Общие вопросы Javascript 7 17.06.2009 23:14