【问题标题】:Return a javascript stack trace for input when text is changed by script code当脚本代码更改文本时,返回用于输入的 javascript 堆栈跟踪
【发布时间】:2014-08-21 08:49:09
【问题描述】:

我想知道如何找出哪个 Javascript 文件正在更改我页面上输入的文本。

例如,我有一个带有文本输入的页面和 5 个包含的 javascript 文件,但我不知道哪个正在更改文本输入的值。

我尝试过使用更改事件,但是当文本被另一个脚本更改时,它不会触发。

1.js 文件:

<script>
$(".MySection").children().children().eq(3).val("Text Changed!")
</script>

2.js 文件:

<script>
$(".MySection").children().children().eq(3).val("Text Changed!")
</script>

【问题讨论】:

    标签: javascript html tags find


    【解决方案1】:

    简短的回答是你不能。您要求的是 javascript 堆栈跟踪。

    堆栈跟踪很容易强制/生成,如下所示:

     $("#myText").change(function(){
      var e = new Error('dummy');
      var stack = e.stack.replace(/^[^\(]+?[\n$]/gm, '')
          .replace(/^\s+at\s+/gm, '')
          .replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@')
          .split('\n');
      console.log(stack);
        });
    });
    

    console.log 可以通过在 Chrome 中使用浏览器开发工具 Ctrl+Shift+I 来读取。

    所以这一切都很好,但正如您正确指出的那样,当输入的值是动态设置时(即通过代码),change 事件不会触发,因此您没有任何用处来放置堆栈跟踪代码以便获取一个堆栈跟踪,让您可以查看哪些代码/代码文件正在进行该更改。

    $(".MySection").children().children().eq(3).val("Text Changed!")
    

    没有办法解决这个问题,因为您根本无法拦截事件。即使您注册/绑定到 propertychanged、change、input、keydown、paste、DOMSubtreeModified 事件,它也不会工作,因为这些事件都不会响应输入文本值的动态更新而触发。

    $("#myText").bind("propertychanged, change, input, keydown, paste, DOMSubtreeModified", function(event){
      // call stack trace here, except these bindings WONT be fired whenever the val is set dynamically
    });
    

    你可能会追上DOM 4 Mutation Observers

    MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
    
    var observer = new MutationObserver(function(mutations, observer) {
        // fired when a mutation occurs
        console.log(mutations);
        // ...
    });
    
    var n = $("#myText").get(0);
    // define what element should be observed by the observer
    // and what types of mutations trigger the callback
    observer.observe(n, {
        subtree: true,
        attributes: true,
        childList: true,
        characterData: true,
        attributeOldValue: true,
        characterDataOldValue: true
    });
    

    但它们不会帮助您,因为它们不会观察单个控件属性,而只是观察与 DOM 相关的更改。即添加和删除节点等。它们不允许您在输入中注册文本更改事件。

    我只能说,如果您有一个您无法控制的网页,即您被排除在外,那么我认为您应该认真重新考虑设计。

    【讨论】:

      【解决方案2】:

      在您的示例代码中,它将发生在您的 html 中最后包含的文件。

      例如。如果您在 html 中使用两次,那么最后一次将起作用:

      <script>
      $(".MySection").children().children().eq(3).val("Text Changed!")
      </script>
      <script>
      $(".MySection").children().children().eq(3).val("This would work!")
      </script>
      </body>
      

      【讨论】:

      • 不幸的是,javascript 代码不在 HTML 文件中,它们在 JS 文件中单独工作。您的代码也将打印第二个,因为它是控制文本框的最新 javascript。但我不知道是哪一个在研究它。
      【解决方案3】:

      在你的 javascript 文件的第一行添加这个:

      alert('Javascript file X');
      

      非常基本,但应该可以工作

      【讨论】:

      • 不幸的是所有 javacsript 都在加载,我想了解哪个文件(或哪一行 javascript> 正在工作。
      • 我不太明白,你说 5 个 javascript 文件控制文本框但你不知道哪个在工作?
      猜你喜欢
      • 2011-08-07
      • 2019-03-31
      • 1970-01-01
      • 2012-07-25
      • 2013-07-13
      • 2013-06-13
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多