我知道这不是什么好做法.如果可能的话,不要编写这样的代码.

当然,我们总是会发现,巧妙的内联Javascript代码片段可以快速解决问题.

我之所以追问这个问题,是为了充分了解在编写以下代码时会发生什么(以及潜在的trap ):

<a href="#" onclick="alert('Hi')">Click Me</a>

据我所知,这在功能上与

<script type="text/javascript">
   $(function(){ // I use jQuery in this example
       document.getElementById('click_me').onclick = 
           function () { alert('Hi'); };
   });
</script>
<a href="#" id="click_me">Click Me</a>

由此推断,分配给属性onclick的字符串似乎插入到分配给元素的单击处理程序的匿名函数中.真的是这样吗?

因为我开始做这样的事情:

<a href="#" onclick="$(this).next().fadeIn(); return false;">Display my next sibling</a> <!-- Return false in handler so as not to scroll to top of page! --> 

这很管用.但我不知道这有多离谱.它看起来很可疑,因为没有从返回的明显函数!

你可能会问,你为什么要这么做,史蒂夫?内联JS是不好的练习!

老实说,我厌倦了仅仅为了修改页面的一个部分而编辑三个不同的代码部分,特别是当我只是在制作一些东西的原型,看看它是否能正常工作的时候.将与这个html元素相关的代码定义为right within个元素要容易得多,有时甚至是有意义的:当我在2分钟后决定这是一个非常非常糟糕的 idea 时,我可以删除整个div(或者其他任何内容),并且我没有一堆神秘的JS和css烂摊子在页面的睡觉上徘徊,从而略微减慢了呈现速度.这类似于引用局部性的概念,但是我们看到的不是缓存未命中,而是bug和代码inflating .

推荐答案

您得到的结果几乎是正确的,但是您还没有考虑到提供给内联代码的this值.

<a href="#" onclick="alert(this)">Click Me</a>

实际上更接近于:

<a href="#" id="click_me">Click Me</a>
<script type="text/javascript">
document.getElementById('click_me').addEventListener("click", function(event) {
    (function(event) {
        alert(this);
    }).call(document.getElementById('click_me'), event);
});
</script>

内联事件处理程序设置this等于事件的目标. 您还可以在内联脚本中使用匿名函数

<a href="#" onclick="(function(){alert(this);})()">Click Me</a>

Html相关问答推荐

用完全透明的边框切割出圆圈?

如何让一个动态列表以网格方式水平显示

HTML+CSS+JS动态选中文本高亮 colored颜色 变化

调整一组IMG的大小以适应容器DIV

在单独的容器之间堆叠上下文

如何将CSS滤镜仅应用于背景图像

如何使不断增长的div不溢出其包含固定div的父级

如何使div填充父项的剩余高度

将文本保持在平行四边形内并遵循形状

当浏览器宽度减小时字体大小变得太大

本地和在jsfiddle上页面工作正常,但在GitHub上无法运行.