点击图像时调用动作的适当HTML元素是什么?

4
我有一个Web应用程序,在其中(与其他许多应用程序一样)您单击图像以执行某些操作,例如标记条目、发送电子邮件、标记某些内容等等...

简而言之,单击图像应该调用一个操作(通过JavaScript实现,但这不是重点)。

我想知道,这样做的“正确”方式是什么?

  • <a>-标签?嗯...实际上它不是一个链接...
  • <button>?因为显然按钮是调用操作的语义元素...
  • <div>

有任何提示吗?


2
我会选择<button>,但这取决于你。 我自认为是一个纯粹主义者,但我还没有思考过这个问题 :) - MvanGeest
2
按钮是语义化的方式,但在权衡用户期望和美学时,并不一定意味着它是最佳的方式。说实话,按钮元素对于两者来说都有点可怕 - 用户习惯于点击小图标来完成操作。为什么要为了语义而打破用户的期望呢? - hollsk
现在对我来说很清楚了,看到了被接受的答案...(1) 如果Web应用程序将是“公开的”:使用<img>(并通过DOM脚本添加JavaScript操作,因为我们希望对非JavaScript用户友好)。(2) 由于我的应用程序是内部使用的,所以我会调皮地选择<img>,并直接附加JavaScript...感谢大家快速而好的回答!非常有帮助 :-) - thomastiger
顺便问一句,为什么我现在 使用一个按钮:即使没有操作,图像也会表明应用程序的状态,这使我能够告诉自己它当然是信息性的,同时也可以执行动作 ;) 显然,我在稍微欺骗自己,但嘿... - thomastiger
3个回答

4

简短回答

使用 <img> 标签来展示图片,不要使用按钮、锚点或输入框等元素,因为它们会让用户认为该元素是可交互的,即使没有 JavaScript 的情况下也是如此。

详细解答

点击图片应该调用一个动作(通过 JavaScript 实现,但这不是重点)。

我不同意,这才是重点 :)

因为点击操作只能在启用了 JavaScript 的环境下才能生效,所以你的图片应该只在 JS 环境下可用。

因此,正确的方法是使用 JavaScript 插入图片;虽然 HTML 文档应该具有语义正确性,但 DOM 结构并不一定需要具备语义正确性,因此使用哪个元素已经变得不那么重要了。

错误的方式

<div>
    Click on the image to do something: <a href="javascript:wtv()" style="background-image:url(...)">&nbsp;</a>
</div>
<div>
    Click on the image to do something: <input type="image" onclick="wtv()" src="..." />
</div>
<div>
   Click on the image to do something: <img onclick="wtv()" src="..." />
</div>
<div>
    Click on the image to do something: <button onclick="wtv()"><img onclick="wtv()" src="..." /></button>
</div>

这些都是错误的,因为没有JavaScript的用户会看到这些项目,无法使用它们。
其中,我认为<img>是较小的问题,因为它不暗示交互元素。最大的问题是将<a>作为锚点使用,应该将其作为超链接指向另一个文档,并且永远不要使用javascript:协议。
即使在外部添加JavaScript事件处理程序时,您仍将面临同样的问题:
/* external .js file */
document.getElementById("myButton").onclick = wtv;

<!-- HTML document -->
<div id="myButtonParent">
    Click on the image to do something: <a id="myButton" href="#" style="background-image:url(...)">&nbsp;</a>
</div>

再次提醒,您仍然可以向那些没有JavaScript的用户提供(无效)超链接。

相反地

相反地,使用DOM脚本插入整个内容!我将使用带有onclick事件的<img>

/* external .js file */
window.onload = function() {
    var img = document.createElement("img");
    img.src = "...";
    img.onclick = wtv;
    img.style.cursor = "pointer"; // so the mouse turns into a finger,
                                  // like on a hyperlink
                                  // Note: instead assign a class attribute and put this in an external CSS file...
    document.getElementById("myButtonParent").appendChild(img);
}

虽然我同意你说的大部分内容,但我认为动态创建任何用户交互并导致某些操作的内容可能有点过头了。如果他需要支持不使用脚本的客户端,那么是的,我会考虑这个。我很高兴我从未参与过必须支持这种用户少数群体的Web项目。 - JoshBerke
太棒了!你不仅给了我如何避免错误的示例,还让我有了开始进行DOM脚本编写的头绪...这是一个很好的示例,可以帮助我进一步学习 :)但正如上面所说,我有一个好借口,因为我的应用程序是内部使用的,所以我可以告诉人们请启用js ;) - thomastiger
@Josh - 我理解“proper”指的是“理论上的理想” ;) - Richard JP Le Guen
我认为Proper的观点是,最好的方法是考虑到理论上的理想情况,同时也要考虑实际可行性、易于阅读和理解。在这种情况下,动态构建图像标签会增加很多额外的复杂性(如果有5、10或20个图像,情况可能会很快失控)。各有所好:-0) - JoshBerke
我们来个折中吧,放弃那个,改用jQuery怎么样?;) 但我同意更重要的是使用<image />而不是全部使用JS。 - Richard JP Le Guen

2
您可以为图像添加一个onclick事件:
<img id='image1' onclick="javascript:DoSomething()"...

或者通过jQuery添加:

$("#image1").click(
function() {
     DoSomething();
  });

我认为在这里不应该使用锚标签。锚定是用于导航而不是执行操作。更不用说如果您使用beforeunload事件,如果您使用锚标签,它们将被触发。
虽然div可行,但它对页面没有语义贡献。您并没有定义一个明确的页面块,需要使图像可点击。
我不够了解按钮控件,无法谈论它作为一种选择。

谢谢您解释为什么不使用锚点或div!现在我更清楚了,因为有了一些理由... - thomastiger

-3

我不太明白你想要实现什么。但是你尝试过图像输入吗?

<input type="image" src="image source">

它将执行类似于表单提交的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接