Javascript覆盖问题
有一段时间,我遇到了一个Javascript方法覆盖问题。问题是我在一个控件上得到了onclick事件处理程序,我需要在事件处理程序触发实际方法之前注入一些方法 假设DGrid.Headerclik实际分配给onclick事件 这就是我所做的Javascript覆盖问题,javascript,Javascript,有一段时间,我遇到了一个Javascript方法覆盖问题。问题是我在一个控件上得到了onclick事件处理程序,我需要在事件处理程序触发实际方法之前注入一些方法 假设DGrid.Headerclik实际分配给onclick事件 这就是我所做的 DGrid.Headerclik = handleinLocal; 因此,每当用户单击网格时,控件都会转到handleinLocal方法。在这里,我必须进行一些处理,然后调用基本Headerclik() 但这并不像预期的那样有效。在调用handle
DGrid.Headerclik = handleinLocal;
因此,每当用户单击网格时,控件都会转到handleinLocal方法。在这里,我必须进行一些处理,然后调用基本Headerclik()
但这并不像预期的那样有效。在调用handleinLocal()中的DGrid.Headerclik()时,递归调用handleinLocal()方法。但是我需要调用基本方法
有没有一种方法可以在JavaScript中实现它们???您应该将前面的处理程序存储在(closure)变量中:
(function() {
var oldHandler = DGrid.Headerclik;
DGrid.Headerclik = handleInLocal;
function handleInLocal() {
// ...
oldHandler();
// ...
}
})();
将原始回调保存在变量中,然后再将其重新分配给自己的处理程序。然后,在完成需要执行的操作后,从变量调用原始处理程序
var callback = DGrid.Headerclik;
DGrid.Headerclik = handleinLocal;
function handleinLocal()
{
...your code...
callback(); // invoke original handler
}
将原始的click事件处理程序复制到一个变量,然后在新的click事件处理程序中调用原始的click处理程序
var oldOnClick = DGrid.Headerclik || function() {};
DGrid.Headerclik = handleinLocal;
function handleinLocal() {
// Do what you need to do
oldOnClick();
}
谢谢大家的回复。。你的方法很优雅。。这成功地调用了基方法,我忘了告诉你一件事,DGrid是一个单独的函数,它有自己的方法和属性。我还有一个问题
DGrid.Headerclik()iself使用“this”运算符从其作用域访问方法和属性。。因此,在调用oldHandler()时,它会在本地内存中运行。不完全在DGrid范围内。(此运算符仅返回不在DGrid中的我的页面的属性)
为了避免这种情况,我将oldHandler分配回DGrid.Headerclik,并直接调用DGrid.Headerclik()
var oldHandler = DGrid.Headerclik;
DGrid.Headerclik = handleInLocal;
function handleInLocal(sColumnIdx){
FormColumnWidthJSONArray();
//OldHandler(sColumnIdx)
DGrid.Headerclik= OldSCCHandler;
DGrid.Headerclik(sColumnIdx) // To Call the actual Column Click handler in DGrid;
DGrid.Headerclik= HandleLocal;
}
看起来您对
DGrid的调用。Headerclick
似乎正在执行DOM调用,因此您可能患有可怕的DOM Livequery综合症。我可能错了,虽然男生没有回答我自己的问题,我只是想准确地输入,那就是我在使用答案选项。。为什么stack没有支持纯文本的回复选项。。??这个我真的很讨厌。。。
var oldHandler = DGrid.Headerclik;
DGrid.Headerclik = handleInLocal;
function handleInLocal(sColumnIdx){
FormColumnWidthJSONArray();
//OldHandler(sColumnIdx)
DGrid.Headerclik= OldSCCHandler;
DGrid.Headerclik(sColumnIdx) // To Call the actual Column Click handler in DGrid;
DGrid.Headerclik= HandleLocal;
}