События jQuery. Отправить информацию на событие, где он был вызван - PullRequest
0 голосов
/ 27 января 2010

Как лучше всего отправить сообщение на событие click, чтобы узнать, откуда оно было вызвано?.

$("#mybutton").click(function(ev){

   if (called from funcion One or Two){
     //my code
   }

});

funOne = function(){
  $("#mybutton").click();   
};

funTwo = function(){
  $("#mybutton").click();   
};

EDIT:

на "триггере" У меня есть небольшое решение, но зависит от всех реализованных параметр "data"

РЕДАКТИРОВАТЬ (II):

Мое решение основано на ответе "@Roatin Marth".

jQuery.fn.trigger = function(event, data) {

    var type = event.type || event,
        expando = "jQuery" + (+new Date);

    event = typeof event === "object" ?
    // jQuery.Event object
        event[expando] ? event :
    // Object literal
        jQuery.extend(jQuery.Event(type), event) :
    // Just the event type (string)
        jQuery.Event(type);

    if (!event.caller) {
        var xcaller = "";
        try {
            xcaller = arguments.callee.caller;
        } catch (ex) { };
        event.caller = xcaller;
    }

    return this.each(function() {
        jQuery.event.trigger(event, data, this);
    });
};


jQuery.fn.click = function(fn) {

    var returned = null;

    if (fn) {
        returned = this.bind('click', fn)
    } else {
        var event = jQuery.Event('click'), xcaller = "";
        try {
            xcaller = arguments.callee.caller;
        } catch (ex) { };
        event.caller = xcaller;
        returned = this.trigger(event);
    }

    return returned;
};

Ответы [ 3 ]

4 голосов
/ 27 января 2010

Вы можете передавать данные при запуске искусственного события, суть в том, что вы не можете использовать функции быстрого доступа, такие как click(), но вместо этого использовать trigger напрямую:

$("#mybutton").tigger('click', ['One', 'Two']);

Обработчик кликов:

$("#mybutton").click(function(ev, customArg1, customArg2) {
  customArg1; // "One"
  customArg2; // "Two"
})

Видя, как .click() - это всего лишь ярлык для .trigger('click'), в любом случае, вы ничего не потеряете, делая это таким образом, просто больше нажатий клавиш;)


Редактирование адресации комментариев :

система уже написана и является достаточно большой, чтобы изменить все скрипты

В этом случае вам может понадобиться взломать jQuery для захвата arguments.callee.caller и передать его вашему обработчику:

jQuery.fn.click = function(fn) {
  return fn ? this.bind(name, fn) : this.trigger(name, [arguments.callee.caller]);
};

С этим патчем код, который вызывает .click() напрямую, теперь будет передавать информацию об области действия вызывающей функции вашему обработчику кликов, который теперь может сделать это:

$("#mybutton").click(function(ev, caller) {
   if (caller === funOne || caller === funTwo){
     //my code
   }
});

Если то, что говорит о том, что является правдой, то arguments.callee.caller не будет надежным в будущем, но тогда взлом называется взломом по причине;)

0 голосов
/ 27 января 2010

Вы ищете arguments.callee. Теперь форма javascript 1.4 устарела.

Подробнее см. Здесь .

0 голосов
/ 27 января 2010

Я полагаю, что когда вы делаете клик на основе ваших фрагментов, он всегда срабатывает:

$("#mybutton").click(function(ev){

   if (called from funcion One or Two){
     //my code
   }

});

и никаких функций ... (кто-нибудь? Поправьте меня, если я ошибаюсь ...)

EDITED ..

ааа ... теперь я вижу ... вы хотели, чтобы это динамически щелкнуло ... (думает ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...