2014-02-03 2 views
6

У меня есть элемент якорь тег приходит в HTML, как:Как получить элемент вызывающего абонента в функции href javascript?

<a href="javascript:handleEvent(this, 'abc')"></a> 

Теперь в яваскрипте функции, я написал:

function handleEvent(sourceElement, txt) { 
    console.log(sourceElement); 
} 

утешаемого элемент подходит как окно в этом случае. Я попробовал sourceElement.document.activeElement, но он, похоже, не работает в chrome, где он приходит как элемент body.

Я не могу изменить структуру тега привязки на функцию onClick, поскольку это происходит из какого-то другого источника. Есть ли способ найти вызывающий элемент в этом сценарии?

+0

возможного дубликата [получить объект события в функции обработки без события передать объект события в качестве параметров? (с jquery)] (http://stackoverflow.com/questions/5849370/get-the-event-object-in-an-event-handling-function-without-pass-the-event-object) – pwolaq

+3

@Pawel_W: Нет, есть большая разница между 'href =" javascript: ... "' и 'onclick =" ... "'. –

ответ

4

Настоящий ответ заключается в том, чтобы изменить HTML, который, как вы сказали, вы не можете сделать. Я бы сказал, если сможешь. Если вы пишете эту функцию, а имя функции находится в HTML, как вы не можете изменить HTML?

Но если вы действительно, действительно не можете, вы можете обновить DOM, когда он загружен:

var list = document.querySelectorAll('a[href^="javascript:"]'); 
var x, link; 
for (x = 0; x < list.length; ++x) { 
    link = list[x]; 
    link.onclick = new Function(link.href.substring(11)); 
    link.href = "javascript:;"; 
} 

Live Copy | Live Source

Это довольно озорной, так как он использует Function конструктор (который очень похож eval), но если вы доверяете источник HTML, что должно быть в порядке.

Или, конечно, если вам не нужно использовать все, что было в href, просто подключите обработчик событий в приведенном выше коде и не используйте new Function.

1

Если у вас есть доступ к JS, вы могли бы сделать что-то вроде этого:

document.addEventListener('DOMContentLoaded', function(){ 
    var link = document.querySelectorAll('a'); 
    link[0].addEventListener('click', function(e){ 
     console.log(e.target); 
    }); 
}); 

С этим, вы бы просто не делать ничего с этим событием рядный href и быть просто добавив свой собственный обработчик.

+0

Этот ответ неверен на разных уровнях: добавление слушателя не приводит к магическому исчезновению другого фрагмента кода обработки событий. Это также не связывает обработчик с _all_ элементами, а только с первым элементом привязки DOM. 'querySelectorAll' также лучше поддерживается, чем некоторые из новых функций getElementsBy * (например,' getElementsByClassName'), используйте это, когда можете. Также лучше указать третий аргумент, который вы передаете 'addEventListener' –

+0

@EliasVanOotegem Несколько вещей, о которых вы прокомментировали: 1) Я никогда не говорил, что добавление слушателя событий приведет к исчезновению встроенного объявления. Я прямо сказал, что ОП просто будет игнорировать встроенную декларацию. 2) ОП сказал, что у него есть анкерный элемент АН; следовательно, индекс 0. Очевидно, что если бы он хотел привязать ко всем якорям, это был бы другой процесс. 3) Обновлен для использования 'querySelectorAll'. – Joe

+0

_ «При этом вы будете игнорировать встроенный href« _ <- no, вы бы не –

1

попробовать что-то вроде этого, используйте jQuery

просто выберите ссылку тег с селектором

 $(function(){ 
      var href = $('a').attr('href'); 
      href = href.replace('javascript:',''); 
      $('a').attr('href','#'); 
      $('a').attr('onclick',href); 
     }) 

Это просто обходной путь решения.

+0

'onclick' и' href' не эквивалентны. 'href' можно использовать с клавиатурой. 'onclick' может использоваться только с помощью мыши. – ceving

1

И если нет другого ответа здесь не работает для вас потому вы не можете обновить DOM после его загрузки (попробуйте сделать любого из них, если вы хотите изменить squarespace lightbox - не сказать, что это невозможно, но ...) , вот из коробки мышление:

Иногда будет что-то намекающее где a href есть. Поэтому вы можете использовать его.

<div class="hint current"> 
    <a href="javascript:handleEvent('.hint')"> 

В моем случае, я даже не знал, намек, не нуждаясь параметр, который сделал вещи еще проще:

function handleEvent (hint) { 
    if(!hint) { 
     hint = $("div.current"); 
    } 
    hrefElement = $(hint).find('a[href^=javascript]'); 
} 

Это, конечно, будет иметь смысл, если ваш DOM постоянно изменяется с помощью сценария у вас нет доступа.

Но даже если нет ничего намекая на a href, вы могли бы сделать что-то вроде этого:

<a href="javascript:var x=1;handleEvent(1)"> 

function handleEvent (uniqueId) { 
    hrefElement = $('a[href^=javascript:var x='+uniqueId); 
} 
+1

Cawas, по моему мнению, этот ответ хорошо работает для простых htmls, но html, с которым я столкнулся в то время, был действительно сложным. Было 100 элементов без какого-либо класса/id, выглядящих точно так же, но только разница была в событии href. В этом случае вы не можете использовать .find, чтобы получить элемент, поскольку мы не знаем, какой из них вызвал функцию. Вот почему он менял его на onclick, поскольку я мог легко получить элемент. – Kop4lyf

+0

Нет ничего проще в лайтбоксе squarespace, но он хорошо организован. Полагаю, это разные ситуации. В моем случае никакой другой ответ не работал. ;) (теперь я вижу, что должен пересмотреть идею и сосредоточиться на этом, спасибо) – cregox

+0

Согласен полностью !!! Кстати, html, который я получал, был из отчета Jaspersoft, если вы хотите проверить. – Kop4lyf

Смежные вопросы