css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
20 Май
Эта статья написана «по мотивам» одной из глав книги «jQuery – подробное руководство по продвинутому JavaScript». Информация, содержащаяся в этой главе, показалась мне настолько полезной, что я не мог не поделиться ей. Здесь не освещаются все концепции языка – внимание уделено лишь тем, понимание которых поможет эффективнее овладеть библиотекой jQuery.
Итак, первое на чем мы остановим свое внимание – это определение и работа с функциями, с использованием подхода при котором они являются обычными объектами JavaScript. Но для того, чтобы к этому подойти, давайте сначала посмотрим, как создаются
var card = new Object();
Весьма просто, но совсем неинтересно, поскольку наш объект не содержит никакой информации. Давайте исправим это:
var card = new Object(); card.firstname = 'Ivan'; card.lastname = 'Ivanov'; card.year = '1974'; card.employed = new Date(2004,1,12);
Это уже что-то полезное – создав новый экземпляр объекта, мы присвоили его переменной card и наполнили свойствами различных типов: строка, число, и дата.
Что же получается? Получается, что объект JavaScript – это набор свойств, каждое из которых состоит из имени и значения. При этом в качестве имени может выступать только строка, а вот значением (и это важный момент!!!) может быть и строка, и число, и массив, и конечно функция…
Вывод: основная цель экземпляра объекта – служить контейнером для именованных наборов других объектов.
Давайте немного усложним наш код, который мы используем в качестве примера:
var card = new Object(); card.firstname = 'Ivan'; card.lastname = 'Ivanov'; card.year = '1974'; card.employed = new Date(2004,1,12); var phone = new Object(); phone.home = '(495)353-5353'; phone.mobile = '(903)261-1777'; card.phone = phone;
мы создали еще один объект, который содержит номера телефонов и сделали этот объект значением свойства нашего первого объекта.
А теперь попробуем записать все тоже самое в литеральной нотации, плавно двигаясь к тому синтаксису, который присутствует в jQuery-коде практически повсеместно.
var card = {
firstname : 'Ivan',
lastname : 'Ivanov',
year : '1974',
employed : new Date(2004,1,12),
phone : {
home : '(495)353-5353',
mobile : '(903)261-1777'
}
};
Вот собственно такая форма записи и называется JSON – посмотрите, насколько проста и понятна структура:
- объект – пара фигурных скобок
- свойства перечислены внутри скобок, через запятую
- каждое свойство – это пара состоящая из имени и значения, разделенных двоеточием.
Давайте теперь отметим для себя еще один очень важный момент, воспользовавшись следующим простым примером:
var someVar = 'В лесу родилась елочка!';
Простейшая инструкция, в которой переменной присваивается экземпляр объекта String. Если мы попробуем выполнить:
alert(someVar);
увидим то, что и ожидали – сенсационное сообщение о том, что в лесу родилась елочка. Как Вы думаете, что мы увидим после выполнения следующего кода?
alert(window.someVar);
Можете попробовать, но сразу скажу, что в результате получится абсолютно тоже самое сообщение! Поскольку инструкции эквивалентны, то какой же вывод из этого можно сделать?
Правильно! Когда ключевое слово var используется за пределами какой-либо функции, на глобальном уровне, оно является всего лишь ссылкой на свойство объекта window.
Ну вот, с объектами мы более-менее разобрались. Но давайте кратко сформулируем то, о чем мы говорили. Итак:
- объект в JavaScript – это неупорядоченный набор свойств;
- свойство состоит из имени и значения;
- объекты можно объявлять с помощью литералов;
- глобальные переменные – есть свойства объекта window;
Вот теперь мы готовы к тому, чтобы вернуться к тому утверждению, что функции в JavaScript можно рассматривать как обычные объекты. Почему же в JavaScript функцию можно считать обычным объектом? Давайте возьмем для сравнения объекты других типов, например String или Number.
Если объекты String или Number определяются соответствующими конструкторами, то функции также определяются конструктором, в данном случае конструктором Function. Точно также, как и другие объекты функции могут:
- присваиваться переменным и свойствам объектов
- передаваться в виде параметров
- возвращаться как результат других функций
- создаваться с использованием литералов
Но есть на первый взгляд одно очень существенное отличие от тех же упомянутых объектов String или Number – у функции есть имя! Но это только на первый взгляд.
Посмотрим простенький пример:
function hello() {
alert('Hello, world!');
}
такая запись очень часто используется для создания глобальных функций, но это совершенно не означает, что мы только что создали функцию с именем hello. Вспомните наши примеры с ключевым словом var. Тут практически тоже самое, только в примере с функцией ключевое слово function автоматически создает экземпляр объекта и присваивает его свойству объекта window. А имя этого свойства совпадает с именем нашей функции. Т.е. мы могли бы написать так:
hello = function () {
alert('Hello, world!');
}
или даже так:
window.hello = function () {
alert('Hello, world!');
}
Это есть синтаксис литерала функции – привыкайте, в jQuery-коде Вы будете использовать такую форму записи очень часто. Но самый главный вывод, который мы должны сделать – экземпляры Function являются значениями!!!, которые можно присвоить переменным, свойствам или параметрам, через которые на них можно ссылаться.
Следующий шаг – попробуем передавать функцию в качестве параметра и тут же разберем одно из самых распространенных понятий – функция обратного вызова. Смотрим код:
function hello() {
alert('Hello, word!');
}
setTimeout(hello,5000);
Объявляем функцию с именем hello и устанавливаем таймер на 5 секунд. Смотрите, передача функции в качестве параметра ничем не отличается от передачи любого другого значения – в первом параметре мы передали функцию, а во втором – число. Когда время таймера истечет, будет вызвана функция hello. Поскольку метод setTimeout() делает вызов функции в нашем собственном программном коде – эту функцию называют функцией обратного вызова.
Однако есть более изящный способ записи этого кода:
setTimeout(function(){ alert('Hello, word!'); },5000);
если функцию не требуется вызывать где-то в другом месте страницы, нет никакой необходимости создавать свойство hello в объекте window. Такой подход будет очень часто встречаться в программном коде jQuery.
В объектно-ориентированных языках основанных на классах, указатель this, как правило, ссылается на экземпляр класса, в пределах которого был объявлен метод. Реализация this в JavaScript отличается едва различимым, но очень существенным образом. В JavaScript, где функции являются обычными объектами (мы говорили об этом выше), они не объявляются как часть чего-либо. Объект, на который ссылается this, называется контекстом функции и определяется не тем, как функция объявляется, а тем как она вызывается. Это значит, что функция может иметь различный контекст в зависимости от того, как она была вызвана.
Давайте вернемся к примеру и немного дополним его:
var card = {
firstname : 'Ivan',
lastname : 'Ivanov',
year : '1974',
employed : new Date(2004,1,12),
phone : {
home : '(495)353-5353',
mobile : '(903)261-1777'
},
showData : function() {
return this.lastname+'
'+this.firstname+'
'+this.phone.mobile;
}
};
К первоначальному коду мы добавили свойство с именем showData, которое ссылается на экземпляр Function. Если теперь вызвать функцию через свойство:
alert(card.showData());
то в качестве контекста функции будет установлен экземпляр объекта на который указывает card. В результате мы увидим следующее:
Ivanov Ivan (903)261-1777
Ну это все вполне естественно, гораздо более интересен следующий пример. JavaScript позволяет четко установить, что будет использоваться в качестве контекста функции. Вызывая функцию с помощью методов call() или apply() экземпляра Function, мы можем передать в качестве контекста все, что угодно.
var obj1 = { myProperty: 'object 1' };
var obj2 = { myProperty: 'object 2' };
var obj3 = { myProperty: 'object 3' };
window.myProperty = 'object window';
function showProperty() {
return this.myProperty;
}
obj1.identifyMe = showProperty;
alert(showProperty());
alert(obj1.identifyMe());
alert(showProperty.call(obj2));
alert(showProperty.apply(obj3));
Определили три простых объекта, у каждого из которых есть свойство myProperty. Добавили свойство myProperty в экземпляр объекта window. Определили глобальную функцию, которая возвращает значение свойства myProperty для любого объекта, используемого в качестве контекста этой функции. И еще присвоили эту же самую функцию свойству с именем identifyMe объекта obj1.
Дальше самое интересное – четыре раза мы вызываем один и тот же экземпляр функции другим способом и посмотрите, что получается:
- в первом случае вызываем функцию как глобальную и контекстом функции является экземпляр объекта window о чем свидетельствует текст в окне предупреждения – «object window«.
- во втором случае вызываем функцию как свойство объекта obj1 и контекстом функции становится этот объект. Текст в окне предупреждения – «object 1«.
- в третьем случае используем метод call() объекта Function и контекстом функции становится объект, переданный методу call() в качестве первого параметра. Текст в окне предупреждения – «object 2«.
- наконец в четвертом случае используем метод apply(), передавая ему в качестве первого аргумента obj3, и получаем текст в окне предупреждения – «object 3«.
Пример можно открыть в отдельном окне.
Вывод такой: функция fn действует как метод объекта ob, когда объект ob выступает в качестве контекста при вызове функции fn.
Замыкание (closure) – это экземпляр Function вместе с локальными переменными из его окружения, необходимыми для выполнения.
Функция при объявлении может ссылаться на любые переменные, находящиеся в области ее видимости на момент объявления. Эти переменные будут достижимы для функции даже после того, как текущее положение в объявлении выйдет из области видимости, замыкая объявление.
Лучше всего пояснить это на простом примере (здесь уже используем библиотеку jQuery):
$(function(){
var local = 1;
window.setInterval(function(){
$('#result').append(new Date()+
' значение local = '+local+' ');
local++;
},5000);
});
После загрузки DOM объявляем переменную local и присваиваем ей числовое значение 1. С помощью метода setInterval() взводим таймер, который будет срабатывать каждые 5 секунд. В качестве функции обратного вызова для таймера, определяем функцию, которая каждые пять секунд будет добавлять текущее время и значение переменной local. Кроме того, при каждом срабатывании таймера значение переменной local должно увеличиваться на единицу.
Пример можно открыть в отдельном окне.
Можно было подумать, что поскольку функция обратного вызова запустится только лишь спустя 5 секунд после готовности DOM, то во время выполнения функции переменная local окажется неопределенной, ведь код в котором определяется local выходит из области видимости, как только обработчик события готовности DOM заканчивает свою работу.
Тем не менее этот код прекрасно работает, благодаря замыканию, созданному при объявлении функции и включающему в себя переменную local. Замыкание остается в области видимости функции на протяжении всего жизненного цикла.
При работе с jQuery (особенно при использовании возможностей ajax) Вы будете довольно часто сталкиваться с замыканиями. Поэтому необходимо обратить внимание на еще одну важную особенность замыканий – контекст функции никогда не является частью замыкания. Опять же на примере будет гораздо понятнее.
Посмотрите такой код:
this.id = 'someID';
$('*').each(function(){
alert(this.id);
});
Мы могли бы ожидать, что в окне предупреждения для каждого элемента будет раз за разом отображаться значение someID, однако это совсем не так. Мы увидим окно предупреждений столько раз, сколько элементов будет отобрано в объект jQuery и каждый раз будет отображаться значение атрибута id следующего элемента (или пустое окно предупреждения, если такого атрибута нет). Это происходит потому, что у каждого вызова функции собственный контекст, и в данном случае контекстом является элемент из объекта jQuery.
Давайте немного исправим пример:
this.id = 'someID';
var someVar = this;
$('*').each(function(){
alert(someVar.id);
});
Переменная someVar становится частью замыкания и будет доступна внутри функции обратного вызова. Такой код будет раз за разом выдавать в окне предупреждения одно и тоже значение – someID.
Ну, вот вроде бы и все. Осталось сказать, что если твердо усвоить все эти понятия, то создавать эффектные и эффективные сценарии на JavaScript с использованием jQuery будет гораздо проще…
Отзывов (50) на «Некоторые концепции JavaScript, необходимые для эффективного применения jQuery.»
Конструкции:
function hello () {
alert(‘Hello, world!’);
}
…и
hello = function () {
alert(‘Hello, world!’);
}
Не являются эквивалентными.
Конструкция function hello объявляет функцию, которая доступна во всей лексической области видимости.
Например, мы можем вызывать функцию на строчке ДО ее объявления:
//Вызываем функцию выше ее объявления
hello ()
//Объявляем
function hello () {
alert(‘Hello, world!’);
}
Конструкция hello = function () присваивает функцию переменной, которая досутупна только после ее инициализации:
//Сначала надо присвоить
hello = function () {
alert(‘Hello, world!’);
}
//А уже потом — использовать
hello ()
Ну я даже не знаю что сказать (-:
Спасибо, на редкость с удовольствием прочитал и так понятно и доступно…
Только вот не понял разницу между call и apply…
Спасибо, познавательно!
To Алик Кириллович:
Это дискуссия или дополнение? Вроде я нигде не написал, что эти конструкции эквивалентны.
To none:
Методы call() и apply() очень похожи. сall() вызывает функцию, передавая в качестве первого параметра объект, который является контекстом функции, а в качестве остальных параметров передаются аргументы вызываемой функции. apply() – почти тоже самое, только в качестве второго параметра он ожидает массив объектов, которые становятся аргументами вызываемой функции.
Спасибо, очень полезно и интерестно.
Очень полезный сайт! Опубликованные статьи очень помогли разобраться и применять jQuery при програмировании WEB приложений в среде Lotus Domino/Notes. Кому интересно можно посмотреть заметку о применении jQuery.autocomplete.js на сайте http://www.notesnet.ru/library/docid/95913B Огромное спасибо!
Спасибо Вам за ваш труд!
Читал примерно об этом же в книге «jQuery. Подробное руководство по продвинутому JavaScript» в приложении, но не все так четко представлял. Сейчас более ясно представляется все ))
Да вполне познавательно, особенно для тех, кто только начинает сталкиваться с jquery, ajax и продвинутым javascript.
Спасибо, очень познавательно. Сейчас многие люди пытающиеся писать c помощью jQuery не знаю основ js, из-за этого и возникает большинство трудностей…
Еще хотел бы дополнить один вариант создания функции как объекта:
var hello = new Function(«alert(‘Hello, world!’);»);
Спасибо, у вас каждая статья на сайте очень полезная.
хорошая статья, спасибо, освежил в памяти эти важные моменты. я ее читал еще на английском год назад «appendix: JavaScript that you need to know but might not!» и был, конечно, рад, что мне открылись такие полезные истины.
Огромное спасибо, побольше бы так хорошо и доступно писали.
Здравствуйте!
Прошу помощи в решении такой проблемы.
Я пытаюсь загрузить во всплывающее окошко (не используя фреймы) HTML – код, который содержит javaScript (инициализация плагина). Весь код в окошко благополучно вставляется, а скрипт инициализации куда-то пропадает. Почему так происходит и как с этим бороться?
Спасибо.
Артур, не обижайтесь, но Вы напомнили мне Стругацких:
«… – Вот что, – сказал Эдик. – Так нельзя. Мы работаем, как дилетанты. Как авторы любительских писем: Дорогие ученые. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит …»
Я это к тому, что как я могу чем-то Вам помочь на основании Вашей информации. Я же не телепат…
Вот тут пример выложил.
http://kris.w-key.ru/example.php
Что значит нет? Он отрабатывает у Вас как и положено… Клик по кнопке – появляется, для него ставятся css-свойства и обработчик клика по которому он должен пропадать. Все так и происходит. В каком тогда смысле нет скрипта?
Во всплывающем блоке тегов скрипта и самого скрипта нет. То есть функция html() загружает в блок любые теги, кроме скрипта.
Так Вам это все в виде текста нужно? Ну так тогда не html() надо использовать, а text()
Спасибо большое. Помогло.
Извините еще раз за беспокойство, поспешил сказать что помогло. Функция text() работает как htmlspecialchars() в php. Скобки у тегов заменяет на сущности. Поэтому правильно html код скрипта все равно в блок не переносится. Прям не знаю как и быть.
Решил проблему таким способом: Перешел на обычный javaScript и все получилось.
document.getElementById(‘popup’).innerHTML = document.getElementById(‘content’).innerHTML;
То есть функция html() в jQuery работает не совсем так, как innerHTML в javaScript. Скрипты в блоки не переносит.
Спасибо! Лучший сайт по теме!
Спасибо за статю.
Напишыте пожалуйста ещё про ООП в javascript. По болше пмеров, если можно.
[quote]Замыкание (closure) – это экземпляр Function вместе с локальными переменными из его окружения, необходимыми для выполнения.[/quote]
Вместе со всем scope родителя, а не только с «необходимыми переменными».
Вопрос формулировки определения… На «что такое любовь?» можно дать сотни определений… И про замыкания не одна, и ко многим в чем-то можно придраться…
Признавайтесь, хотите придраться
Возможно
Но дело не в формулировке, а в том, что в JavaScript замыкается весь scope, поэтому если мы наплодили кучу временных объектов, которые функции-замыканию и не нужны, то они все равно будут жить, а если мы навесили наше замыкание обработчиком — жить будут долго и счастливо
Ну а кто же с этим спорить будет? Да, конечно. Только мне кажется, что воспринимать это как «абсолютное зло» тоже не совсем правильно. Тут скорее подойдет ярлык «использовать с осторожностью», согласны?
полезным дополнением к статье.
Давайте тогда будем считать инициированный Вами обмен мнениями
Согласен
Добрый день. Не могу разобраться. Делаю плагин для jQuery (это, кажется, есть замыкание). Упрощенно код выглядит так:
jQuery.fn.maxlength = function(options){
var options = jQuery.extend({
maxChars: 200,
…
}, options);
return this.each(function()
{
var obj = jQuery(this);
var remain = options.maxChars;
…
obj.live(‘keydown keypress keyup’, function(e)
{
…
Действия на основе значения options.maxChars
});
…
});
};
Применяется он так:
$(document).ready(function(){
$(«#id»).maxlength({maxChars : ‘60′});
});
Проблема. Нужно динамически переопределять значение опции maxChars. Вторичный вызов $(«#id»).maxlength({maxChars : ‘…’}); с нужными параметрами не приводит к цели. Происходит создание еще одной функции к объекту. И существует как бы два действия – со старым значением и с новым, причем первое доминирует. Как сделать возможность переопределения?
Что могу посоветовать? Попробуйте почитать это:
на docs.jquery.com
на learningjquery.com
во втором случае попробуйте в качестве примера посмотреть плагин jquery.cycle.js (он упоминается в статье), а именно как реализованы его методы stop и pause.
jQuery, конечно, полезная штука. Но многие новички принимают ее как основу JS и начинают погружаться в дебри.. разумеется ничего не понимают и бросают JS…
Ха. Скорее наоборот — они радостно лезут в него, крича — «ё-мое, все просто», а потом ноют на форумах, что «я тут поменял для себя, и НИЧЕГО НЕ РАБОТАЕТ», хотя все, что надо сделать, это прочитать ман по плагину/фреймворку и поменять пару настроек, если (а чаще всего когда) используется какой-то плагин. Но увы, думать никто не хочет. И это проблема не jQuery.
Я с zantor согласен – именно думать не хотят. Как пример, нужно сделать какое-нибудь всплывающее по событию окошко – все, виджет Dialog…. А почему не попробовать написать всего-то пару-тройку строк кода? Потому, что надо читать, вникать, думать пробовать…. А здесь вроде все ясно – подключил виджет и вот тебе окно…
В общем и Алексей, мне кажется, тоже в правильно подметил. Сужу по вопросам, на которые отвечать приходится. Есть такие для которых понятия JavaScript и jQuery тождественны…
Пытаюсь применить функцию setTimeout для того, чтобы вначале «уехала » панель, а затем появилась кнопка. Почему все получается одновременно?
$(«#test»).toggle(«slide», { direction: «down» }, 1000);
setTimeout(document.getElementById(«tvset»).style.zIndex=»80″, 5000);
$(”#test”).toggle(”slide”, { direction: “down” }, 1000);
setTimeout(function(){document.getElementById(”tvset”).style.zIndex=”80″;}, 5000);
Гран мерси!!
Геннадий, помогите пожалуйста. Хочу большой кусок кода вынести в функцию чтобы затем ее можно было вызывать
Вот так было и все работало
$(«#sel_period_of_time»).livequery(«change»,function () {
большой кусок кода который нужно вызывать не единожды
});
Затем я сделал так и не вызывается Где я нахомутал?
function test ()
{
большой кусок кода
}
затем
$(«#sel_period_of_time»).livequery(«change»,test);
Спасибо за вашу помощь.
Методически
все сделано правильно. Избавьте себя от головной боли – поставьте FireBug, сразу будет ясно, где искать проблему. Это же просто убойный инструмент, без него что-то серьезное делать вообще несерьезно…
Геннадий я сразу извиняюсь что так часто спрашиваю Вас просто новичок в этом деле. Но не могли бы Вы сказать
var a =1;
$(«td»).livequery(«click»,OPEN_DIALOG);
и ниже есть определение функции
function OPEN_DIALOG( ) {
alert (a);
}
Как правильно передать в OPEN_DIALOG параметром переменную а
Делал $(«td»).livequery(«click»,OPEN_DIALOG.call(a)); и то же с apply но alert валиться не при клике по ячейке а при появлении таблицы и параметр неопроеделен.
так я понимаю тоже делать нельзя
$(«td»).livequery(«click»,OPEN_DIALOG(а));
А как же передать параметр?
Про furebug я уже писал… Поставили? Что он Вам говорит?
З.Ы. Про call() и apply() Вы несколько неправильно видимо поняли…
Геннадий извиняйте нашел что было. Хотя не до конца понимаю
var a =1;
$(”td”).livequery(”click”,OPEN_DIALOG);
и ниже есть определение функции
function OPEN_DIALOG( a) { вот здесь я не ставил ни че ли ставил var a;
alert (a);
}
не пойму мы когда передаем параметр не должны разве указывать что это переменная а не просто символ?
FireBug поставил, НаЧинаю осваивать. Еще раз спасибо за совет и извиняйте что отвлекаю Курсовая:) Срочно.:))))
(((Хотя нет поспешил. Функция отрабатывает но без вызова хотя alert параметр показыват и консоль ошибок пишет
Mark the functions for matching later on
fn.$lqguid = fn.$lqguid || $.livequery.guid++;
if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++;
Не можете подсказать где про это можно более подробно почитать.В смысле если я создал функцию как в нее правильно передавать параметры?
To alex:
ищите информацию по синтаксису JS, с этого начинается изучение любого языка наверное.
Вы можете написать var a = 1; или a = 1; и это будет правильно.
З.Ы. Кстати, а зачем livequery? Работаете с версией 1.2.6? Отчего не с 1.3.2? Там бы без плагина можно было бы обойтись, метод live уже включен в библиотеку.
Геннадий подскажите а не встречали ли Вы в своей практике хорошего плагина контекстного меню (для правой кнопки мыши или может что то похожее для левой) Я перерыл полинета но нашел только такое. http://www.trendskitchens.co.nz/jquery/contextmenu/
Все хорошо но в Опере не работает. Может сталкивались? Спасибо за вашу помощь.
В плагинах jQuery на самом сайте не копались?
Геннадий могли бы Вы помочь понять след. проблему,(или хотя бы в указать направление куда копать) Есть таблица с данными Есть фунцкцИИ которые считывает эти данные при двойном клике по определенной ячейке, Затем я хочу либо заполнить эту ячейку(ту по которой кликал), либо редактировать данные в ней либо полностьсю удалить. Все три функции по отдельности работают правилььно.
То есть было так для обновления данных
$(«td»).live(«dblclick»,OPEN_DIALOG_UPDATE_PAIR) ;
и затем:
var a = new Array ();
function OPEN_DIALOG_UPDATE_PAIR()
{ a[0]=$(this).find(«#idpair»).text();
a[1]=$(this).find(«#date»).text();
и тд. затем функционал обноления
Все работало все читалось.
Проблема – решил поместить эти функции в контекстное меню(правая клавиша) соотвественно с пунктами Добавить Редактировать Удалить, Плагин поддисан на правый клик по ячейке Теперь когда клацаю по нужной ячейке выпадает меню затем вызывается нужная функция но алерты показывают пустые значения. то есть это a[0]=$(this).find(«#idpair»).text();
a[1]=$(this).find(«#date»).text(); Не работает
То есть теперь на клик по ячейке работает выпадение контекстного меню. А как же взять данные из ячейки? Не могу вкурить суть.Я же второй раз клацаю уже по пункту меню.Оно понятно не знает ни про какую ячейку и ничего не читает просто вызывает функцию а там все a[0]=$(this).find(«#idpair»).text();
a[1]=$(this).find(«#date»).text(); пустые
как повесить считывание на клацание по пункту меню или может нужно читать и сохранять одновременно. Но для разных функций нужно разное колво данных из ячейки Сейчас у меня так
$(«td»).contextMenu(‘myMenu1′, {
bindings: {
‘add’: function(t) {
OPEN_DIALOG_UPDATE_PAIR(t);
},
‘edit’: function(t) {
alert(‘Trigger was ‘+t.id+’\nAction was edit’);
},
‘delete’: function(t) {
alert(‘Trigger was ‘+t.id+’\nAction was delete’);
}
}
});
Спасибо за вашу помощь.
Ну вероятно у Вас this стал указывать не туда куда нужно. Ведь если раньше был обработчик клика повешен и ес-но this указывал на нужную ячейку. Сейчас стало не так. Вероятно по клик правой клавишей надо не только вызывать контекстное меню, но и запоминать ячейку по которой он был сделан, чтобы дальше с этой ячейкой работать.
Спасибо Геннадий сделал так и все заработало.
$(«td»).contextMenu(‘myMenu1′, {
bindings: {
‘add’: function(t) { OPEN_DIALOG_UPDATE_PAIR.call(t); },
‘edit’: function(t) { alert(‘Trigger was ‘+t.id+’\nAction was edit’); },
‘delete’: function(t) { alert(‘Trigger was ‘+t.id+’\nAction was delete’); }
}
});
А еще такой вопрос не подскажете. У меня эта таблица на ячейки которой подписано меню каждый раз после выполнения функции возвращается из аджакс запроса обновленная И понятно меню исчезает Прописывать каждый раз контекстное меню в succes не вариант. Я раньше с live все делал но сейчас сходу не могу понять на click не повесить livom а как еще можно. Извините еще раз что беспокою но очень надо.
Пробуйте разобраться с плагином контекстного меню, может в нем есть какие-то методы, позволяющие его инициализировать вновь по какому-либо событию.
Я Вам вряд ли что-то конкретное посоветую – не могу же я знать все существующие плагины к jQuery верно?
А давать какие-то другие пути решения на основании части кода тоже неразумно… Только пожалуйста, не надо вываливать в комментах весь код, ок?
Оставьте отзыв