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

时间:2018-06-05 22:28:07

标签: javascript

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

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

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




1 个答案:

答案 0 :(得分:1)

我同意@Eddie但是一个解决方案可能是包装记录器功能并覆盖它,并且只记录您关心的事件。 e.g:

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);
  }
} 

通过这种方式,您可以运行具有不同条件的默认记录器,但如果您可以修改记录器代码本身以接受某些条件(例如,记录事件类型,或者记录目标元素的ID,类等等),则最好。

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

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