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.
|
|
11.11.2016, 14:49
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,583
|
|
Для начала тебе стоит понять, что скрипты твоего расширения и скрипты страницы работают в разных окружениях. Прозрачным это всё выглядит лишь для удобства, на деле же страница ничего не знает о твоём скрипте, а скрипт о странце. Взаимодействие осуществляется лишь через дополнительные спец. обёртки, а никак не напрямую и только тогда, когда ты явно исполняешь некие действия.
Тут ты устанавливаешь вызов функции текстом. Текст ничего не знает о функциях, он просто текст.
Соответственно, когда юзер кликает на такую ссылку (*утирировано*) браузер преобразует текст в код в контексте страницы и пытается вызвать функцию по её имени. Но на самой странице такой функции нет, функция твоего скрипта скрыта от станицы(иначе могли бы быть атаки на привилегированный код со стороны страницы).
Нужные функции надо назначать явно, например:
<!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.
|
|
11.11.2016, 16:27
|
Профессор
|
|
Регистрация: 25.09.2016
Сообщений: 163
|
|
Спасибо, понял ))
И получается проще просто назначить функцию, уже в ней получить ссылку, и запретить переход вернув false...
Последний раз редактировалось Артист, 11.11.2016 в 21:08.
|
|
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.
|
|
13.11.2016, 21:15
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,583
|
|
Так проверять - нормально, если действия однотипные. Что ты подразумеваешь под "event остался" я не понял.
Если чтоб передавать и event и параметры - см. мой пост. Без дополнительной функции-обёртки по-хорошему не обойтись.
__________________
29375, 35
Последний раз редактировалось Aetae, 13.11.2016 в 21:19.
|
|
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('Отказаться')
}
|
|
13.11.2016, 21:38
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,583
|
|
funcname() - это вызов функции. Самые-самые рсновы javascript, блин. В твоём коде ты её сразу вызываешь, а не ждёшь клика.
Ещё раз смотри мой пример, как должно быть. Если всё ещё непонятно, то го в учебник и с самого начала. Потому что это уже вопрос не по конкретной задаче, а по основам, без которых ты всё равно нихрена не напишешь.
__________________
29375, 35
Последний раз редактировалось Aetae, 13.11.2016 в 21:40.
|
|
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.
|
|
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>
|
|
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>
|
|
|
|