Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Клик мышью, определить над каким обьектом


Автор: Sl@va 1.2.2005, 22:30
Здравствуйте !
Имеется такая задача. Я хочу сделать, чтобы при навадении курсора например на ссылку и при нажатии правой кнопки мыши открывалось контекстное меню, которое тоже сделано на javascript. В этом меню будет пункт "Копировать ссылку". Выбрав этот пункт запускается функция, которая как раз и копирует сам url адрес этой ссылки в буфер обмена. Само контекстное меню на javascript я сделал. Как скопировать текст в буфер обмена, покопаясь в инете нашел парочку примеров. Но вот как сделать функцию, которая бы определяла что курсор в момент вызова контекстного меню находится над ссылкой и считывала ее Url, представляю только очень поверхностно.
Буду очень благодарен если подскажете.
Заранее спасибо.

Автор: sergejzr 1.2.2005, 22:44
Следует определить ссылке событие onclick.

Или обрамить текст тэгом span и ему определить onclick.

Код

<span onclick="MyMenu(this)" >здесь линк </span>

Автор: Sardar 2.2.2005, 01:42
Можно ловить mouseover на документе и сохранять где нибудь над кем провели мышью. В ИЕ это srcElement, в Mozilla это target. При самом клике можно опрашивать переменную. Это должно работать универсально для всех обьектов без прописывания им особых событий. Но если речь идёт только о сылках, то лучше перебрать их и поставить на них клик, как сказал sergej.z.

Автор: Sl@va 2.2.2005, 16:59
А не подскажете, как будет примерно выглядеть код для чтения url адресы ссылки ?

Автор: sergejzr 2.2.2005, 17:05
Код

<span onclick="MyMenu(this)" >здесь линк </span>

<script >
function MyMenu(obj)
{
alert(obj.innerHTML);
}
</script>

Автор: Sl@va 2.2.2005, 20:03
Ок!
Спасибо !

Автор: Sl@va 2.2.2005, 21:16
Я тут с этой проблемкой немного разобрался. Но вот как сделать так, чтобы каждый раз не всатвлять между тегами <A> вызов обработчика onmouseover (<a href="http://site1.com" onmouseover=f(this) >1 site</a>), а сделать эту програмку универсальной для всех ссылок на странице. У меня чегото никак не получается передать "(this)" функции "f", получается какаято ерунда. Приведенный ниже код работает, но при наведении на ссылку выводит вместо реального адреса ссылки "undefined"
smile

Код

<html>
<head>

<script>
document.onmouseover = f;

function f()
{
var srcElement = event.srcElement;
if (srcElement.tagName == "A")
{
alert (srcElement.url);
}
}
</SCRIPT>

</head>
<body>
<a href="http://site1.com">1 site</a><br>
<a href="http://site2.com.">2 site</a>
</body>
</html>

Автор: Zorro 2.2.2005, 22:05
А если просто сразу после загрузки страницы обойти все ссылки и прописать у них onmouseover.

Функция:
Код

function f(ev)
{
var elem = window.event ? window.event.srcElement : ev.target; // Для IE первый вариант, для остальных браузеров воторой
alert(elem.href);
}

Код, который нужно расположить в самом конце страницы (перед закрывающим body):
Код

var links = document.getElementsByTagName("A"); // Получить все ссылки
for(var i=0; i<links.length; i++) // Обойти их
{
links[i].onmouseover = f; // И прикрепить функцию
}

Автор: Sl@va 2.2.2005, 22:11
А какой код в конце ?
Добавлено @ 22:12
Ой, извеняюсь. Все увидел. Первый раз браузер почемуто его не отобразил.
Сейчас попробуем ...

Автор: Sl@va 2.2.2005, 22:27
Неа, тоже самое. Вместо реального адреса ссылки печатаен "Undefined"

smile

Автор: Sardar 2.2.2005, 23:17
Sl@va есть порой вещи, в которые трудно поверить smile smile
Вот этот код должен работать:
Код
var lastlink=null; //ссылка на послений линк, над которым проводили мышью
function grabLink(ev) {
 var l=window.event? window.event.srcElement: ev.target;
 if(l&&l.tagName&&l.tagName.toUpperCase()=="A") lastlink=l; //это ссылка, значит берём её

 //а это для теста, потом убери
 if(lastlink==null) document.getElementById("dbg").innerHTML=l.nodeName;
 else document.getElementById("dbg").innerHTML=lastlink.getAttribute("href");
}
//регистрируем события
if(document.body.addEventListener) document.body.addEventListener("mouseover", grabLink, false);
else if(document.body.attachEvent) document.body.attachEvent("onmouseover", grabLink);

HTML
<div id="dbg"></div>
<a href=".">Test</a>
<a href="http://vingrad.ru">Test</a>


Твоя задача выбирать когда потребудется всё необходимое из lastlink если он не равен null.

Автор: Aliance 2.2.2005, 23:26
Цитата(Sl @ 2.2.2005, 21:16)
var srcElement = event.srcElement;
if (srcElement.tagName == "A")

IE only

Цитата(Zorro @ 2.2.2005, 22:05)
var elem = window.event ? window.event.srcElement : ev.target;

Бред

Код

function find(evt) {
 evt = (evt) ? evt : ((window.event) ? event : null )
 if (evt) {
    var target = (evt.target) ? evt.target : ((evt.scrElement) ? evt.srcElement : null )
    if (target && target.tagName && target.tagName.toLowerCase() == "a") {
       // обработываем, если ЕСТЬ событие, и элемент, с которого
       // это событие пришло - <a ...>...</a>
    }
 }
}

Автор: Sl@va 2.2.2005, 23:33
Спасибо за помощь! Обязательно возму ваш пример себе на заметку.
Как говорится если долго мучиться, что нибудь получиться.
Вот результат моей трехчасовой деятельности:

HTML
<html>
<head>
<script>
document.onmouseover = domouseover;

function domouseover()
{
var srcElement = event.srcElement;
if (srcElement.tagName == "A")
{
alert (event.srcElement.href);
}
}
</script>
</head>
<body>
<span><a href="http://site1.com">1 site</a></span><br>
<a href="http://site2.com.">2 site</a>


</body>
</html>


Наконец то это заработало

Автор: Sardar 2.2.2005, 23:37
Цитата(Aliance @ 2.2.2005, 22:26)
Бред

Aliance следи за выражениями.

Второе, проверяй что говоришь, хотя бы запусти, а то на глазок можно попась в некрасивую ситуацию как сейчас, ибо ты не прав smile

Sl@va твой код IE only, посмотри на примеры выше.

Автор: Sl@va 3.2.2005, 00:40
Ок, спасибо, на счет кода я это учту.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)