【问题标题】:Add function to set of DOM elements using jQuery?使用jQuery向一组DOM元素添加函数?
【发布时间】:2016-05-11 22:09:52
【问题描述】:

我的前端至少在基础以上的旅程还在继续,最近我偶然发现了一个很大的问题。

我可以选择DOM元素,比如

var element=document.getElementById("elementid")

然后给它添加一些函数,像这样

function testFunction() {
    alert(this.getAttribute('data-self'));
}
element.customFunction=testFunction;

但是有没有偶然的方式使用 jQuery 来做到这一点?

尝试使用attr()、prop()、data(),但在这件事上没有任何运气。 data() 很接近,因为它允许我使用 $('#my-element-id').data('customFunction')(); 执行功能,但仍然不能解决我的问题,因为该选定按钮的这个新属性无法以任何其他方式访问。

总结一下:向 DOM 元素集合添加泛型函数(例如在示例中)的最简单方法是什么?

【问题讨论】:

  • 将函数直接添加到 DOM 元素并不是一个好的做法。也许您只是想添加一个 jQuery 插件方法,以便您可以使用 jQuery 对一个或多个 DOM 元素执行一些自定义功能?
  • 同意@jfriend00
  • @jfriend00 但它不是在插件开发中完成的吗?虽然我同意你的评论
  • @pratikwebdev - 抱歉,我不明白你的评论。

标签: javascript jquery html dom


【解决方案1】:

这很相似。 jQuery 只是返回一个对象,因此您可以向它添加函数。

var myElement = $('#elementid');
function testFunction() {
    alert($(this).attr('data-self'));
}
myElement.customFunction=testFunction;

myElement.customFunction();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="elementid" data-self="some value"></div>

【讨论】:

  • 先生,这与我发布的内容基本相同。我知道我可以通过这种方式选择元素,但它仍然需要一些循环才能获得所需的效果。很难从静态类型语言切换到 JS,我的...
  • 很确定这回答了这个问题:“添加泛型函数的最简单方法是什么”和“是否有机会使用 jQuery 来做这件事”
【解决方案2】:

出于多种原因,将函数直接添加到 DOM 元素并不被认为是一种好的做法。

我建议一个非常简单的 jQuery 插件方法:

jQuery.fn.myMethod = function() {
    // iterate all items in the jQuery collection and apply any logic you want
    return this.each(function() {
        // `this` will be the DOM element so you can carry out your operation here
        // for example, to flip a background color
        if (this.tagName === "INPUT") {
            this.style.backgroundColor = "red";
        } else {
            this.style.backgroundColor = "blue";
        } 
    });
}

// usage of jQuery plugin method:
$("#elementid").myMethod();
$(".boxes, .ovals, .containers").myMethod();

您还可以将参数传递给您的 jQuery 插件方法,并在您的自定义方法的实现中使用这些参数。

【讨论】:

  • 我想这会以某种方式解决我的问题。我将像本例一样包装一些处理程序,然后根据传递的数据在其中调用适当的函数。我知道直接添加到 DOM 不是一个好习惯,但这将是非常具体任务的内部解决方案。我已经编写了简单的网络服务器并同意数据接口,现在我只剩下前端了,与后端相比,这在我看来简直是地狱;-)
  • 更重要的是,与我的其他尝试相比,我可以滥用您的方法并执行$(selector).each(function() { this.customFunction=testFunction; });,这与我在这件事上的其他尝试和失败相比。我会记住这是不好的做法,我保证不会传播它;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 2011-01-27
  • 2010-09-28
  • 1970-01-01
  • 2010-10-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多