javascript - 我可以在运行时修改 Javascript 库吗?

标签 javascript

我使用基于 Web 的开发环境来输入数据表单。该环境允许我创建由表单事件触发的规则。这些事件在浏览器中以js运行,但几乎不支持调试,这使得解决问题成为一场噩梦。

浏览器中的代码有一个中央事件处理程序,它具有日志记录功能,但它产生的信息量非常大,因此很难找到您需要的信息。想想信息级别的日志记录已经疯狂了。另外,您必须打开一个单独的窗 Eloquent 能访问日志。

我需要能够将某些事件记录到控制台,或者在指定的规则处触发断点。有没有办法修改下面的环境代码,以允许它调用我的调试器而不是(或另外)调用 SFLog?

function handleEvent(n,t,q,r,u,f,e,o,s,h,c,l){
    if(eventsCancelled!==!0){
        SFLog({type:3,source:"handleEvent",category:"Events",
            message:"{2} event fired from {1} - {0}",parameters:[n,t,q]});
            var b="Events/Event[@SourceID='"+n+"'][@SourceType='"+t+"'][Name/text()="+q.xpathValueEncode()+"]";
            //Rest of the event handler...

function SFLog(n){
    if(checkExists(_debug)){var s=translateDebugLevel(n.type);
    if(s>=_debug){
        varu=n.type,e=n.source,r=n.category,q=n.message,h=n.parameters,o=checkExists(n.exception)? WriteExceptionXml(n.exception):null,t=n.data,l=checkExists(n.humanateData)?
        n.humanateData:!0,f=(new Date).format("yyyy-MM-ddTHH:mm:ss:fff");
        checkExists(t)&&(dataString=t.xml,checkExists(dataString)||(dataString=t),l===!0&&(dataString=Humanate(dataString)));               
        //more code for SFLog...

清理代码

function handleEvent(n, t, q, r, u, f, e, o, s, h, c, l) {
  if (eventsCancelled !== !0) {
    SFLog({
      type: 3,
      source: "handleEvent",
      category: "Events",
      message: "{2} event fired from {1} - {0}",
      parameters: [n, t, q]
    });
    var b = "Events/Event[@SourceID='" + n + "'][@SourceType='" + t + "'][Name/text()=" + q.xpathValueEncode() + "]";
    //Rest of the event handler...
  }
}

function SFLog(n) {
  if (checkExists(_debug)) {
    var s = translateDebugLevel(n.type);
    if (s >= _debug) 
    {
      varu = n.type;
      e = n.source;
      r = n.category;
      q = n.message;
      h = n.parameters;
      o = checkExists(n.exception) ? 
        WriteExceptionXml(n.exception) :  
        null;
      t = n.data;
      l = checkExists(n.humanateData) ?
        n.humanateData : 
        !0;
        
      f = (new Date).format("yyyy-MM-ddTHH:mm:ss:fff");
      checkExists(t) && 
      (dataString = t.xml, checkExists(dataString) || 
      (dataString = t), l === !0 && (dataString = Humanate(dataString)));
      //more code for SFLog.

最佳答案

我同意@Eddie但一种解决方案可能是包装记录器函数并覆盖它,并且仅记录您关心的事件。例如:

function SFLog(n){
  //old code
}
//run on the console, the first line, and then the second.
var oldLoggger = SFLog;
function SFLog(n) {
  if(/*some criteria*/) {
    oldLogger(n);
  }
} 

这样您就可以在不同的条件下运行默认记录器,但如果您可以修改记录器代码本身以接受某些条件(例如要记录的事件类型或 targetElement 的 ID、类等),那可能会更好。

PD:如果您需要修改 eventHandler 本身,您应该:

  1. 首先删除事件处理程序。
  2. 创建您的包装函数。
  3. 添加包装函数作为事件处理程序

关于javascript - 我可以在运行时修改 Javascript 库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50709807/

相关文章:

javascript - ReactJs - 创建一个 "If"组件……好主意吗?

javascript - 从字符串创建 DOM 文档,不使用 JQuery

javascript - 三.js + Chrome 43 : Error creating WebGL context

javascript - 道场 + Highcharts : showAxes property moves the x and y axis

javascript - angularJS 中的客户端重复数据验证

javascript - 如何跳到下一个描述 Mocha 错误?

javascript - 扩大文本区域高度

php - 保存列表的顺序 (php/zend/jquery)

javascript - 消息对话框中的用户输入

Javascript 警报单击删除在 IE8 中不起作用