Jump to content
  • 0

Блокировка события в FF


ZooY
 Share

Question

Есть HTML-код:

<a href="#" onclick="foo()">Ссылка</a>

Задача: сделать так, чтобы при нажатии на ссылку не происходило прокрутки окна на начало.

Прокрутка окна происходит из-за решетки в значении свойства href. Может конечно туда можно что-то прописать такое что не производило бы никаких действий. Но я не знаю что, зато знаю что можно делать так:

<a href="#" onclick="foo(); return false; ">Ссылка</a>

return false как раз и отменяет переход по ссылке. Но так получается слишком никрасиво поэтому запретить переход по ссылке нужно из функции foo. Делаю так:

function foo () {
event.returnValue = false;
}

В IE работает на ура, а вот в FF нет (до Оперы вообще еще не добрался).

На сколько мне известно returnValue вообще поддерживается только IE. Поэтому вопрос: как аналогичные действия произвести в FF. И можно ли вообще в FF достучатся из функции foo до того элемента, который ее вызывает, тоесть до тэга A.

Link to comment
Share on other sites

24 answers to this question

Recommended Posts

  • 0

function foo() {return '';} чем не устраивает?

можно ли вообще в FF достучатся из функции foo до того элемента, который ее вызывает, тоесть до тэга A

когда у меня такая вещь возникала, у элемента всегда имелся айди, соответственно ничего сложного не было в function foo(elmid) {...} и вызове ее через onclick="foo(this.id);"

Link to comment
Share on other sites

  • 0
Задача: сделать так, чтобы при нажатии на ссылку не происходило прокрутки окна на начало.

Я делаю так:

function func(){
??
return false;
}
<a href="#" onClick="return func();">сцылко.</a>

И можно ли вообще в FF достучатся из функции foo до того элемента, который ее вызывает, тоесть до тэга A.

сцылко.

Link to comment
Share on other sites

  • 0
Задача заключается в том, чтобы оставить HTML-строку именно в таком вот виде:

<a href="#" onclick="foo()">Ссылка</a>

Пока я вижу этой задаче одно обоснование ?так слишком не красиво?. Или есть реальная необходимость в этом?

Link to comment
Share on other sites

  • 0

Интересная задачка... Попробуйте что-нибудь этакое:

var foo = function() {
/* ... */
if(typeof event != "undefined") { // Для IE
event.returnValue = false;
}
this.onclick = function() {return false;}; // Для нормальных браузеров
/* ... */
}

P. S. onclick="return foo();" - красивше. :)

Link to comment
Share on other sites

  • 0

При нажатии на ссылку выполняется событие повешенное на не?, а потом событие по-умолчанию (т.е. переход по ссылке).

Чтобы отменить умолчательное событие, нужно вернуть false из обработчика. Как тут проблемы и некрасивости вообще непонятно. Сам onclick вас не смущает? Может быть убрать его и его, пусть вс? на святом духе работает?

А вообще задачка не интересная, а простейшая, если читать доку и найти в ней preventDefault().

На любителя еще вариант:

Link to comment
Share on other sites

  • 0
А вообще задачка не интересная, а простейшая, если читать доку и найти в ней preventDefault().

Ну поначалу-то все-равно хочется понять можно ли:

в FF достучатся из функции foo до того элемента, который ее вызывает, тоесть до тэга A

при условии:

Задача заключается в том, чтобы оставить HTML-строку именно в таком вот виде:

<a href="#" onclick="foo()">Ссылка</a>

(т.е. без агрументов в foo).

И очень интересно узнать то, что достучаться все-таки можно...

Link to comment
Share on other sites

  • 0
...может я тоже посмеюсь...

Не "может", а точно будете смеяться, если прочтете тему с начала (или, в случае крайней нехватки времени, а может чего еще, обратите внимание на мое краткое изложение сути). :)

Link to comment
Share on other sites

  • 0
Ну поначалу-то все-равно хочется понять можно ли:

ZooY написал:

в FF достучатся из функции foo до того элемента, который ее вызывает, тоесть до тэга A

при условии:

ZooY написал:

Задача заключается в том, чтобы оставить HTML-строку именно в таком вот виде:

Код:

Ссылка

(т.е. без агрументов в foo).

И очень интересно узнать то, что достучаться все-таки можно...

вот на этот вопрос я и ответил, если непонятно...

Link to comment
Share on other sites

  • 0

2 yopopt, 2 ZoNT не совсем так если брать

<a href="#" onclick="foo()">Ссылка</a>

и

function foo(e) {

if (typeof e.target == 'undefined')
e.target = e.srcElement;

// e.target - это и есть наш элемент...

// ...do some action...

return false;
}

то Mozilla выдаст ошибку как "e has no properties", если функция foo() не была установлена на элемент через [Element].addEventListener(); Чтобы в таком случае "e" = eventObject надо изменить запись в ссылке как Ссылка, но это уже нарушение первоначального условия "без агрументов в foo".

Т.о суммируя все выше сказаное ответ дал Zeroglif

arguments.callee.caller.arguments[0] // непоследственно искомый eventObject
arguments.callee.caller.arguments[0].target // есмь ссылка на <a>

для Mozill'ы

для Осла: в функции foo уже существует eventObject как window.event и ссылка на как window.event.srcElement

Link to comment
Share on other sites

  • 0
2 yopopt, 2 ZoNT не совсем так если брать

<a href="#" onclick="foo()">Ссылка</a>

и

function foo(e) {

if (typeof e.target == 'undefined')
e.target = e.srcElement;

// e.target - это и есть наш элемент...

// ...do some action...

return false;
}

то Mozilla выдаст ошибку как "e has no properties", если функция foo() не была установлена на элемент через [Element].addEventListener(); Чтобы в таком случае "e" = eventObject надо изменить запись в ссылке как Ссылка, но это уже нарушение первоначального условия "без агрументов в foo".

Т.о суммируя все выше сказаное ответ дал Zeroglif

arguments.callee.caller.arguments[0] // непоследственно искомый eventObject
arguments.callee.caller.arguments[0].target // есмь ссылка на <a>

для Mozill'ы

для Осла: в функции foo уже существует eventObject как window.event и ссылка на как window.event.srcElement

Да, "достучаться" так можно, но это не решает проблему перехода по ссылке, указанной в атрибуте href при использовании данного метода внутри функции.

Вообще непонятно что ещ? обсуждать и что Вы пытаетесь объяснить... Я уже приводил код выполняющий поставленную задачу:

Интересная задачка... Попробуйте что-нибудь этакое:

var foo = function() {
/* ... */
if(typeof event != "undefined") { // Для IE
event.returnValue = false;
}
this.onclick = function() {return false;}; // Для нормальных браузеров
/* ... */
}

P. S. onclick="return foo();" - красивше. ;)

А код ZoNT е? не выполняет, о ч?м и было сказано AKS

Link to comment
Share on other sites

  • 0

ах да, совсем забыл, я только на скрипте вс? пишу... Привык к записям типа a.onclick=foo; Там не надо парится с передачей эвента...

только проверку на осла ставить и вс? (if (typeof e == 'undefined') e = window.event;)

Link to comment
Share on other sites

  • 0
Да, "достучаться" так можно, но это не решает проблему перехода по ссылке, указанной в атрибуте href при использовании данного метода внутри функции.

Вообще непонятно что ещ? обсуждать и что Вы пытаетесь объяснить...

Да собсвенно уже ничего ;)

<a href="http://yandex.ru" onclick="foo()">Ссылка</a>
<script language="javascript" type="text/javascript">
function foo() {
var evt = window.event ? window.event : arguments.callee.caller.arguments[0];
return (evt.preventDefault) ? evt.preventDefault() : evt.returnValue = false;
}
</script>

Всех благ ;)

З.Ы. отдельная благодарность Zeroglif

Link to comment
Share on other sites

  • 0
arguments.callee.caller.arguments[0] // непоследственно искомый eventObject
arguments.callee.caller.arguments[0].target // есмь ссылка на <a>

для Mozill'ы

Тут есть слабое звено ? это caller. Не всякая Mozilla?а дружит с caller?ом (тяжело ей дается взаимопонимание с ним).

Захотелось, к примеру, мне написать что-нибудь, вроде такого:

var caller = arguments.callee.caller;

ну чтобы потом, используя в функции несколько раз, сократить самому себе писанину. И как Вы думаете, что из этого выйдет? Нынешний Spider(Sea)Monkey вроде обойдется без сюрпризов, усыпив таким образом бдительность js-программиста (у всех ведь новье - FF 3 во всю тестируется ;) ). А что может получить тот, у кого Netscape Browser 8.1 (между прочим не такой уж и старый - 2006 года рождения), или в какая-нибудь забавная FF 1.0, или Mozilla 1.6?

Вообще, угадайте, что выдадут alert?ы:

(function () {
(function f() {
alert(f.caller); // => ???
var caller = f.caller;
alert(caller); // => ???
}());
}());

Link to comment
Share on other sites

  • 0

Ну как всегда ? человек задал простой вопрос, поставив к нему глупое условие, которое он так и не смог объяснить, а Акс с Зероглифом завалили тему страшными терминами и вычурными кодами :-D

Link to comment
Share on other sites

  • 0
... Акс с Зероглифом завалили тему страшными терминами и вычурными кодами :-D

Да что ж тут страшного? Не бойтесь! ;) Мы всего лишь предложили обратить внимание на некоторые курьезы (хуже ведь никому не стало ;) ).

Главное ? это сделать правильные выводы. Ну и заметить, что резюме, которое сделал Yarik Voronov, может немного помешать принять верное решение (то, что было подсказано в начале).

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy