如何将所有相关的javascript添加到html元素

时间:2016-05-31 16:25:31

标签: javascript jquery node.js

有没有办法通过类名返回的所有javascript与html元素相关联?关于如何实现这一目标的任何建议?是否有任何节点包可以让我做这样的事情?

例如:

HTML

<div class="click_me">Click Me</div>

JS

$('.click_me').on('click', function() { alert ('hi') });

我想要类似的东西(在客户端或服务器端伪装代码):

function meta() {
   let js = [];
   js = getAllJavascriptByClassName('click_me');
   console.log(js[0]);
}

meta()的输出

$('.click_me').on('click', function() { alert ('hi') });

4 个答案:

答案 0 :(得分:5)

这将拉出给定类的所有元素的所有事件处理程序。 但是必须使用jquery附加这些处理程序。

&#13;
&#13;
function getAllEventHandlersByClassName(className) {
  var elements = $('.' + className);
  var results = [];
  for (var i = 0; i < elements.length; i++) {
    var eventHandlers = $._data(elements[i], "events");
    for (var j in eventHandlers) {
      var handlers = [];
      var event = j;
      eventHandlers[event].forEach(function(handlerObj) {
        handlers.push(handlerObj.handler.toString());

      });
      var result = {};
      result[event] = handlers;
      results.push(result);

    }

  }
  return results;
}

// demo

$('.target').on('click',function(event){
  alert('firstClick handler')
});
$('.target').on('click',function(event){
  alert('secondClick handler')
});
$('.target').on('mousedown',function(event){
  alert('firstClick handler')
});
console.log(getAllEventHandlersByClassName('target'));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='target'> </div>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

您可以使用getEventListeners() which is part of the chrome devtools但是对于使用客户端,可能会有一个重复的问题部分回答:How to find event listeners on a DOM node when debugging or from the JavaScript code?基本上显示(在第二个投票的答案中)取决于如何设置事件(javascript属性,eventListener,jquery,其他lib)有不同的方法来检索函数。

第一个问题中提到的视觉事件2程序似乎更像是第二个答案所暗示的库,所以这可能会解决你的问题。

答案 2 :(得分:2)

如果您只对jQuery解决方案感兴趣,我可能会建议您(我假设每种类型只有一个事件,但您需要在所有实例上循环):

function getAllJavascriptByClassName(className) {
  var elem = $('.' + className);
  var result = [];

  $('.' + className).each(function(index, element) {
    var resultObjs = jQuery._data(element, "events");
    var partialResult = [];
    var x = Object.keys(resultObjs).forEach(function(currentValue, index, array) {
      partialResult.push(resultObjs[currentValue][0].handler.toString());
    });
    result.push(partialResult);
  });
  return result;
}
function meta() {
  let js = [];
  js = getAllJavascriptByClassName('click_me');
  console.log(JSON.stringify(js, null, 4));
}
$(function () {
  $('.click_me').on('click', function (e) {
    alert('Click event: hi')
  });
  $('.click_me:last').on('keypress', function (e) {
    alert('Keypress event: hi')
  });
  meta();
});
<script src="https://code.jquery.com/jquery-1.12.3.min.js"></script>

<div class="click_me">Click Me</div>
<div class="click_me">Click Me</div>

答案 3 :(得分:2)

我会亲自在正确的位置覆盖addEventListener(意思是在最顶端)并配备一些安全防护装置。

遗憾的是,jquery事件处理程序似乎很难阅读......

&#13;
&#13;
var element = document.getElementById("zou");

element.addEventListener("click", function(e) {
  console.log("clicked from addevent");
});

element.addEventListener("mouseup", function(e) {
  console.log("mouseup from addevent");
});

$(element).on("mousedown", function(e) {
  console.log("mousedown from $")
});

console.log(element.getListeners());
&#13;
<script>
  window.eventStorage = {};

  (function() {
    var old = HTMLElement.prototype.addEventListener;

    HTMLElement.prototype.addEventListener = function(a, b, c) {
      if (!window.eventStorage[this]) {
        window.eventStorage[this] = [];
      }

      var val = {
        "event": a,
        "callback": b
      };

      var alreadyRegistered = false;
      var arr = window.eventStorage[this];
      for (var i = 0; i < arr.length; ++i) {
        if (arr.event == a && arr.callback == b) {
          alreadyRegistered = true;
          break;
        }
      }
      if (!alreadyRegistered) {
        arr.push(val);
      }
      old.call(this, a, b, c);
    }

    HTMLElement.prototype.getListeners = function() {
      return window.eventStorage[this] || {};
    }
  }());
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="zou">click on me</div>
&#13;
&#13;
&#13;