установка гиперссылки на клик с помощью JavaScript [дубликата]

0

Мне нужна помощь с этим кодом JavaScript. по какой-то причине переменная "index" всегда оказывается последним индексом массива независимо от того, какую ссылку я нажимаю.

var linkElements = document.getElementsByTagName('a');
var index;
var origOnClickArr = [];
for (index = 0; index < linkElements.length; ++index) {
    origOnClickArr.push(linkElements[index].onclick);
    linkElements[index].onclick = function (e) {
        if (confirm(message)) {
            origOnClickArr[index]();
        }
    };
}
  • 1
    Концепция Clousre должна быть применена, чтобы исправить это.
  • 1
    Как @Suman почти сказал ;-) поискать closures . Это не простая концепция, чтобы разобраться, но она объясняет, в чем проблема. Есть уже много вопросов по SO на эту тему
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ

Попробуйте что-то вроде этого

var linkElements = document.getElementsByTagName('a');
var index;
var origOnClickArr = [];
for (index = 0; index < linkElements.length; ++index) {
(function (index) {
    origOnClickArr.push(linkElements[index].onclick);
    linkElements[index].onclick = function (e) {
        if (confirm(message)) {
            origOnClickArr[index]();
        }
    };
})(index)
}

оберните код внутри цикла for внутри самозапускающей анонимной функции и передайте значение индекса для каждого цикла.

  • 0
    это работало отлично. Спасибо Абхишек
  • 0
    Зачем вам вообще нужен массив событий (origOnClickArr).
0

Вы можете добавить в список прослушивателей событий с помощью addEventListener или удалить прослушиватель событий. В идеале вы должны создавать функции и использовать javascript для назначения всей функции, которую вы хотите вызвать +, функции-обертки, которая делает подтверждение вместо встроенного назначения событию onclick. (http://www.quirksmode.org/js/events_advanced.html).

Один из способов добиться того, что вы делаете, - использовать методы захвата/пузырьков событий.

Захват события происходит от родительского элемента к потомку, за которым следует событие, возбуждающееся от дочернего элемента к родительскому.

Вы можете назначить обработчик события захвата для подтверждения. Если пользователь подтверждает, пусть событие продолжает распространяться. Если нет, прекратите распространение.

Неподтвержденный, но может работать:

var message = 'Confirm';
function doConfirm()
{
   if (!confirm(message))
   {
       if (window.event)
       {
          if (window.event.stopPropagation) // w3c compliant browsers
          {
              event.stopPropagation();
          }
          else // Old IE browsers (ie 8 or ie 9 if i remember correctly)
          {
             event.cancelBubble = true;
          } 
       }
   }
}

var arr = document.getElementsByTagName("a");
for (var i = arr.length-; i >= 0; i--)
{
   arr[i].addEventListener("click", doConfirm, true); // true indicates capture phase.
}
  • 0
    это работает только для ссылок с "HREF", хотя. У меня есть набор ссылок, некоторые с помощью hrefs, а другие с помощью onClick. Все они вызывают разные функции. в основном у меня есть куча ссылок всех видов
  • 0
    в основном у меня здесь есть куча ссылок всех видов <a href="url1"> 1 </a> <a href="url2"> 2 </a> <a href = "#" onclick = "javascript: function1 () "> 3 </a> <a href="#" onclick="javascript:function2()"> 4 </a> <a href="#" onclick="javascript:function2()"> 5 << / a> Я пытаюсь получить подтверждение при нажатии на каждую ссылку. если они согласны с сообщением, выполняется команда href или onclick; иначе ничего не происходит
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню