Могу ли я узнать из метода Javascript, кто \ какой элемент DOM вызвал меня? - PullRequest
16 голосов
/ 07 мая 2009
<a onclick ="foo()" href="bar.html" >Link </a>

<script>

...
function foo(){
  //I want to know the href property of whoever called me.
  //something like this.caller.href ??
}

</script>

Полагаю, я мог бы просто назначить все идентификаторы элементов и затем передать свой собственный идентификатор методу JS, который я вызываю, но я искал лучший способ.

Ответы [ 6 ]

19 голосов
/ 07 мая 2009

Когда браузер вызывает функцию в результате события DOM, JavaScript передает объект этой функции, который содержит информацию о событии. Но это работает немного по-другому в IE, чем другие. Для работы во всех браузерах foo() должен принимать аргумент * (я использую e):

function foo(e) {
  var sender = (e && e.target) || (window.event && window.event.srcElement);
  //sender is the DOM element which was clicked
  alert(sender.href); //assumes the clicked element was an <a>
}

В первой строке будет присвоено «sender» значение элемента, который инициировал событие во всех браузерах.

Теперь, если ваш <a> содержит дочерних элементов (например, изображение) и один из этих был фактическим нажатием элемента, тогда этот элемент станет "отправителем" ». Если это возможно, вам нужно пройти DOM от отправителя, пока не найдете свою ссылку:

function foo(e) {
  var sender = (e && e.target) || (window.event && window.event.srcElement);
  //sender is the DOM element which was clicked

  var myEle = sender;

  //find the parent node until we hit the <a>
  while(myEle.tagName.toUpperCase() != 'A') {
    myEle = myEle.parentNode;
  }

  //myEle is now the <a>. sender is still the originator.
  alert(myEle.href);
}

* Вы также можете получить доступ к любым аргументам, переданным функции, даже если они не объявлены, используя массив arguments[].

11 голосов
/ 07 мая 2009
<a onclick="foo(this)" href="bar.html">Link</a>

Тогда ваш JavaScript будет:

function foo(ob) {
    alert(ob.href); //or whatever you want to happen preferably pass an id 
}

Используйте селектор «this», если вы хотите передать сам объект в функцию.

2 голосов
/ 07 мая 2009

Здесь принято, что this относится к элементу DOM, для которого вызывается обработчик. Так что если вы хотите узнать ссылку на ссылку:

function foo () {
   // Inside foo this will refer to the DOM element if called as an event handler
   var href = this.href
}

Это должно сработать.

EDIT: Если foo вызывается из обработчика onclick явно в DOM, то есть

<a [...] onclick="foo()">

тогда исходный контекст this будет потерян внутри foo. Чтобы это исправить, можно привязать вызов функции к исходному контексту:

<a [...] onclick="foo.call(this)">
1 голос
/ 07 мая 2009

Вы можете передать значение атрибута href функции, когда она вызывается:

<a href="http://www.example.com" onclick="foo(this.href)">link</a>
0 голосов
/ 07 мая 2009

вам не нужно передавать элемент в качестве аргумента вашей функции. Вы можете использовать

var a = event.srcElement;
alert(a.href);
0 голосов
/ 07 мая 2009

Как насчет передачи аргумента?

foo(id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...