JavaScript通过事件代理高亮显示表格行的方法_javascript技巧_脚本之家金沙8331网址:

金沙8331网址,正文实例陈述了JavaScript通过事件代理高亮展现表格行的法子。分享给我们供大家仿效。具体得以实现形式如下:

更动方法的效果与利益日常是在原方法的根基上助长大家想要加的法力,就是退换其IMP,所以大家调用的时候仍旧调用原方法,不要求去修正

Highlight Rows table { background-color: lightgreen; } #third { background-color: yellow; }

一. 在分拣中重写在此以前的主意(即覆盖了原方法卡塔尔国

在分拣中重写在此以前的艺术:
People.h

@interface People : NSObject
- (void)say ;
@end

People +Swizzling.m

#import "People +Swizzling.h"

@implementation People (Swizzling)
- (void)say {
    NSLog(@"People +Swizzling.h  --- say");
}
@end

不过这么做的老毛病有2点:
1.在分拣中重写方法会覆盖掉原方法的法力(即调用不了原方法State of Qatar,
2,假如七个分类都重写了三个办法,运营机遇制无法鲜明会直接调用哪个方法;

Just one .. no another
Second .. no another
A third .. no another
Fourth for luck .. no another

二. 使用运转时的置换方法(method swizzling卡塔尔

写三个不一名的秘籍, 使用运行时将该格局与原方法沟通,
(子类的章程列表并不带有父类中的方法卡塔尔国

  • 分2种情况:
  • 原方法为父类方法,子类未有
  • 艺术和替换方法都达成于子类

Method m1 = class_getInstanceMethod(self, @selector(eat));
   Method m2 = class_getInstanceMethod(self, @selector(son_eat));

   BOOL add = class_addMethod(self, @selector(eat), method_getImplementation(m2), method_getTypeEncoding(m2));

1.先是种状态:子类未有兑现替换方法时,供给检查实验(将原方法名SEL和替换方法的兑现IMP,插手方法到本类中卡塔尔,
如若能参与,这时候原方法的格局完成指针指向了更迭方法,
再将替换方法SEL的IMP指向原方法的IMP就到位了法子交换;

if (add) {
        class_replaceMethod(self, @selector(son_eat), method_getImplementation(m1), method_getTypeEncoding(m1));
    }

2.次之种状态:俩个情势都在子类中一度实现,就一向调换方法就可以

else {
       method_exchangeImplementations(m1, m2);

   }

- (void)eat {
    NSLog(@"%s", __FUNCTION__);
}

- (void)son_eat {

    [self son_eat];

    NSLog(@"%s", __FUNCTION__);
}

确认保障该代码只会调用三次,制止频仍调用替换混乱
貌似是在+ (void)load 方法中

金沙8331网址 1

艺术沟通

但愿本文所述对我们的javascript程序设计有着支持。

三.C指针

  • (方法替换的庐山真面目目:将原方法的方法完毕指向叁个新的法子,新点子里面供给调用原方法的完结,即新章程是个人的;卡塔尔国

void (*gOrigDrawRect)(id, SEL, NSRect);
+ (void)load
{
        Method origMethod = class_getInstanceMethod(self, @selector(drawRect:));
        gOrigDrawRect = (void *)method_getImplementation(origMethod);
 if(!class_addMethod(self, @selector(drawRect:), (IMP)OverrideDrawRect, method_getTypeEncoding(origMethod)))
            method_setImplementation(origMethod, (IMP)OverrideDrawRect);
}

static void OverrideDrawRect(NSView *self, SEL _cmd, NSRect r)
{
        gOrigDrawRect(self, _cmd, r);
        [[NSColor blueColor] set];
        NSRectFill(r);
}
参考
  • Method Replacement for Fun and
    Profit

发表评论

电子邮件地址不会被公开。 必填项已用*标注