Передача аргумента в функцию JS по ссылке onclick - PullRequest
0 голосов
/ 09 июня 2011

У меня есть ссылка, которая выглядит следующим образом:

<a id="mylink" onclick="deleteHike( 3 );" href="javascript:void(0);">Yes</a>

Он может вызывать этот JavaScript:

window.onload = function()
{

  //Get a reference to the link on the page
  // with an id of "mylink"
  var a = document.getElementById("mylink");

  //Set code to run when the link is clicked
  // by assigning a function to "onclick"
  a.onclick = function( hike_id )
  {
     // Somecode her
     // But when I try to use the hike_id it displays as [object MouseEvent] 
  }
}

Но значение, которое входит в это [объект MouseEvent],не тот номер, который я ожидал.Есть идеи, почему это происходит и как это исправить?:)

Спасибо!

Ответы [ 5 ]

2 голосов
/ 09 июня 2011

Вы пытаетесь назначить функцию своей ссылке двумя различными и противоречивыми способами.

Использование строки функции eval-ed, onclick = "function(value)", работает, но не рекомендуется.

Другой способ привязки обработчика щелчка в событии onload также работает, но если вы хотите, чтобы было передано определенное значение, вам придется немного изменить свой сценарий, потому что значение задано в начальном onclick полностью теряется при установке onclick на новую функцию.

Чтобы ваш текущий метод работал, вам вообще не нужен обработчик onload. Вам просто нужно это:

function deleteHike(hike_id) {
   // Some code here
}

Чтобы сделать это вторым способом, который я рекомендую, он будет выглядеть так:

<a id="mylink" href="javascript:void(0);">Yes</a>

с этим сценарием:

function deleteHike(e, hike_id) {
   // Some code here
   // e refers to the event object which you can do nifty things with like
   //  - learn the actual clicked element if it was a parent or child of the `this` element
   //  - stop the event from bubbling up to parent items
   //  - stop the event from being captured by child items
   //   (I may have these last two switched)
}

function getCall(fn, param) {
   return function(e) {
      e = e || window.event;
      e.preventDefault(); // this might let you use real URLs instead of void(0)
      fn(e, param);
   };
}

window.onload = function() {
   var a = document.getElementById("mylink");
   a.onclick = getCall(deleteHike, 3);
};

Параметром функции события DOM является объект события (в Firefox и других совместимых со стандартами браузерах). В IE ничего нет (поэтому нужно также захватывать window.event). Я добавил небольшую вспомогательную функцию, которая создает замыкание вокруг значения вашего параметра. Вы могли бы делать это каждый раз самостоятельно, но это было бы больно. Важной частью является то, что getCall - это функция, которая возвращает функцию , и именно эта возвращаемая функция вызывается при нажатии на элемент.

Наконец, я настоятельно рекомендую вместо всего этого использовать библиотеку, такую ​​как jQuery , потому что она решает все виды проблем для вас, и вам не нужно знать сумасшедший JavaScript, который требует большого опыта чтобы правильно понять, проблемы, такие как:

  • Наличие нескольких обработчиков для одного события
  • Запуск JavaScript как можно скорее, прежде чем событие onload сработает с имитированным событием ready. Например, возможно, изображение все еще загружается, но вы хотите сделать акцент на элементе управления, прежде чем пользователь попытается использовать страницу, вы не можете сделать это с onload, и это действительно трудно проблему решить кросс-браузерной.
  • Работа с тем, как передается объект события
  • Выяснение всех различных способов, с помощью которых браузеры обрабатывают такие вещи, как распространение событий, получение выбранного элемента и т. Д.

Примечание: в вашем обработчике кликов вы можете просто использовать событие this, которое будет содержать элемент clicked. Это может быть очень мощным для вас, потому что вместо того, чтобы кодировать, какой элемент был в JavaScript для события onclick каждого элемента, вы можете просто привязать один и тот же обработчик ко всем вашим элементам и получить его значение из элемента. Это лучше, поскольку позволяет кодировать информацию об элементе только в элементе, а не в элементе и JavaScript.

1 голос
/ 09 июня 2011

Вы должны просто иметь возможность объявить функцию следующим образом (не нужно назначать на window.onload):

function deleteHike(hike_id)
{
     // Somecode her
     // But when I try to use the hike_id it displays as [object MouseEvent] 
}
1 голос
/ 09 июня 2011

Первый параметр в событии javascript - это само событие.Если вам нужна ссылка обратно на тег «a», вы можете использовать переменную this , поскольку область действия теперь является тегом «a».

0 голосов
/ 14 мая 2014

Вот мой новый любимый способ решения этой проблемы. Мне нравится этот подход за его ясность и краткость.

Используйте этот HTML:

<a onclick="deleteHike(event);" hike_id=1>Yes 1</a><br/>
<a onclick="deleteHike(event);" hike_id=2>Yes 2</a><br/>
<a onclick="deleteHike(event);" hike_id=3>Yes 3</a><br/>

С этим JavaScript:

function deleteHike(event) {
    var element = event.target;
    var hike_id = element.getAttribute("hike_id");
    // do what you will with hike_id
    if (confirm("Delete hike " + hike_id + "?")) {
        // do the delete
        console.log("item " + hike_id + " deleted");
    } else {
        // don't do the delete
        console.log("user canceled");
    }
    return;
}

Этот код работает, потому что event определяется в среде JavaScript при вызове обработчика onclick.

Для более полного обсуждения (в том числе, почему вы можете использовать «data-hike_id» вместо «hike_id» в качестве атрибута элемента), см .: Как хранить произвольные данные для некоторых тегов HTML .

Это альтернативные формы HTML, которые имеют одинаковый эффект:

<a onclick="deleteHike(event);" hike_id=4 href="javascript:void(0);">Yes 4</a><br/>
<button onclick="deleteHike(event);" hike_id=5>Yes 5</button><br/>
<span onclick="deleteHike(event);" hike_id=6>Yes 6</span><br/>
0 голосов
/ 09 июня 2011

Когда вы назначаете функцию для события в DOM-элементе, подобном этому, браузер автоматически передает объект события (в данном случае MouseEvent, поскольку это onclick событие) в качестве первого аргумента.

Попробуй вот так,

a.onclick = function(e, hike_id) { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...