Подтвердить что ты не робот

Как найти то, что вызывает preventDefault, которое переопределяет нормальное поведение кликов

Я унаследовал некоторый большой кусок кода. Где-то внутри слишком обобщенного e.preventDefault() запрещается нормальное поведение якорного щелчка.

Я подумал о запуске профилировщика в веб-браузерах Chrome, чтобы узнать, что происходит при нажатии на определенную ссылку, в надежде отследить ее обратно в заявлении виновника. Однако мне не повезло

как я могу отследить (если возможно) инструкцию, которая переопределяет поведение обычного клика при нажатии ссылки в веб-браузере Chrome? (Я использую jQuery)

4b9b3361

Ответ 1

Вы можете переопределить Event.prototype.preventDefault и добавить оператор debugger в качестве первой строки.

Запустите следующую консоль.

var oldEPD = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() {
    debugger;
    oldEPD.call(this);
};

Ответ 2

Основываясь на техническом ответе, здесь представлена ​​современная и более продвинутая версия, которая весьма полезна для отладки проблем, связанных с событиями. Обратите внимание, что он ожидает, что вы используете современный env JS, такой как Webpack/Babel, но вы, безусловно, можете сделать ту же работу со старым синтаксисом JS.

Это в основном то же самое, кроме сообщения журнала, более удобно. Я пытаюсь вычислить "значимый селектор", который поможет вам отладить проблему:

click.stopPropagation() в разделе # nav-bar > a.Tappable-inactive.group-link.nav-bar-item.my-main-team > div.nav-bar-item-content > svg

// Logs all calls to preventDefault / stopPropagation in an user-friendly way
if ( process.env.NODE_ENV !== "production" ) {
  (function monkeyPatchEventMethods() {

    const logEventMethodCall = (event,methodName) => {
      const MinimumMeaninfulSelectors = 3; // how much meaningful items we want in log message
      const target = event.target;

      const selector = (function computeSelector() {
        const parentSelectors = [];
        let node = target;
        let minimumSelectors = 0;
        do {
          const meaningfulSelector = node.id ?
            `#${node.id}` : node.classList.length > 0 ?
              `.${Array.prototype.join.call(node.classList, '.')}` : undefined;
          if ( meaningfulSelector ) minimumSelectors++;
          const nodeSelector = `${node.tagName.toLowerCase()}${meaningfulSelector ? meaningfulSelector : ''}`;
          parentSelectors.unshift(nodeSelector);
          node = node.parentNode;
        } while (node && node !== document && minimumSelectors < MinimumMeaninfulSelectors);
        return parentSelectors.join(" > ");
      })();

      console.debug(`${event.type}.${methodName}() on ${selector}`,event);
    };

    const preventDefault = Event.prototype.preventDefault;
    Event.prototype.preventDefault = function() {
      logEventMethodCall(this,'preventDefault');
      preventDefault.call(this);
    };

    const stopPropagation = Event.prototype.stopPropagation;
    Event.prototype.stopPropagation = function() {
      logEventMethodCall(this,'stopPropagation');
      stopPropagation.call(this);
    };

  })();
}

https://gist.github.com/slorber/b1c0ffef56abd449c05476b5c609a36e

Ответ 3

В дополнение к различным ответам preventDefault() здесь вы также можете увидеть, есть ли в вашем HTML-коде, вы возвращаете false в свой обработчик событий OnClick, например:

<a href="#" onclick="DoSomething(); return false;"></a>

Если вы это сделаете, просто удалите его (It true по умолчанию):

<a href="#" onclick="DoSomething()"></a>

Ответ 4

Возможно, найдите свой код на e.preventDefault и добавьте точку останова в эту строку. Вы можете прочитать стек вызовов, когда точка останова запускается, и вы можете увидеть, какой код переопределяет клик.