我正在尝试找出不同的方法,我们可以使用它来检测Knockoutjs中的点击操作并为检测放置任何代码。我主要想要检测点击操作处理程序所花费的时间。
我尝试了什么?
我尝试使用绑定处理程序上提供的 Preprocess 函数挂钩绑定。我可以通过为特定的绑定句柄提供绑定预处理器来挂钩Knockout的逻辑来解释数据绑定属性。
因此,我修改了函数引用以添加拦截代码。显然,在之前添加代码,在之后添加代码。以下代码显示了该概念的工作版本。
ko.bindingHandlers.click.preprocess = function(value, name, addBindingCallback) {
if (value.indexOf("function") > -1) {
modifiedvalue = value.replace("function", "function __placeholderAnonymousFunction");
// return value needs to be returned back, so that event bubble/Capture can be done correctly
modifiedvalue = modifiedvalue + "; var returnValue = __placeholderAnonymousFunction.apply($data, arguments); ";
} else {
// return value needs to be returned back, so that event bubble/Capture can be done correctly
modifiedvalue = "var returnValue = " + value + ".apply($data, arguments);";
}
var returnvalue = "function($data,$event){ " +
"InterceptStart();"+
modifiedvalue +
" ;InterceptEnd(); " +
" return returnValue;" +
" }";
return returnvalue;
}
var startTime;
var endTime;
function InterceptStart(){
startTime = performance.now();
console.log("start");
}
function InterceptEnd(){
endTime = performance.now();
console.log("end. Total time spent=" + (endTime - startTime));
}
var ViewModel = function() {
var self = this;
self.clickHandler = function() {
console.log("in Click handler");
};
return self;
};
ko.applyBindings(new ViewModel());

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<button data-bind='click: clickHandler'>Intercept Me</button>
&#13;
问题
requestAnimationFrame
或setTimeout
中添加代码,以便在绘制结束时执行代码。类似于敲除组件绑定中的afterRender
的东西。 注意:对于涉及XHR交互的点击处理程序,我挂钩到XMLHttpRequest,我已经有了代码。因此,XHR相互作用超出了这个问题的范围。
编辑1:我不是在寻找调试解决方案。这用于检测函数调用并将数据发送到另一个应用程序。
答案 0 :(得分:0)
此类用例是否还有其他推荐方法?
我推荐的方法是使用浏览器的开发者工具......它们可以为您提供您想要的内容:在脚本(事件处理程序),布局和颜料上花费的时间。
例如:(记录在knockout documentation page)
Run Microtasks
更新的deferred
(我不认为您当前的代码会对这些更新...)