[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Не могу победить Unexpected identifier
Игорь_Vasinsky
Вообщем есть JS файл подключаемый к страничке

Весь код в файле заключен между

$(function () {
//strings of code
});


Появилась необходимость адаптации его под клиента. Решил вставить чистым JS

в коде есть цикл в цикле формируются картинки (маленькие)

мне необходимо сделать "всплывашки" к этим картинкам, т.е. на hover повесить event, а если точнее то на onmouseover() повесить, на onmouseout() снять.

внутри цикла есть формируется строка

return '...some html...   onmouseover = "show(this, el)" onmouseover = "close(el)"    ....some html....';


show() и close() мои функции
el - получаю в цикле

с точки зрения конкатенации пробывал

return '...some html...   onmouseover = "show(this, '+el+')" onmouseover = "close('+el+')"    ....some html....';


в итоге

Получаю сообщение об неизвестных моих функциях

пробую так

return '...some html...   onmouseover = " '+show(this,el)+'" onmouseover = "'+close(el)+'"    ....some html....';


Получаю Unexpected identifier - указывает на конец документа

даже eval прикручивал - тоже Unexpected identifier - указывает на конец документа

return '...some html...   onmouseover = "'+eval(+'show(this, el)'+)+'" onmouseover = "'+eval(+'close(el)'+)+'"    ....some html....';



в данном случае цикл проходит всего один раз

чё за полтергейст?


!!!!!!!
Оригинал

return '<a rel="' + el + '" href="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" rel="'+el+'" onclick="return false"><img width="30px" src="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" title="'+el+'" onmouseover="'+ show(this, el)+'" onmouseout="'+closeBox(el)+ '"/></a>';





Спустя 45 минут, 36 секунд (13.09.2012 - 13:46) Игорь_Vasinsky написал(а):
ап

Спустя 13 минут, 29 секунд (13.09.2012 - 13:59) Oyeme написал(а):
Весь код выложите сюда.

Замените вот это на events.

onmouseover = "show(this, el)" onmouseover = "close(el)"


Ошибка показывает Вам что у Вас что-то не закрыто . Возможно из-за "
}
"

Спустя 7 минут, 32 секунды (13.09.2012 - 14:07) Игорь_Vasinsky написал(а):
ну листинг то тут приличный


Свернутый текст
$(function () {
PropSizes = {};
checkedSize = '';
checkedColor = '';
originPriceCode = $('#basePrice')['html']();
$('#propData')['find']('.propRow')['each'](function () {
propColorName = $(this)['find']('.propColor')['text']();
propSizeName = $(this)['find']('.propSize')['text']();
propColorPicture = $(this)['find']('.propColorPicture img')['attr']('src');
propSizePicture = $(this)['find']('.propSizePicture img')['attr']('src');
propPrice = $(this)['find']('.propPrice')['html']();
if (!PropSizes[propSizeName]) {
PropSizes[propSizeName] = {};
};
PropSizes[propSizeName]['image_url'] = propSizePicture;
if (!PropSizes[propSizeName]['colors']) {
PropSizes[propSizeName]['colors'] = {};
};
PropSizes[propSizeName]['colors'][propColorName] = {};
PropSizes[propSizeName]['colors'][propColorName]['image_url'] = propColorPicture;
PropSizes[propSizeName]['colors'][propColorName]['buy_code'] = propPrice;
});
for (el in PropSizes) {
$('#cstPropData .cstPropSizes')['append'](function () {
return '<a href="javascript:;" rel="' + el + '"><img src="' + PropSizes[el]['image_url'] + '" alt=""></a>';
});
};

$(".cstPropColors").css('overflow','visible');


$('#cstPropData .cstPropSizes a')['click'](function () {
$("#selectcolor").css("display", "block");
$(this)['siblings']()['removeClass']('checked');
$(this)['addClass']('checked');
$('#cstPropData .cstPropColors')['html']('');
$('#basePrice')['html'](originPriceCode);
checkedSize = $(this)['attr']('rel');

for (el in PropSizes[checkedSize]['colors']) {
$('#cstPropData .cstPropColors')['append'](function () {

var FilePath = '';
var part = /%2F/g;
var FilePath = (propColorPicture.replace(new RegExp(part), '/')).match('generated(.*)_80x80.jpg&src');

var nameImage = PropSizes[checkedSize]['colors'][el]['image_url'];

return '<a rel="' + el + '" href="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" rel="'+el+'" onclick="return false"><img width="30px" src="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" title="'+el+'" onmouseover="'+ show(this, el)+'" onmouseout="'+closeBox(el)+ '"/></a>';

});


};
$('#cstPropData .cstPropColors a')['click'](function () {
$(this)['siblings']()['removeClass']('checked');
$(this)['addClass']('checked');
checkedColor = $(this)['attr']('rel');
$('#basePrice')['html'](function () {
return PropSizes[checkedSize]['colors'][checkedColor]['buy_code'];
});
});
});

function closeBox(id){
var box = document.getElementById(id);

//box = box[0];

var body = document.getElementsByTagName('body');

//alert(box);
body[0].removeChild(box);

}

function show(img, name){
var x = findPosX(img);
var y = findPosY(img);

var box = document.createElement('div');
box.name = name;
box.id = name;
box.style.width = '100px';
box.style.height = '100px';
box.style.position = 'absolute';
box.style.backgroundImage = 'url(\''+ img.src +'\')';
box.style.left = event.clientX + 'px';
box.style.top = event.clientY - 100 + 'px';

var titlebox = document.createElement('div');
titlebox.style.backgroundColor = '#DFDFDF';
titlebox.style.fontFamily = 'arial';
titlebox.style.fontSize = '11px';
titlebox.style.textAlign = 'center';
titlebox.innerHTML = name;
box.appendChild(titlebox);


var body = document.getElementsByTagName('body');
return body[0].appendChild(box);
}



function findPosX(obj) {
var curleft = 0;
if (obj.offsetParent) {
while (1) {
curleft+=obj.offsetLeft;
if (!obj.offsetParent) {
break;
}
obj=obj.offsetParent;
}
}
else if (obj.x) {
curleft+=obj.x;
}
return curleft;
}

function findPosY(obj) {
var curtop = 0;
if (obj.offsetParent) {
while (1) {
curtop+=obj.offsetTop;
if (!obj.offsetParent) {
break;
}
obj=obj.offsetParent;
}
}
else if (obj.y) {
curtop+=obj.y;
}
return curtop;
}

}
);


про events не понял

Спустя 3 минуты, 42 секунды (13.09.2012 - 14:11) Игорь_Vasinsky написал(а):
да нет.. все парные }

Спустя 15 минут, 6 секунд (13.09.2012 - 14:26) Oyeme написал(а):
Никакая это не мистика.

Прочтите http://api.jquery.com/append/

.append( content [, content] )


Ваш код не удобно читать,так как Вы используете другую нотацию.Она совсем для другого применяется.Для примера возьмите любой плугин для jquery.

Удобней и быстрее работает с "нотация с точкой . "

Roundup:

Цитата



  • Dot notation is faster to write and clearer to read.


  • Square bracket notation allows access to properties containing special characters and selection of properties us
ing variablesВы два раза обьявили одну и теже переменную FilePath

   var FilePath = '';
var part = /%2F/g;
var FilePath = (propColorPicture.replace(new RegExp(part), '/')).match('generated(.*)_80x80.jpg&src');

Спустя 6 минут, 48 секунд (13.09.2012 - 14:33) Игорь_Vasinsky написал(а):
да мой тут тока js.

append точно так же ошибку вызывает

Спустя 4 минуты, 21 секунда (13.09.2012 - 14:37) Oyeme написал(а):
PropSizes[checkedSize]['colors'] пробежитесь по массиву.
Тут Я Вам советую использовать $.each,вместо цикла.

соберите все строчки вместе одним append(string),чем каждый раз append делать.Так намного быстрее.

Спустя 1 минута, 43 секунды (13.09.2012 - 14:39) Игорь_Vasinsky написал(а):
блин, да это всё работает) и работало

мне до не нужно оптимизировать код какого то человека.

я вношу корректировки, а именно мои функции + добавил эвентов для картинки

Спустя 3 минуты, 11 секунд (13.09.2012 - 14:42) Игорь_Vasinsky написал(а):
есть от 1-до 10 кнопок картинок - уровнем выше, при кли ке по кажодой дописывается новое кол-во доп картинок, так что всё тут в тему.

Спустя 3 минуты, 30 секунд (13.09.2012 - 14:45) Игорь_Vasinsky написал(а):
косячина где то тут

        for (el in PropSizes[checkedSize]['colors']) {
$('#cstPropData .cstPropColors')['append'](function () {

//var FilePath = '';
var part = /%2F/g;
var FilePath = (propColorPicture.replace(new RegExp(part), '/')).match('generated(.*)_80x80.jpg&src');

var nameImage = PropSizes[checkedSize]['colors'][el]['image_url'];

var string = '<a rel="' + el + '" href="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" rel="'+el+'" onclick="return false">'
+'<img width="30px" src="/_mod_files/ce_images/eshop/generated'+ FilePath[1]
+
'_80x80_pc.jpg" title="'+el+'" onmouseover="'+ show(this, el)+'" onmouseout="'+closeBox(el)+ '"/></a>';

$('div.cstPropColors').append(string);

});

Спустя 1 минута, 21 секунда (13.09.2012 - 14:47) Игорь_Vasinsky написал(а):
спутали меня, тут и так через append всё сделано

$('#cstPropData .cstPropColors')['append'](function () 

Спустя 1 минута, 29 секунд (13.09.2012 - 14:48) Игорь_Vasinsky написал(а):
я даже скажу точнее, без этих строк ошибка не вылазить

 onmouseover="'+ show(this, el)+'" onmouseout="'+closeBox(el)+ '"


я именно по этому в первом посту всё расписал.

Спустя 8 минут, 50 секунд (13.09.2012 - 14:57) Dezigo написал(а):
Уберите ' + .. + '

onmouseover="show(this, el)"
onmouseout="closeBox(el)"

Спустя 8 минут, 58 секунд (13.09.2012 - 15:06) Игорь_Vasinsky написал(а):
я успел сам сообразить))

обозначилась новая беда))) el - для всех нарисованных элементов одинаков - по последнему из цикла

    $('#cstPropData .cstPropSizes a')['click'](function () {
$("#selectcolor").css("display", "block");
$(this)['siblings']()['removeClass']('checked');
$(this)['addClass']('checked');
$('#cstPropData .cstPropColors')['html']('');
$('#basePrice')['html'](originPriceCode);
checkedSize = $(this)['attr']('rel');

for (el in PropSizes[checkedSize]['colors']) {
$('#cstPropData .cstPropColors')['append'](function () {

//var FilePath = '';
var part = /%2F/g;
var FilePath = (propColorPicture.replace(new RegExp(part), '/')).match('generated(.*)_80x80.jpg&src');

var nameImage = PropSizes[checkedSize]['colors'][el]['image_url'];

var string = '<a rel="' + el + '" href="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" rel="'+el+'" onclick="return false">'
+'<img width="30px" src="/_mod_files/ce_images/eshop/generated'+ FilePath[1]
+
'_80x80_pc.jpg" title="' + el + '" onmouseover="show(this, el)" onmouseout="closeBox(el)"/></a>';

return string;

});



};
$('#cstPropData .cstPropColors a')['click'](function () {
$(this)['siblings']()['removeClass']('checked');
$(this)['addClass']('checked');
checkedColor = $(this)['attr']('rel');
$('#basePrice')['html'](function () {
return PropSizes[checkedSize]['colors'][checkedColor]['buy_code'];
});
});
});

Спустя 5 часов, 55 минут, 52 секунды (13.09.2012 - 21:02) bodja написал(а):
Цитата
обозначилась новая беда))) el - для всех нарисованных элементов одинаков - по последнему из цикла

Значит так ,у вас это работать и не будет. :D
Все это связано с особенностью работы JS.
Дело в том ,что весь код при перегрузке метода включая и this переносится в метод без изменений.Значит ,что мы имеем?

onmouseover="show(this, el)"

this- отлично,нам повезло,ссылаемся на свой же елемент
el- а вот тут фигушки, метод onmouseover элемента незнает откуда взять его значение ,так как в этом обьекте его нет,и начинает шуршать по всему коду ,пока не найдет глобальной el или на верхних уровнях функций ,а там лежит только последнее значение el :D

Короче попробуйте сделать так.

onmouseover="function(this,el){return function(){show(this, el)}}(this,el)"

только выйдите из строки при назначении.

Или получай ссылку на елемент a и потом вот таким боком в коде.

a.onmouseover=function(a,el){
return function(){
show(a, el);
}
}
(a,el)


Ну и говорим спасибо киллеру ,который мне подсказал про замыкания, так подобный костыль применяется только в JS :D

Спустя 26 минут, 5 секунд (13.09.2012 - 21:28) Игорь_Vasinsky написал(а):
Цитата
this- отлично,нам повезло,ссылаемся на свой же елемент

да ну)
разве это не ссылка на елемент DOM, а именно тот в теге которого это обращение? тем более что каждый элемент с разными значениями атрибутов.


Цитата
el- а вот тут фигушки, метод onmouseover элемента незнает откуда взять его значение

)) ну как это, для функции - это всего лишь строковое значение аргумента, которое как раз с каждой иттерацией разное


Я не успел раскурить этот момент, но мне кажется у меня переписывается значения на последнее в цикле, т.к. я не правильно делаю append


Ну это

Цитата
Короче попробуйте сделать так.

onmouseover="function(this,el){return function(){show(this, el)}}(this,el)"

только выйдите из строки при назначении.

Или получай ссылку на елемент a и потом вот таким боком в коде.

a.onmouseover=function(a,el){
  return function(){
    show(a, el);
  }
}(a,el)


Ну и говорим спасибо киллеру ,который мне подсказал про замыкания, так подобный костыль применяется только в JS biggrin.gif


если я не найду причину.

Спустя 19 минут, 58 секунд (13.09.2012 - 21:48) bodja написал(а):
Цитата
да ну)
разве это не ссылка на елемент DOM, а именно тот в теге которого это обращение? тем более что каждый элемент с разными значениями атрибутов.

Совершенно верно.
this в JS всегда ссылается на текущий обьект и когда мы переносим ссылку текущего обьекта(точнее когда мы думаем что мы переносим ссылку текущего обьекта)
в метод другого обьекта ,с этого момента мы начинаем чесать репу. biggrin.gif

Цитата
)) ну как это, для функции - это всего лишь строковое значение аргумента, которое как раз с каждой иттерацией разное


сделай один финт ,после того как используеш el в конце кода нажначь ему какой нибудь бред,
результат тебя приятно удивит.
Дело в том ,что ты как раз и не передаеш значение аргумента ,а его имя.И после того требуется выполнение кода по событию уже потом ищется его значение по имени ,и естественно оно находит его последнее значение.

Спустя 3 дня, 13 часов, 36 минут, 1 секунда (17.09.2012 - 11:24) Игорь_Vasinsky написал(а):
"Замыкание" - лечиться путём правильного синтаксиса при подстановки переменной)

Вуаля)
return  '<a rel="' + el + '" href="/_mod_files/ce_images/eshop/generated'+ FilePath[1] + '_80x80_pc.jpg" rel="'+el+'" onclick="return false"><img width="30px" src="'+PropSizes[checkedSize]['colors'][el]['image_url']+'" onmouseover="show(this, \''+ el +'\')" onmouseout="closeBox(\''+ el +'\')"/></a>';

Спустя 22 минуты, 9 секунд (17.09.2012 - 11:46) bodja написал(а):
Цитата
"Замыкание" - лечиться путём правильного синтаксиса при подстановки переменной)

И это даже работает во всех браузерах? wink.gif biggrin.gif

Спустя 29 минут, 52 секунды (17.09.2012 - 12:16) Игорь_Vasinsky написал(а):
наверн) laugh.gif


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.