Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка свойства 'length' (https://javascript.ru/forum/misc/39949-oshibka-svojjstva-%27length%27.html)

iskander83 18.07.2013 10:08

Ошибка свойства 'length'
 
Всем привет. Есть такой скрипт отвечающий за работу форм на сайте..

jQuery.fn.center = function () {
    this.css("position","absolute");
    this.css("top", Math.max(0, (($(window).height() - $(this).outerHeight()) / 2) + 
                                                $(window).scrollTop()) + "px");
    this.css("left", Math.max(0, (($(window).width() - $(this).outerWidth()) / 4) + 
                                                $(window).scrollLeft()) + "px");
    return this;
}
var close_dialog = function() {
	$('#thanks').hide();
	$('#overlay').remove();
    $('#overlay').hide();
	$('#name').val('');
	$('#phone').val('');
	$('.form_backcall').hide();
	$('.form_akcia').hide();
	
}



$(document).ready(function() {

//---------------------------------------------------		
				
	$('form .send_audit').click(function() {
		var parent = $(this).parent('form');
		var errors = false;
		_name = $(parent).find('#name');
		_phone = $(parent).find('#phone');
		_form = $(parent).find('#hidestring')
		_email = $(parent).find('#email')
		_ahref = $(parent).find('#ahref')
		
		name = $(_name).val();
		phone = $(_phone).val();
		email = $(_email).val();
		ahref = $(_ahref).val();	
		form = $(_form).text();
	
			if (phone.length == 0)
		{
		alert('Заполните, пожалуйста поля');
			errors = true;
		}
		else if (name.length == 0)
		{
			alert('Заполните, пожалуйста пол');
			errors = true;
		}
		else if (ahref.length == 0)
		{
			alert('Заполните, пожалуйста поле "Ссылка на сайт"');
			errors = true;
		}
		else if (phone.length < 7)
		{
		errors = true;
		alert('Проверьте, пожалуйста, корректность заполнения формы. Введите Ваш номер телефона в виде +7-888-777-55-33');	
		}
		
		
		else if (phone.length > 16)
		{
		errors = true;
		alert('Проверьте, пожалуйста, корректность заполнения формы. Введите Ваш номер телефона в виде +7-888-777-55-33');	
		}
		
		digits="0123456789+-() "
		for(i=0; i<1; i++)
if (digits.indexOf(phone.charAt(i))<0)
{alert("Это должны быть цифры")
document.dataentry.phone.focus()
break
}

		if (!errors)
		{
			$(_name).val('');
			$(_phone).val('');
			$(_email).val('');
			$(_ahref).val('');

			
				
			$.post("sendmessage_audit.php",
			{ ajax: 'yes', form: form, name: name, phone: phone, email: email, ahref: ahref },//, content: content, model: model },
			function(returned) {
				if (returned == 'true') {
					
					$('#thanks').center();
					$('#thanks').show();
					
					$('.close_btn').bind('click', function() { close_dialog(); });
					$('#overlay').bind('click', function() { close_dialog(); });
				} else {
					alert('An error has occured');
				}
			});
		}
	});


//-------------------------------------------		

	
	$('.buttn').bind('click', function() { show_order_form(''); });
	$('.buttn_a').bind('click', function() { show_akcia_form(''); });
	$('.close').bind('click', function() { close_dialog(''); });
	$('#overlay').bind('click', function() { close_dialog(); });
	
	$('.close2').bind('click', function() { close_dialog2(''); });


		
		//---------------------------------------------------		
				
	$('form .send').click(function() {
		var parent = $(this).parent('form');
		var errors = false;
		_name = $(parent).find('#name');
		_phone = $(parent).find('#phone');
		_form = $(parent).find('#hidestring')
		
		name = $(_name).val();
		phone = $(_phone).val();
		form = $(_form).text();
	
			if (phone.length == 0)
		{
			alert('Заполните, пожалуйста поля');
			errors = true;
		}
		else if (phone.length < 7)
		{
		errors = true;
		alert('Проверьте, пожалуйста, корректность заполнения формы. Введите Ваш номер телефона в виде +7-888-777-55-33');	
		}
		
		
		else if (phone.length > 16)
		{
		errors = true;
		alert('Проверьте, пожалуйста, корректность заполнения формы. Введите Ваш номер телефона в виде +7-888-777-55-33');	
		}
		
		digits="0123456789+-() "
		for(i=0; i<1; i++)
if (digits.indexOf(phone.charAt(i))<0)
{alert("Это должны быть цифры")
document.dataentry.phone.focus()
break
}

		if (!errors)
		{
			$(_name).val('');
			$(_phone).val('');

			
			$('#forma').hide();
			
			$.post("sendmessage.php",
			{ ajax: 'yes', form: form, name: name, phone: phone },//, content: content, model: model },
			function(returned) {
				if (returned == 'true') {
					
					$('#thanks').center();
					$('#thanks').show();
					
					$('.close_btn').bind('click', function() { close_dialog(); });
					$('#overlay').bind('click', function() { close_dialog(); });
				} else {
					alert('An error has occured');
				}
			});
		}
	});
});


var show_order_form = function(text){
	var overlay = $('<div>').attr('id', 'overlay');
	overlay.appendTo(document.body);
	$('.form_backcall').center();
	$('.form_backcall').show();
	
	$('.close_btn').bind('click', function() { close_dialog(); });
	$('#overlay').bind('click', function() { close_dialog(); });
}


var show_akcia_form = function(text){
	var overlay = $('<div>').attr('id', 'overlay');
	overlay.appendTo(document.body);
	$('.form_akcia').center();
	$('.form_akcia').show();
	
	$('.close_btn').bind('click', function() { close_dialog(); });
	$('#overlay').bind('click', function() { close_dialog(); });
}

var show_thanks = function(text){
	var overlay = $('<div>').attr('id', 'overlay');
	overlay.appendTo(document.body);
	$('#thanks').center();
	$('#thanks').show();
	
	$('.close_btn').bind('click', function() { close_dialog(); });
	$('#overlay').bind('click', function() { close_dialog(); });
}


так вот все формы работают коректно кроме одной $('.send_audit').click(function() ....
когда кликаю на кнопку отправки должен по идеи выдавать ошибку (что и происходит в других формах, за которые отвечает нижняя функция $('form .send').click(function() ...), но ничего не происходит, а отладчик рисует ошибку:
Uncaught TypeError: Cannot read property 'length' of undefined [VM] js.js (943):41
я не пойму в чем дело, хотя сотни раз использовал этот скрипт - все было нормально. Подскажите в чем причина...

вот код проблемной формы
<form>	
 <p>ЗАПИШИТЕСЬ НА БЕСПЛАТНЫЙ АУДИТ!	</p>
<div id="hidestring">"БЕСПЛАТНЫЙ АУДИТ!"</div>		

<div style=" margin:auto; width:220px">
 				<input type="text" name="name" id="name" placeholder="Имя * "  />
 

				<input type="text" name="email" id="email" placeholder="E-mail "/>  
                
                	<input type="text" name="phone" id="phone" placeholder="Телефон * " />
 

				<input type="text" name="ahref" id="ahref" placeholder="Ссылка на сайт * "/>   


 <img src="images/send_btn.png" style=" margin:10px 0 0 0; cursor:pointer;" alt="Отправить" title="Отправить" class="send_audit" />
 </div>
</form>

skrudjmakdak 18.07.2013 10:13

скорей всего объекта нет. выведите в консоль этот объект, скорей всего выведится undefined

iskander83 18.07.2013 10:22

еще вот
Uncaught TypeError: Cannot read property 'length' of undefined js.js:41
(anonymous function)
только не пойму почему и что исправить?

skrudjmakdak 18.07.2013 12:17

if (phone.length == 0)
здесь ошибка?

пропишите так:
....
var errors = false;
_name = $(parent).find('#name');
_phone = $(parent).find('#phone');
_form = $(parent).find('#hidestring');
_email = $(parent).find('#email');
_ahref = $(parent).find('#ahref');
console.log($(_phone)[0]);
...


и посмотрите, что упало в консоль. если undefined, то объект не нашелся

iskander83 18.07.2013 12:53

skrudjmakdak,
ну да индефинит только я не пойму почему и что делать дальше?
Uncaught TypeError: Cannot read property 'length' of undefined js.js:46
undefined js.js:36
Uncaught TypeError: Cannot read property 'length' of undefined js.js:46
(anonymous function) js.js:46
p.event.dispatch jquery.min.js:2
g.handle.h

skrudjmakdak 18.07.2013 13:04

iskander83, только без паники)) найдем что делать дальше..

вот сейчас объясню почему так. у вас есть эта строчка:
_phone = $(parent).find('#phone');
и то что вы хотите найти, jquery не находит. причины могут быть разные.

теперь давайте еще расставим консоле.лог, чтобы узнать с какого места начинаются чудеса

сделайте это:
$('form .send_audit').click(function() {
        console.log($(this)[0]);
        var parent = $(this).parent('form');
        console.log($(parent)[0]);
        var errors = false;
        _name = $(parent).find('#name');
        _phone = $(parent).find('#phone');
        console.log($(_phone)[0]);
        _form = $(parent).find('#hidestring')
        _email = $(parent).find('#email')
        _ahref = $(parent).find('#ahref')


посмотрите в консоль и какие 3 ответа высветила консоль?

iskander83 18.07.2013 13:15

<img src="images/send_btn.png" style=" margin:10px 0 0 0; cursor:pointer;" alt="Отправить" title="Отправить" class="send_audit" /> js.js:28
undefined js.js:30
undefined js.js:34
Uncaught TypeError: Cannot read property 'length' of undefined js.js:48
(anonymous function) js.js:48
p.event.dispatch jquery.min.js:2
p.event.add.g.handle.h

skrudjmakdak 18.07.2013 13:37

ну вот. не нашел form

var parent = $(this).parent('form');
попробуйте прописать так:
var parent = $(this).parent();

iskander83 18.07.2013 14:11

все работает спасибо


Часовой пояс GMT +3, время: 08:03.