delegate should use addEventListener