是否可以访问DOM元素'this'在jQuery插件的非函数参数参数中

Is it possible to access the DOM element 'this' in a non-function parameter argument in a jQuery plugin?

本文关键字:参数 插件 函数 jQuery 访问 元素 是否 this DOM      更新时间:2023-09-26

我有一个关于this和jQuery插件的潜在奇怪的问题

根据我的理解,下面是一个非常基本的jQuery插件:

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

(假装这是扩展click()的插件)

所以,如果我传递一个函数作为参数,它做它需要做的事情,并正确地访问this作为一个DOM节点。容易。

我很清楚。

不清楚的是,是否有任何方法可以将非功能参数传递给插件,并使其从参数中正确访问this ?也就是说,我可以配置插件做这样的事情:

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

for:

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

它将正确地传递一个数组给插件,数组中的第二项返回值Bar ?

我这样做,基本上,为我的插件提供语法糖,在那里你可以传递一个数组作为一个快捷方式(除了使用一个普通的回调函数作为主要功能)。除此之外,这样做,我失去了this的使用权限。这就是我的困境。

EDIT:这是邪恶的,但是,似乎一个工作是将参数作为字符串传递,然后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]));
        }  
    });
}; 

在没有函数的情况下没有一般的方法可以做到这一点,因为,在纯粹的数学意义上,您要求输入的函数(即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是邪恶的,我既不会写也不会宽恕这样的解决方案。编辑:哦,我看到你在你的原始帖子的编辑中这样做了。干得好,腐蚀子孙后代;)