or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

configuration.mddestruction.mdevent-handling.mdindex.mdnavigation.mdplayback-control.mdslide-management.md

destruction.mddocs/

0

# Destruction and Cleanup

1

2

Methods for destroying carousel instances and cleaning up resources. Proper cleanup is essential for preventing memory leaks and ensuring clean removal of Slick functionality.

3

4

## Capabilities

5

6

### Destroy Carousel

7

8

Completely destroys the Slick instance and restores the original markup.

9

10

```javascript { .api }

11

/**

12

* Destroy Slick instance and restore original markup

13

* Removes all Slick-added elements, classes, and event listeners

14

*/

15

$('.slider').slick('unslick');

16

```

17

18

**Usage Examples:**

19

20

```javascript

21

// Basic destruction

22

$('.slider').slick('unslick');

23

24

// Destroy on page unload

25

$(window).on('beforeunload', function() {

26

$('.slider').slick('unslick');

27

});

28

29

// Destroy and reinitialize with new settings

30

$('.slider').slick('unslick');

31

$('.slider').slick({

32

// New configuration

33

slidesToShow: 2,

34

autoplay: true

35

});

36

37

// Conditional destruction

38

if ($('.slider').hasClass('slick-initialized')) {

39

$('.slider').slick('unslick');

40

}

41

42

// Destroy multiple sliders

43

$('.slider').each(function() {

44

if ($(this).hasClass('slick-initialized')) {

45

$(this).slick('unslick');

46

}

47

});

48

```

49

50

## Destruction Process

51

52

When `unslick()` is called, Slick performs comprehensive cleanup:

53

54

```javascript { .api }

55

// What happens during destruction:

56

// 1. Triggers 'destroy' event

57

// 2. Clears autoplay timers

58

// 3. Removes all event listeners

59

// 4. Removes cloned slides

60

// 5. Removes navigation elements (arrows, dots)

61

// 6. Restores original slide markup and styles

62

// 7. Removes Slick CSS classes

63

// 8. Cleans up internal state

64

```

65

66

## Event-Driven Cleanup

67

68

```javascript { .api }

69

// Listen for destruction event to perform custom cleanup

70

$('.slider').on('destroy', function(event, slick) {

71

console.log('Carousel being destroyed');

72

73

// Clean up custom event listeners

74

$(window).off('resize.customSlider');

75

$(document).off('keydown.customSlider');

76

77

// Clear custom timers

78

clearInterval(customProgressTimer);

79

clearTimeout(customDelayTimer);

80

81

// Remove custom elements

82

$('.custom-controls').remove();

83

$('.custom-progress-bar').remove();

84

85

// Clean up third-party integrations

86

if (window.analytics) {

87

analytics.cleanup();

88

}

89

90

// Clear stored references

91

customSliderInstance = null;

92

});

93

94

// Trigger destruction

95

$('.slider').slick('unslick');

96

```

97

98

## Responsive Destruction

99

100

```javascript { .api }

101

// Destroy at specific breakpoints using responsive settings

102

$('.slider').slick({

103

slidesToShow: 3,

104

responsive: [

105

{

106

breakpoint: 768,

107

settings: {

108

slidesToShow: 2

109

}

110

},

111

{

112

breakpoint: 480,

113

settings: 'unslick' // Destroys Slick at this breakpoint

114

}

115

]

116

});

117

118

// Manual responsive destruction

119

function handleResponsiveDestruction() {

120

if (window.innerWidth < 480 && $('.slider').hasClass('slick-initialized')) {

121

$('.slider').slick('unslick');

122

} else if (window.innerWidth >= 480 && !$('.slider').hasClass('slick-initialized')) {

123

$('.slider').slick({

124

// Reinitialize with settings

125

});

126

}

127

}

128

129

$(window).resize(handleResponsiveDestruction);

130

```

131

132

## Memory Management

133

134

```javascript { .api }

135

// Proper cleanup pattern for dynamic sliders

136

class SliderManager {

137

constructor() {

138

this.sliders = new Map();

139

this.eventHandlers = new Map();

140

}

141

142

createSlider(selector, options = {}) {

143

// Clean up existing slider if present

144

this.destroySlider(selector);

145

146

const $slider = $(selector);

147

const handlers = this.setupEventHandlers($slider);

148

149

// Store references for cleanup

150

this.sliders.set(selector, $slider);

151

this.eventHandlers.set(selector, handlers);

152

153

// Initialize slider

154

$slider.slick(options);

155

156

return $slider;

157

}

158

159

destroySlider(selector) {

160

const $slider = this.sliders.get(selector);

161

const handlers = this.eventHandlers.get(selector);

162

163

if ($slider && $slider.hasClass('slick-initialized')) {

164

// Clean up custom handlers first

165

if (handlers) {

166

handlers.forEach(handler => handler.cleanup());

167

}

168

169

// Destroy Slick instance

170

$slider.slick('unslick');

171

172

// Clean up references

173

this.sliders.delete(selector);

174

this.eventHandlers.delete(selector);

175

}

176

}

177

178

destroyAll() {

179

this.sliders.forEach((slider, selector) => {

180

this.destroySlider(selector);

181

});

182

}

183

184

setupEventHandlers($slider) {

185

const handlers = [];

186

187

// Custom handlers with cleanup functions

188

const resizeHandler = {

189

handler: () => this.handleResize($slider),

190

cleanup: () => $(window).off('resize.slider', this.handler)

191

};

192

193

$(window).on('resize.slider', resizeHandler.handler);

194

handlers.push(resizeHandler);

195

196

return handlers;

197

}

198

}

199

200

// Usage

201

const sliderManager = new SliderManager();

202

203

// Create slider

204

sliderManager.createSlider('.hero-slider', {

205

autoplay: true,

206

dots: true

207

});

208

209

// Clean up on page unload

210

$(window).on('beforeunload', () => {

211

sliderManager.destroyAll();

212

});

213

```

214

215

## Framework Integration Cleanup

216

217

```javascript { .api }

218

// React useEffect cleanup

219

useEffect(() => {

220

const $slider = $('.slider');

221

$slider.slick({

222

dots: true,

223

infinite: true

224

});

225

226

// Cleanup function

227

return () => {

228

if ($slider.hasClass('slick-initialized')) {

229

$slider.slick('unslick');

230

}

231

};

232

}, []);

233

234

// Angular component cleanup

235

export class SliderComponent implements OnDestroy {

236

ngOnDestroy() {

237

if (this.sliderElement && $(this.sliderElement).hasClass('slick-initialized')) {

238

$(this.sliderElement).slick('unslick');

239

}

240

}

241

}

242

243

// Vue component cleanup

244

export default {

245

beforeDestroy() {

246

if (this.$refs.slider && $(this.$refs.slider).hasClass('slick-initialized')) {

247

$(this.$refs.slider).slick('unslick');

248

}

249

}

250

}

251

```

252

253

## Debugging and Validation

254

255

```javascript { .api }

256

// Check if slider is initialized before destruction

257

function safeDestroy(selector) {

258

const $slider = $(selector);

259

260

if ($slider.length === 0) {

261

console.warn(`No elements found for selector: ${selector}`);

262

return false;

263

}

264

265

if (!$slider.hasClass('slick-initialized')) {

266

console.warn(`Slider not initialized: ${selector}`);

267

return false;

268

}

269

270

try {

271

$slider.slick('unslick');

272

console.log(`Successfully destroyed slider: ${selector}`);

273

return true;

274

} catch (error) {

275

console.error(`Error destroying slider: ${selector}`, error);

276

return false;

277

}

278

}

279

280

// Batch destruction with error handling

281

function destroyAllSliders() {

282

const sliders = $('.slick-initialized');

283

let successCount = 0;

284

let errorCount = 0;

285

286

sliders.each(function() {

287

try {

288

$(this).slick('unslick');

289

successCount++;

290

} catch (error) {

291

console.error('Error destroying slider:', error);

292

errorCount++;

293

}

294

});

295

296

console.log(`Destroyed ${successCount} sliders, ${errorCount} errors`);

297

return { success: successCount, errors: errorCount };

298

}

299

300

// Memory leak detection helper

301

function checkForMemoryLeaks() {

302

const activeSliders = $('.slick-initialized').length;

303

const slickElements = $('[class*="slick-"]').length;

304

305

console.log(`Active sliders: ${activeSliders}`);

306

console.log(`Elements with slick classes: ${slickElements}`);

307

308

if (activeSliders === 0 && slickElements > 0) {

309

console.warn('Potential memory leak: Slick elements found without active sliders');

310

return false;

311

}

312

313

return true;

314

}

315

```

316

317

## Best Practices for Destruction

318

319

```javascript { .api }

320

// 1. Always check initialization status

321

if ($slider.hasClass('slick-initialized')) {

322

$slider.slick('unslick');

323

}

324

325

// 2. Use try-catch for error handling

326

try {

327

$slider.slick('unslick');

328

} catch (error) {

329

console.error('Destruction failed:', error);

330

}

331

332

// 3. Clean up custom event listeners first

333

$slider.on('destroy', function() {

334

// Custom cleanup before Slick's cleanup

335

$(window).off('.customNamespace');

336

clearInterval(customTimer);

337

});

338

339

// 4. Nullify references after destruction

340

$slider.slick('unslick');

341

$slider = null;

342

sliderInstance = null;

343

344

// 5. Use namespaced events for easier cleanup

345

$(window).on('resize.mySlider', handleResize);

346

$(document).on('keydown.mySlider', handleKeydown);

347

348

// Later...

349

$(window).off('.mySlider');

350

$(document).off('.mySlider');

351

```