Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Контекстное меню как считать данные из таблицы (https://javascript.ru/forum/jquery/6711-kontekstnoe-menyu-kak-schitat-dannye-iz-tablicy.html)

xela1980 16.12.2009 17:19

Контекстное меню как считать данные из таблицы
 
Ребята помогите понять след. проблему, Есть таблица с данными Есть фунцкцИИ которые считывает эти данные при двойном клике по определенной ячейке, Затем я хочу либо заполнить эту ячейку(ту по которой кликал), либо редактировать данные в ней либо полностьсю удалить. Все три функции по отдельности работают правилььно.
То есть было так для обновления данных

$("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');
}

}
});
Спасибо за вашу помощь.

Gvozd 16.12.2009 20:17

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

xela1980 16.12.2009 21:29

Форматирую . Значит так есть HTML
1) меню

<div class="contextMenu" id="myMenu1">
<ul>
<li id="add">Добавить</li>
<li id="edit">Редактировать</li>
<li id="delete">Удалить</li>
</ul>
</div>

2) На него я вещаю такой JS

$("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');
}

}
});

Cама по себе функция OPEN_DIALOG_UPDATE_PAIR(); выполняЛА вытягивание информации из ячеек таблицы при двойном клике по ней левой клавишей мышки то есть раньше она вызывалась НЕ путем выбора пунта меню а вот так

$("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();
и тд. затем много функционала
}
В ячейках таблицы есть скрытые айдишники хранящие инфу

Сейчас я поместил ее (функцию OPEN_DIALOG_UPDATE_PAIR() ) в пункт меню но ...хочу чтобы она продолжала при выборе пункта меню

<li id="add">Добавить</li>

читать инфу из ячейки на которой была нажата правая клавиша. Но инфы нет.Алерты которые я ставлю при вхождении в функцию пустые.
То есть я понимаю что сперва я нажимаю на ячейке правой кнопкой мыши и выпадает меню я выбираю нужный пункт и вызывается нужная функция которая уже не может считать данные из ячейки потому что она не знает из какой? Или я неправильно понимаю?

PeaceCoder 16.12.2009 21:41

Цитата:

Форматирую . Значит так есть HTML
1) меню
<div class="contextMenu" id="myMenu1">
  <ul>
    <li id="add">Добавить</li>
    <li id="edit">Редактировать</li>
    <li id="delete">Удалить</li>
  </ul>
</div>

2) На него я вещаю такой JS
$("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'); }
    }
  });


Cама по себе функция OPEN_DIALOG_UPDATE_PAIR(); выполняЛА вытягивание информации из ячеек таблицы при двойном клике по ней левой клавишей мышки то есть раньше она вызывалась НЕ путем выбора пунта меню а вот так
$("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();
  и тд. затем много функционала
  }

В ячейках таблицы есть скрытые айдишники хранящие инфу

Сейчас я поместил ее (функцию OPEN_DIALOG_UPDATE_PAIR() ) в пункт меню но ...хочу чтобы она продолжала при выборе пункта меню
<li id="add">Добавить</li>


читать инфу из ячейки на которой была нажата правая клавиша. Но инфы нет.Алерты которые я ставлю при вхождении в функцию пустые.
То есть я понимаю что сперва я нажимаю на ячейке правой кнопкой мыши и выпадает меню я выбираю нужный пункт и вызывается нужная функция которая уже не может считать данные из ячейки потому что она не знает из какой? Или я неправильно понимаю?
П.С. Так легче читать

xela1980 16.12.2009 21:50

PeaceCoder Спасибо за помощь в форматировании. :) Эх еще бы проблему решить. Очень нааадо!

PeaceCoder 16.12.2009 21:57

блин что так сложно мануал почитать. я хоть jQuery не юзаю но почемуто понял.
http://www.trendskitchens.co.nz/jquery/contextmenu/

попробуй так
$("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'); }
    }
  });

xela1980 16.12.2009 22:15

Cпасибо огромное PeaceCoder заработало. Выручил. Да я тоже в этом деле новичок Если честно раньше читал про этот сall но так и не понял. Это что за метод такой? Если можешь в двух словах. Почему без него никак а с ним как, Объясни я теперь точно пойму. Плииииз.

PeaceCoder 16.12.2009 22:32

http://javascript.ru/Function/call

В двух словах: ИмяФункции.call($t,a1,a2,a3,...)

Вызовется функция в которой this=$t и передадуться аргументы a1,a2,a3,...

В твоем случае this=TD должно быть вот я подправил передачу TD под твою функцию

xela1980 16.12.2009 22:49

Еще раз спасибо Теперь понятней. Извини за наглость (курсовая горит :) )А еще такой вопрос не подскажешь. У меня эта таблица на ячейки которой подписано меню каждый раз после выполнения функции возвращается из аджакс запроса обновленная И понятно меню исчезает Прописывать каждый раз контекстное меню в succes не вариант. Я раньше с live все делал но сейчас сходу не могу понять на click не повесить livom а как еще можно. Извини еще раз что беспокою но очень надо.

PeaceCoder 16.12.2009 23:06

в твоем случае плагин маломощный. но можно выкрутится след образом.
Повесить контекстное меню на таблицу.
$("table#id").contextMenu('myMenu1', {
  bindings: {
    'add': function(t) { OPEN_DIALOG_UPDATE_PAIR.call(t._td); },
    'edit': function(t) { alert('Trigger was '+t._td.id+'\nAction was edit'); },
    'delete': function(t) { alert('Trigger was '+t._td.id+'\nAction was delete'); }
    }
  onContextMenu: function(e){
    e.target.parentNode.parentNode._td = e.target;
    return true;
    }
  });

это при условии, что сама таблица не пересоздается и кроссбраузерное решение под e.target

xela1980 16.12.2009 23:19

PeaceCoder Cпасибо огромное за твою помощь. Знаешь все таки решил остановиться на succes и сделать по дубовому но работает Вынес тело меню в отдельную функцию
function menu ()
{
$("td#stat").contextMenu('myMenu1', {
bindings: {
'add': function(t) {

OPEN_DIALOG_ADD_PAIR.call(t);


},
'edit': function(t) {
OPEN_DIALOG_UPDATE_PAIR.call(t);
},
'delete': function(t) {
DELETE_PAIR.call(t);
}

}
});


}

а в тех аджакс запросах которые ее меняют в succes тулю этот test (). Знаю знаю по колхозному но млин работает. Допишу курсовую обязательно вникну в то что ты написал. Спасибо огромное. Кстати можно тебя в личке иногда спрашивать, а то новичок в этом деле. Иногда помощь до зарезу нужна.

PeaceCoder 16.12.2009 23:26

можно. для этого я и здесь. расширить свой кругозор возможностей и помогать другим.

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

x-yuri 21.12.2009 16:14

Цитата:

Сообщение от PeaceCoder
можно. для этого я и здесь. расширить свой кругозор возможностей и помогать другим.

в какой-то момент понимаешь, что другие обычно не хотят, чтобы им помогали ): им 1) главное, чтобы работало, 2) идеальный вариант - чтобы за них написали код ;)

PeaceCoder 21.12.2009 19:12

Цитата:

Сообщение от x-yuri
какой-то момент понимаешь, что другие обычно не хотят, чтобы им помогали

если бы не хотели - темы бы не поднимали, а взять готовый с потолка непоучается естесно...
Цитата:

Сообщение от x-yuri
им 1) главное, чтобы работало, 2) идеальный вариант - чтобы за них написали код

Мне не жалко написать комуто маленький код да и помочь тоже. а вот опыта в разного рода задачах получаешь не мало.

x-yuri 21.12.2009 19:39

Цитата:

Сообщение от PeaceCoder
если бы не хотели - темы бы не поднимали

я скорее про цель большинства тем

Цитата:

Сообщение от PeaceCoder
Мне не жалко написать комуто маленький код да и помочь тоже

если ты все сделаешь за ТС, то ты поможешь себе: "а вот опыта в разного рода задачах получаешь не мало". Ну может разве что кому-то денег поможешь заработать

PeaceCoder 21.12.2009 19:52

Цитата:

Сообщение от x-yuri
Ну может разве что кому-то денег поможешь заработать

на 2-3 строках кода? ну сказанул.

П.С. если так рассуждать - закрыввайте форум, то чего уж там форум. закрывайте сайт сразу. И напишите: хотите научиться - ozon.ru или городской книжный магазин. это я так к слову полетело...

Kolyaj 22.12.2009 12:39

Цитата:

Сообщение от PeaceCoder
если так рассуждать - закрыввайте форум, то чего уж там форум. закрывайте сайт сразу.

А почему все форум принимают за лавочку бесплатных скриптов? Да ещё и под любые нужды.

x-yuri 22.12.2009 12:54

Цитата:

Сообщение от PeaceCoder
П.С. если так рассуждать - закрыввайте форум, то чего уж там форум. закрывайте сайт сразу. И напишите: хотите научиться - ozon.ru или городской книжный магазин. это я так к слову полетело...

ты не понял. Чтобы чему-то научиться, нужно что-то делать самому. Когда ты постишь готовый скрипт, учишься по сути только ты ;)

еще полезно прочитать вот это

PeaceCoder 22.12.2009 19:12

Цитата:

Сообщение от x-yuri
Когда ты постишь готовый скрипт, учишься по сути только ты

Цитата:

Сообщение от PeaceCoder
а вот опыта в разного рода задачах получаешь не мало.

пришел к моим словам =)
Цитата:

Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос.
Форум не поможет, если на форуме нет того, что ты ищешь. Зато это могут знать другие ==>
Цитата:

Суть любого технического форума – это обмен знаниями, навыками, опытом.
Непойму я ВАС. Сами же себе и противоречите...

Хотя поддержу одно единственное. Если ты в поисках чего либо и не прилагаешь усилий то ты ничему не научишься как бы не помогали.

x-yuri 22.12.2009 20:47

Цитата:

Сообщение от PeaceCoder
пришел к моим словам =)

я их с самого начала подтвердил

не противоречим

PeaceCoder 22.12.2009 22:24

Цитата:

Сообщение от x-yuri
я их с самого начала подтвердил

там двояко получается обращение от моей стороны твоими словами к другим, подтверждающе мои слова + намек что бы шевелили мозгами =)
Цитата:

Сообщение от x-yuri
не противоречим

если подтвердил то да не противореши а наоборот опять же говоришь почитать другим это.

пс. плохая манера у меня когда меня цитируют почему то всегда думаю что говорят со мной и других это не касается =(

x-yuri 22.12.2009 23:28

Цитата:

Сообщение от PeaceCoder
если подтвердил то да не противореши а наоборот опять же говоришь почитать другим это.

и как это понимать?

PeaceCoder 23.12.2009 11:23

Цитата:

Сообщение от x-yuri
и как это понимать?

если подтвердил, то да не противоречишь, а наоборот, опять же говоришь почитать другим это.

x-yuri 23.12.2009 11:44

т.е. не противоречу, и говорю другим прочитать это, что опять же подтверждает, что не противоречу. Так что ли?

PeaceCoder 23.12.2009 23:13

Цитата:

Сообщение от x-yuri
т.е. не противоречу, и говорю другим прочитать это, что опять же подтверждает, что не противоречу. Так что ли?

масло маслянное. да именно так =) ток второе "противоречу" лишнее. просто почитать другим и тчк. ;)

demetris 31.05.2013 14:20

кто помочь сможет... есть скрипт...
$("#sortable").contextMenu({
		selector: 'li', 
		callback: function(key, options) {
			var img_id = $(this).attr('id').substring(6);
			$.post('/design/photo-edit', {key : key, img_id : img_id}, function(data){
				if(data.result == 'delete'){
					$('li#photo_'+data.img_id).remove();
					$('img#photo_'+data.img_id).remove();
				}
			});
        },
		items: $(".c-menu li")
	});

нужно чтоб он сформировал меню контекстное из уже готового списка... к примеру такого
<ul class="c-menu">
				<li><span>Удалить</span></li>
				<li><span>add</span></li>
			</ul>

формировать он формирует... но пункты меню получаются пустыми

может я что не так делаю или как то по другому это все делается вообще

как вариант возможно можно сделать через аякс формирование пунктов... но в мануале что-то не нашел как такое можно реализовать

просто меню динамическое будет


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