Можно ли получить доступ к элементу DOM 'this' в аргументе не функционального параметра в плагине jQuery? - PullRequest
4 голосов
/ 07 сентября 2011

У меня есть потенциально странный вопрос о this и плагинах jQuery

Насколько я понимаю, ниже приведен очень простой плагин jQuery:

$.fn.clickclone = function(param){
    return this.click(function(){  
        param.apply(this);  
    });
}; 

(делая вид, что это плагинэто как-то расширяет click().)

Итак, если я передаю функцию в качестве аргумента, она делает то, что ей нужно, и правильно обращается к this как узел DOM.Легко.

Мне все ясно.

Что не ясно, есть ли способ, которым я мог бы передать нефункциональный аргумент плагину и получить от него правильный доступ к this из аргументов?то есть, я мог бы настроить плагин, чтобы сделать что-то вроде этого:

$("#foo").pluginname(["foo", $(this).text() ]);

Так, что для:

<a href="/bar" id="foo">Bar</a>

Это будет правильно передать массив плагину со вторым элементом вмассив, возвращающий значение Bar?

Я делаю это, в основном, чтобы обеспечить синтаксический сахар для моего плагина, где вы можете передать массив в качестве ярлыка (в дополнение к использованию обычной функции обратного вызова какосновной функционал).За исключением этого, я теряю доступ к использованию this.Отсюда моя дилемма.

РЕДАКТИРОВАТЬ: Это зло, но, кажется, одна из работ вокруг - передать аргумент в виде строки, а затем eval. Не реальное решение для меня, но оно иллюстрирует то, что я хотел бы сделать:

$.fn.clickclone = function(param){
    return this.click(function(){ 
        if(typeof param === "function"){ 
            param.apply(this);
        }
        else if(typeof param[1] === "string"){
             console.dir("This is evil: " + eval(param[1]));
        }  
    });
}; 

1 Ответ

2 голосов
/ 07 сентября 2011

Нет общего способа сделать это без функции, поскольку, в чисто математическом смысле, вы запрашиваете функцию ввода (то есть функцию this): что-тоэто зависит от this определенным образом.

Возможно, вы можете взломать его с помощью строк, например, но вы потеряете гибкость функций:

$.fn.alertMe = function (methodToAlert) {
    alert(this[methodToAlert]());
};

// usage:
$("#foo").alertMe("text");
$("#foo").alertMe("width");

И если вы обнаружите, что используетефункция приемлема, но синтаксис this сбивает с толку, вы можете просто сделать следующее:

$.fn.alertMe = function (alertGetter) {
    alert(alertGetter($(this));
};

// usage:
$("#foo").alertMe(function (x$) { return x$.text(); });
$("#foo").alertMe(function (x$) { return x$.width(); });

И для полноты, я думаю, я должен упомянуть, что вы, вероятно, могли бы избежать неприятностей с evalрешение, похожее на $("#foo").alertMe("$(this).text()"), но eval - зло, и я не буду ни писать, ни оправдывать такое решение.РЕДАКТИРОВАТЬ: о, я вижу, что вы сделали это в редактировании к исходному сообщению.Хорошая работа развращает будущие поколения;)

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