简短的回答是你不能。您要求的是 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 相关的更改。即添加和删除节点等。它们不允许您在输入中注册文本更改事件。
我只能说,如果您有一个您无法控制的网页,即您被排除在外,那么我认为您应该认真重新考虑设计。