简单的 Javascript 来模仿在事件处理程序中使用它的 jQuery 行为

2023-11-27

这不是关于 jQuery 的问题,而是关于 jQuery 如何实现这种行为的问题。

在 jQuery 中你可以这样做:

$('#some_link_id').click(function() 
{
   alert(this.tagName); //displays 'A'
})

有人可以概括地解释一下(不需要您编写代码)他们如何将事件的调用者 html 元素(此特定示例中的链接)传递到this关键词?

我显然试图在 jQuery 代码中查看第一个,但我无法理解一行。

Thanks!

UPDATE:根据 Anurag 的回答,我决定此时发布一些代码,因为编码似乎比我想象的更容易:

function AddEvent(html_element, event_name, event_function)
{      
   if(html_element.attachEvent) //IE
      html_element.attachEvent("on" + event_name, function() {event_function.call(html_element);});
   else if(html_element.addEventListener) //FF
      html_element.addEventListener(event_name, event_function, false); //don't need the 'call' trick because in FF everything already works in the right way         
}

然后现在通过一个简单的调用,我们模仿在事件处理程序中使用它的 jQuery 行为

AddEvent(document.getElementById('some_id'), 'click', function()
{            
   alert(this.tagName); //shows 'A', and it's cross browser: works both IE and FF
}); 

您是否认为我以过于肤浅的方式看待所有事情有任何错误或误解?


在 Javascript 中,您可以以编程方式调用函数并告诉它做什么this应该引用,并使用以下任一方式向其传递一些参数call or apply中的方法Function。函数在 Javascript 中也是一个对象。

jQuery 迭代其结果中的每个匹配元素,并调用click该对象上的函数(在您的示例中)将元素本身作为上下文传递或什么this指的是该函数内部。

例如:

function alertElementText() {
    alert(this.text());
}

这将调用上下文(this)对象上的文本函数,并警告它的值。现在我们可以调用该函数并使上下文(this)成为 jQuery 包装的元素(因此我们可以调用this直接不使用$(this).

<a id="someA">some text</a>
alertElementText.call($("#someA")); // should alert "some text"

使用之间的区别call or apply调用该函数是很微妙的。和call参数将按原样传递,并且apply它们将作为数组传递。阅读更多有关apply and call on MDC.

同样,当调用 DOM 事件处理程序时,this已经指向触发事件的元素。 jQuery 只是调用您的回调并将上下文设置为元素。

document.getElementById("someId").onclick = function() {
    // this refers to #someId here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单的 Javascript 来模仿在事件处理程序中使用它的 jQuery 行为 的相关文章

随机推荐

  • 递归方法最长路径算法的计算复杂度

    我编写了一个代码段来确定图中的最长路径 以下是代码 但由于中间的递归方法 我不知道如何获得其中的计算复杂度 由于找到最长的路径是一个 NP 完全问题 我认为它是这样的O n or O 2 n 但我怎样才能真正确定它呢 public stat
  • 部分类模板特化是这个设计问题的答案吗?

    假设您有一个类 其工作是连接到远程服务器 我想抽象这个类以提供两个版本 一个通过UDP连接 另一个通过TCP连接 我想构建尽可能精简的运行时代码 而不是使用多态性 我正在考虑模板 这是我的设想 但我不确定这是最好的方法 class udp
  • 当组不互斥时,功能类似于 group_by

    我想在 R 中创建一个函数 类似于dplyr s group by函数 当与summarise可以给出数据集的汇总统计数据 其中组成员身份并不相互排斥 即 观察结果可以属于多个组 考虑这个问题的一种方法可能是考虑标签 观察结果可能属于一个或
  • 在 Git 中维护“服务器版本”(仅更改配置文件)的正确方法是什么?

    我有时使用 Codeigniter 在本地站点上完成开发后 我需要将文件迁移到服务器 中的所有文件 config 需要更改文件夹以匹配服务器设置 对这些更改进行完整提交是不对的 我是否只是让 Git 完全忽略这些文件 或者有没有办法跟踪这些
  • C# 可为空字符串错误

    private string typeOfContract get return string ViewState typeOfContract set ViewState typeOfContract value 稍后在代码中我这样使用它
  • Spring REST - RestTemplate 可以使用多部分/混合吗?

    我想编写一个 REST 服务 它响应一个 zip 文件和一些 json 数据 所有内容都在一个多部分 混合请求中 服务器部分工作正常 我正在使用 Firefox 的 REST 客户端对其进行测试 我的服务器发送这样的多部分 k dXaXvC
  • 实体框架不适用于没有标识列的表

    我有下表 create table tbl id int identity 1 1 val varchar 100 现在 当我使用实体框架将对象映射到该表时 它可以工作 但是当我按如下方式更改表定义时 create table tbl1 i
  • 在 SendGrid C# 中将电子邮件作为日历邀请/约会发送

    我想向 Outlook 以及非 Outlook 客户端 例如 gmail yahoo 发送一封包含日历邀请 约会的电子邮件 我的应用程序托管在 Azure 上 我使用 SendGrid 发送电子邮件 电子邮件部分工作得很好 但我还没有找到任
  • 开发 URL 缩短器

    我正在尝试开发一个 URL 缩短器应用程序来练习 Django 我不明白如何为每个长 URL 创建唯一的字符串以用作短 URL 就像其他流行的 URL 缩短器一样 我怎样才能做到这一点 是否可以使所有短网址的长度相同 我不明白如何为每个长
  • 在 Perl 中获取 UTC 偏移量的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 我需要以跨平台 Windows 和各种风格的 Unix 方式在 Perl 中获取当前时区的 UTC 偏移量 它应该满足以下格式 zzzzzz 表示相对于 UTC 的 hh mm 看来我应该能够通过strftime
  • 如何为 log4j 设置单独的日志记录流?

    假设我有一堂这样的课 public class MyClass private Logger log LoggerFactory getLogger MyClass class org slf4j LoggerFactory public
  • 在 Chrome 中上传返回 Aw, Snap 页面

    从 chrome 的上次更新 版本 36 0 1985 125 m 开始 我遇到了 uplodify 插件 flash 的问题 Chrome 会显示 噢 Snap Page 有时还会显示 他死了 吉姆 这是我的上传代码
  • Android 文件管理器库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 诚然 我在 Android 开发方面没有经验 我正在寻找一些 API 可以让我浏览用户文件 而无需通过意图安装单独的应用程序 现在我已经找到了OI
  • java程序中的代理设置

    我正在尝试通过 Eclipse 中的 java 程序使用从 wsdl 生成的客户端连接到 Web 服务 我正在通过代理服务器传递我的请求 但似乎请求没有通过 相同的代理设置在 SoapUI 上运行良好 请在下面找到我设置的系统属性 Prop
  • 如何测试多个变量与单个值的相等性?

    我正在尝试创建一个函数 将多个变量与一个整数进行比较并输出一个由三个字母组成的字符串 我想知道是否有办法将其翻译成Python 所以说 x 0 y 1 z 3 mylist if x or y or z 0 mylist append c
  • 陷阱起火后退出

    拿这个脚本 bin sh fd echo Hello world exit trap fd EXIT INT for g in 1 5 do echo foo sleep 1 done 我想fd从 Control C 或脚本正常退出时触发一
  • 从多对多 SQLAlchemy 和 Postgresql 中删除

    我正在尝试从 sql alchemy 中的多对多关系中删除子对象 我不断收到以下错误 StaleDataError DELETE statement on table headings locations expected to delet
  • Android旋转imageview,我无法在onAnimationEnd()中设置imageview的最终位置

    我想在每次单击按钮时将图像视图旋转 30 度 在第一个 CLIC 上 我可以正确设置动画 但在动画后无法成功更新图像视图位置 当我再次单击按钮时 动画从图像视图的原始位置开始 而不是从第一个动画之后的最终位置开始 这是我的代码 public
  • 将文本读入缓冲区后如何逐行读取?

    首先 我通过调用fread将文本读入缓冲区 然后我想逐行读取它 该怎么做 我尝试使用 sscanf 但似乎不起作用 char textbuf 4096 char line 256 FILE fp fp fopen argv 1 r mems
  • 简单的 Javascript 来模仿在事件处理程序中使用它的 jQuery 行为

    这不是关于 jQuery 的问题 而是关于 jQuery 如何实现这种行为的问题 在 jQuery 中你可以这样做 some link id click function alert this tagName displays A 有人可以