Ошибка Uncaught TypeError: $(…).tooltip is not a function at HTMLDocument - как решить? [закрыт]

159
13 марта 2021, 10:20
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 1 год назад.

Улучшить вопрос

Сайт находится на хостинге. Не работает переключатель валют. В консоли ошибки:

>

 Uncaught TypeError: $(...).tooltip is not a function
    at HTMLDocument.<anonymous> (VM1757 common.js:132)
    at j (VM1755 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM1755 jquery.min.js:2)
    at Function.ready (VM1755 jquery.min.js:2)
    at HTMLDocument.J (VM1755 jquery.min.js:2)
common.js:132 Uncaught TypeError: $(...).tooltip is not a function
    at HTMLDocument.<anonymous> (VM1757 common.js:132)
    at j (VM1755 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM1755 jquery.min.js:2)
    at Function.ready (VM1755 jquery.min.js:2)
    at HTMLDocument.J (VM1755 jquery.min.js:2)
common.js:132 Uncaught TypeError: $(...).tooltip is not a function
    at HTMLDocument.<anonymous> (VM1757 common.js:132)
    at j (VM1755 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM1755 jquery.min.js:2)
    at Function.ready (VM1755 jquery.min.js:2)
    at HTMLDocument.J (VM1755 jquery.min.js:2)
Uncaught TypeError: $(...).tooltip is not a function
    at HTMLDocument.<anonymous> (VM1757 common.js:132)
    at j (VM1755 jquery.min.js:2)
    at Object.fireWith [as resolveWith] (VM1755 jquery.min.js:2)
    at Function.ready (VM1755 jquery.min.js:2)
    at HTMLDocument.J (VM1755 jquery.min.js:2)
common.js:132 Uncaught TypeError: $(...).tooltip is not a function
    at HTMLDocument.<anonymous> (common.js:132)
    at j (jquery.js:3148)
    at Object.fireWith [as resolveWith] (jquery.js:3260)
    at Function.ready (jquery.js:3472)
    at HTMLDocument.J (jquery.js:3503)

common.js

function getURLVar(key) { 
	var value = []; 
 
	var query = document.location.search.split('?'); 
 
	if (query[1]) { 
		var part = query[1].split('&'); 
 
		for (i = 0; i < part.length; i++) { 
			var data = part[i].split('='); 
 
			if (data[0] && data[1]) { 
				value[data[0]] = data[1]; 
			} 
		} 
 
		if (value[key]) { 
			return value[key]; 
		} else { 
			return ''; 
		} 
	} 
} 
 
$(document).ready(function() { 
	// Highlight any found errors 
	$('.text-danger').each(function() { 
		var element = $(this).parent().parent(); 
 
		if (element.hasClass('form-group')) { 
			element.addClass('has-error'); 
		} 
	}); 
 
	// Currency 
	$('#form-currency a').on('click', function(e) { 
		e.preventDefault(); 
 
		$('#form-currency input[name=\'code\']').val($(this).attr('name')); 
 
		$('#form-currency').submit(); 
	}); 
 
	// Language 
	$('#form-language a').on('click', function(e) { 
		e.preventDefault(); 
 
		$('#form-language input[name=\'code\']').val($(this).attr('name')); 
 
		$('#form-language').submit(); 
	}); 
 
	/* Search */ 
	$('#search input[name=\'search\']').parent().find('button').on('click', function() { 
		var url = $('base').attr('href') + 'index.php?route=product/search'; 
 
		var value = $('header #search input[name=\'search\']').val(); 
 
		if (value) { 
			url += '&search=' + encodeURIComponent(value); 
		} 
 
		location = url; 
	}); 
 
	$('#search input[name=\'search\']').on('keydown', function(e) { 
		if (e.keyCode == 13) { 
			$('header #search input[name=\'search\']').parent().find('button').trigger('click'); 
		} 
	}); 
 
	// Menu 
	$('#menu .dropdown-menu').each(function() { 
		var menu = $('#menu').offset(); 
		var dropdown = $(this).parent().offset(); 
 
		var i = (dropdown.left + $(this).outerWidth()) - (menu.left + $('#menu').outerWidth()); 
 
		if (i > 0) { 
			$(this).css('margin-left', '-' + (i + 10) + 'px'); 
		} 
	}); 
 
	// Product List 
	$('#list-view').click(function() { 
		$('#content .product-grid > .clearfix').remove(); 
 
		$('#content .row > .product-grid').attr('class', 'product-layout product-list col-xs-12'); 
		$('#grid-view').removeClass('active'); 
		$('#list-view').addClass('active'); 
 
		localStorage.setItem('display', 'list'); 
	}); 
 
	// Product Grid 
	$('#grid-view').click(function() { 
		// What a shame bootstrap does not take into account dynamically loaded columns 
		var cols = $('#column-right, #column-left').length; 
 
		if (cols == 2) { 
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-6 col-md-6 col-sm-12 col-xs-12'); 
		} else if (cols == 1) { 
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-4 col-md-4 col-sm-6 col-xs-12'); 
		} else { 
			$('#content .product-list').attr('class', 'product-layout product-grid col-lg-3 col-md-3 col-sm-6 col-xs-12'); 
		} 
 
		$('#list-view').removeClass('active'); 
		$('#grid-view').addClass('active'); 
 
		localStorage.setItem('display', 'grid'); 
	}); 
 
	if (localStorage.getItem('display') == 'list') { 
		$('#list-view').trigger('click'); 
		$('#list-view').addClass('active'); 
	} else { 
		$('#grid-view').trigger('click'); 
		$('#grid-view').addClass('active'); 
	} 
 
	// Checkout 
	$(document).on('keydown', '#collapse-checkout-option input[name=\'email\'], #collapse-checkout-option input[name=\'password\']', function(e) { 
		if (e.keyCode == 13) { 
			$('#collapse-checkout-option #button-login').trigger('click'); 
		} 
	}); 
 
	// tooltips on hover 
	$('[data-toggle=\'tooltip\']').tooltip({container: 'body',trigger: 'hover'}); 
 
	// Makes tooltips work on ajax generated content 
	$(document).ajaxStop(function() { 
		$('[data-toggle=\'tooltip\']').tooltip({container: 'body'}); 
	}); 
}); 
 
// Cart add remove functions 
var cart = { 
	'add': function(product_id, quantity) { 
		$.ajax({ 
			url: 'index.php?route=checkout/cart/add', 
			type: 'post', 
			data: 'product_id=' + product_id + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1), 
			dataType: 'json', 
			beforeSend: function() { 
				$('#cart > button').button('loading'); 
			}, 
			complete: function() { 
				$('#cart > button').button('reset'); 
			}, 
			success: function(json) { 
				$('.alert, .text-danger').remove(); 
 
				if (json['redirect']) { 
					location = json['redirect']; 
				} 
 
				if (json['success']) { 
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>'); 
 
					// Need to set timeout otherwise it wont update the total 
					setTimeout(function () { 
						$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>'); 
					}, 100); 
 
					$('html, body').animate({ scrollTop: 0 }, 'slow'); 
 
					$('#cart > ul').load('index.php?route=common/cart/info ul li'); 
				} 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	}, 
	'update': function(key, quantity) { 
		$.ajax({ 
			url: 'index.php?route=checkout/cart/edit', 
			type: 'post', 
			data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1), 
			dataType: 'json', 
			beforeSend: function() { 
				$('#cart > button').button('loading'); 
			}, 
			complete: function() { 
				$('#cart > button').button('reset'); 
			}, 
			success: function(json) { 
				// Need to set timeout otherwise it wont update the total 
				setTimeout(function () { 
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>'); 
				}, 100); 
 
				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') { 
					location = 'index.php?route=checkout/cart'; 
				} else { 
					$('#cart > ul').load('index.php?route=common/cart/info ul li'); 
				} 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	}, 
	'remove': function(key) { 
		$.ajax({ 
			url: 'index.php?route=checkout/cart/remove', 
			type: 'post', 
			data: 'key=' + key, 
			dataType: 'json', 
			beforeSend: function() { 
				$('#cart > button').button('loading'); 
			}, 
			complete: function() { 
				$('#cart > button').button('reset'); 
			}, 
			success: function(json) { 
				// Need to set timeout otherwise it wont update the total 
				setTimeout(function () { 
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>'); 
				}, 100); 
				 
				var now_location = String(document.location.pathname); 
 
				if ((now_location == '/cart/') || (now_location == '/checkout/') || (getURLVar('route') == 'checkout/cart') || (getURLVar('route') == 'checkout/checkout')) { 
					location = 'index.php?route=checkout/cart'; 
				} else { 
					$('#cart > ul').load('index.php?route=common/cart/info ul li'); 
				} 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	} 
} 
 
var voucher = { 
	'add': function() { 
 
	}, 
	'remove': function(key) { 
		$.ajax({ 
			url: 'index.php?route=checkout/cart/remove', 
			type: 'post', 
			data: 'key=' + key, 
			dataType: 'json', 
			beforeSend: function() { 
				$('#cart > button').button('loading'); 
			}, 
			complete: function() { 
				$('#cart > button').button('reset'); 
			}, 
			success: function(json) { 
				// Need to set timeout otherwise it wont update the total 
				setTimeout(function () { 
					$('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>'); 
				}, 100); 
 
				if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') { 
					location = 'index.php?route=checkout/cart'; 
				} else { 
					$('#cart > ul').load('index.php?route=common/cart/info ul li'); 
				} 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	} 
} 
 
var wishlist = { 
	'add': function(product_id) { 
		$.ajax({ 
			url: 'index.php?route=account/wishlist/add', 
			type: 'post', 
			data: 'product_id=' + product_id, 
			dataType: 'json', 
			success: function(json) { 
				$('.alert').remove(); 
 
				if (json['redirect']) { 
					location = json['redirect']; 
				} 
 
				if (json['success']) { 
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>'); 
				} 
 
				$('#wishlist-total span').html(json['total']); 
				$('#wishlist-total').attr('title', json['total']); 
 
				$('html, body').animate({ scrollTop: 0 }, 'slow'); 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	}, 
	'remove': function() { 
 
	} 
} 
 
var compare = { 
	'add': function(product_id) { 
		$.ajax({ 
			url: 'index.php?route=product/compare/add', 
			type: 'post', 
			data: 'product_id=' + product_id, 
			dataType: 'json', 
			success: function(json) { 
				$('.alert').remove(); 
 
				if (json['success']) { 
					$('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>'); 
 
					$('#compare-total').html(json['total']); 
 
					$('html, body').animate({ scrollTop: 0 }, 'slow'); 
				} 
			}, 
			error: function(xhr, ajaxOptions, thrownError) { 
				alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 
			} 
		}); 
	}, 
	'remove': function() { 
 
	} 
} 
 
/* Agree to Terms */ 
$(document).delegate('.agree', 'click', function(e) { 
	e.preventDefault(); 
 
	$('#modal-agree').remove(); 
 
	var element = this; 
 
	$.ajax({ 
		url: $(element).attr('href'), 
		type: 'get', 
		dataType: 'html', 
		success: function(data) { 
			html  = '<div id="modal-agree" class="modal">'; 
			html += '  <div class="modal-dialog">'; 
			html += '    <div class="modal-content">'; 
			html += '      <div class="modal-header">'; 
			html += '        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>'; 
			html += '        <h4 class="modal-title">' + $(element).text() + '</h4>'; 
			html += '      </div>'; 
			html += '      <div class="modal-body">' + data + '</div>'; 
			html += '    </div'; 
			html += '  </div>'; 
			html += '</div>'; 
 
			$('body').append(html); 
 
			$('#modal-agree').modal('show'); 
		} 
	}); 
}); 
 
// Autocomplete */ 
(function($) { 
	$.fn.autocomplete = function(option) { 
		return this.each(function() { 
			this.timer = null; 
			this.items = new Array(); 
 
			$.extend(this, option); 
 
			$(this).attr('autocomplete', 'off'); 
 
			// Focus 
			$(this).on('focus', function() { 
				this.request(); 
			}); 
 
			// Blur 
			$(this).on('blur', function() { 
				setTimeout(function(object) { 
					object.hide(); 
				}, 200, this); 
			}); 
 
			// Keydown 
			$(this).on('keydown', function(event) { 
				switch(event.keyCode) { 
					case 27: // escape 
						this.hide(); 
						break; 
					default: 
						this.request(); 
						break; 
				} 
			}); 
 
			// Click 
			this.click = function(event) { 
				event.preventDefault(); 
 
				value = $(event.target).parent().attr('data-value'); 
 
				if (value && this.items[value]) { 
					this.select(this.items[value]); 
				} 
			} 
 
			// Show 
			this.show = function() { 
				var pos = $(this).position(); 
 
				$(this).siblings('ul.dropdown-menu').css({ 
					top: pos.top + $(this).outerHeight(), 
					left: pos.left 
				}); 
 
				$(this).siblings('ul.dropdown-menu').show(); 
			} 
 
			// Hide 
			this.hide = function() { 
				$(this).siblings('ul.dropdown-menu').hide(); 
			} 
 
			// Request 
			this.request = function() { 
				clearTimeout(this.timer); 
 
				this.timer = setTimeout(function(object) { 
					object.source($(object).val(), $.proxy(object.response, object)); 
				}, 200, this); 
			} 
 
			// Response 
			this.response = function(json) { 
				html = ''; 
 
				if (json.length) { 
					for (i = 0; i < json.length; i++) { 
						this.items[json[i]['value']] = json[i]; 
					} 
 
					for (i = 0; i < json.length; i++) { 
						if (!json[i]['category']) { 
							html += '<li data-value="' + json[i]['value'] + '"><a href="#">' + json[i]['label'] + '</a></li>'; 
						} 
					} 
 
					// Get all the ones with a categories 
					var category = new Array(); 
 
					for (i = 0; i < json.length; i++) { 
						if (json[i]['category']) { 
							if (!category[json[i]['category']]) { 
								category[json[i]['category']] = new Array(); 
								category[json[i]['category']]['name'] = json[i]['category']; 
								category[json[i]['category']]['item'] = new Array(); 
							} 
 
							category[json[i]['category']]['item'].push(json[i]); 
						} 
					} 
 
					for (i in category) { 
						html += '<li class="dropdown-header">' + category[i]['name'] + '</li>'; 
 
						for (j = 0; j < category[i]['item'].length; j++) { 
							html += '<li data-value="' + category[i]['item'][j]['value'] + '"><a href="#">&nbsp;&nbsp;&nbsp;' + category[i]['item'][j]['label'] + '</a></li>'; 
						} 
					} 
				} 
 
				if (html) { 
					this.show(); 
				} else { 
					this.hide(); 
				} 
 
				$(this).siblings('ul.dropdown-menu').html(html); 
			} 
 
			$(this).after('<ul class="dropdown-menu"></ul>'); 
			$(this).siblings('ul.dropdown-menu').delegate('a', 'click', $.proxy(this.click, this)); 
 
		}); 
	} 
})(window.jQuery);

Answer 1

Uncaught TypeError: $(...).tooltip is not a function

Судя по разметке модального окна, генерируемой в JavaScript, вы используете Bootstrap. Проверьте правильно ли вы подключили JS зависимости, которые включают в себя три файла:

  • jQuery
  • Popper.js
  • JavaScript плагины самого Bottstrap.

Для компонента Tooltips (всплывающие подсказки) наличие этих библиотек обязательно.

Answer 2

Для работы этих подсказок вам нужно подключить jQuery UI.

Документация на сами подсказки.

READ ALSO
Возврат на предыдущую страницу

Возврат на предыдущую страницу

Задача стоит следующая

102
Как попадают значения в $scope.$$childHead.input в angular 1?

Как попадают значения в $scope.$$childHead.input в angular 1?

Необходимо взять значение из angularcopy($scope

86
Изменить в owl carousel кнопки prev и next на треугольные стрелки

Изменить в owl carousel кнопки prev и next на треугольные стрелки

По умолчанию отображаются надписи кнопок

220