js中动态生成<a>标签并动态打开<a>标签中的链接

           昨天在项目中遇到一个关于js动态创建一个<a href="资源地址"  />然后append到<body>标签上显示的问题,发现添加到<body>标签上无法显示,代码如下:

  

<!DOCTYPE html  PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示图片</title>
<style>
.dialog {
	position: fixed;
	width: 700px;
	height: 700px;
	left: 50%;
	margin-left: -350px;
	top: 100px;
	border: 0px solid rgb(70, 233, 253);
	background-color: rgba(78, 108, 140, 0.66);
	z-index: 20;
}
.dialog-head {
	height: 40px;
	width: 100%;
	border-bottom: 1px white dotted;
	opacity: 1;
}

.close-btn {
	float: right;
	line-height: 40px;
	cursor: pointer;
	margin-right: 12px;
	color: white;
}

.dialog-content {
	width: 100%;
	height: 100%;
}

.dialog-img {
	width: 100%;
	height: 100%;
}
</style>
</head>
 <body>
 显示图片
</body>
<input type ='button' value='预览' οnclick='preview("完整的url地址")'>
<script src="jquery.min.js"></script>
<script>
 function preview(addr){
			var dlgStr = '<div class="dialog"><div class="dialog-head"><div class="close-btn" οnclick="closeDlg()">关闭</div></div><div class="dialog-content"><a href="'
					+ addr + '" class="dialog-img"/></div></div>';
			$('body').append(dlgStr);
 }
 
 function closeDlg(){
   $(".dialog").remove();
 }
</script>
</html>
    上面这样的代码,当点击预览按钮的时候,发现并没有像我想像的那样页面弹出对话框并显示内容,原因是append的是一段静态的代码,并没有事件触发去执行这个代码,所以无法显示我们想要显示的资源文件。

     经过对上面问题现象的分析,我们可以使用jquery的media插件来解决这个问题,这个插件可以在线预览一些文档个是的资源文件,例如:pdf,word等比较常用的文件格式资源。

   下面是改进后的代码:

   

<!DOCTYPE html  PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>展示图片</title>
<style>
.dialog {
	position: fixed;
	width: 700px;
	height: 700px;
	left: 50%;
	margin-left: -350px;
	top: 100px;
	border: 0px solid rgb(70, 233, 253);
	background-color: rgba(78, 108, 140, 0.66);
	z-index: 20;
}
.dialog-head {
	height: 40px;
	width: 100%;
	border-bottom: 1px white dotted;
	opacity: 1;
}

.close-btn {
	float: right;
	line-height: 40px;
	cursor: pointer;
	margin-right: 12px;
	color: white;
}

.dialog-content {
	width: 100%;
	height: 100%;
}

.dialog-img {
	width: 100%;
	height: 100%;
}
</style>
</head>
 <body>
 显示图片
</body>
<input type ='button' value='预览' οnclick='preview("http://www.cnblogs.com/tangzhengyue/p/4315393.html")'>
<script src="jquery.min.js"></script>
<script src="jquery.media.js"></script>
<script>
 function preview(addr){
  //carImg.closeDlg();
			var dlgStr = '<div class="dialog"><div class="dialog-head"><div class="close-btn" οnclick="closeDlg()">关闭</div></div><div class="dialog-content"><a href="'
					+ addr + '" class="dialog-img"/></div></div>';
			$('body').append(dlgStr)
			$('.dialog-img').media({
				width : 700,
				height : 700
			});
 }
 
 function closeDlg(){
   $(".dialog").remove();
 }
</script>
</html>

 上面的代买可以完美的解决资源文件在页面动态显示问题。

完整的demo示例地址: http://download.youkuaiyun.com/detail/zhengyangzkr/9822029

  

<think>好的,我现在要解决用户的问题,关于HTML中<span>、<a>和<i>标签的区别和用法。首先,我需要回顾用户提供的引用内容,结合之前的回答来构建一个清晰、准确的解释。 用户给出的引用[1]提到,大部分HTML标签都有语义意义,但<div>和<span>没有,不过它们的存在是为了避免滥用其他有意义的标签。引用[2]进一步解释了<div>和<span>作为通用容器的角色,分别用于块级和行内内容。引用[3]则专门说明<span>是行内标签,用于样式或行为控制。引用[4]讨论了<i>标签的语义问题,指出其主要用于文本,但实际使用可能超出其原本意图。 首先,我需要明确这三个标签的基本功能和语义差异。<span>是行内容器,没有特定语义,主要用于样式或脚本操作。<a>是超链接标签,用于创建链接,具有明确的语义和交互功能(如导航)。<i>传统上用于斜体文本,但在HTML5中被重新定义为表示“另一种语气或声音”的文本,如技术术语、外来语等,而不仅仅是样式。 接下来,我需要比较它们的默认样式和显示行为。<span>作为行内元素,不换行,无默认样式;<a>也是行内元素,但通常带有下划线和颜色变化;<i>同样是行内元素,默认斜体。但要注意,现代开发中应避免依赖默认样式,而是使用CSS来控制外观。 然后,考虑它们的语义化使用。根据引用中的观点,正确使用语义标签对可访问性和SEO很重要。<a>的语义明确,而<i>在HTML5中有了更明确的定义,不再是单纯的样式标签。这点需要强调,避免用户误用<i>仅为了斜体效果。 常见问题部分,用户可能会混淆这些标签的用途,比如用<span>代替<a>作为按钮,或者误用<i>仅为了斜体。需要指出这些错误提供正确做法,比如使用<button>或适当的ARIA角色,以及使用CSS的font-style属性代替<i>。 还需要参考之前的回答结构,比如之前关于<li>和<span>的区别,保持一致性。例如,使用表格对比特性,给出代码示例,以及常见问题解答。 最后,生成的相关问题应涵盖语义、样式控制、使用场景等方面,帮助用户深入理解。例如,如何正确使用<i>标签,或如何用CSS替代<i>的默认样式。 现在,我需要确保内容结构清晰,分点说明,每个标签的核心功能、语义、样式、使用场景,以及常见错误和解决方案。同时,引用提供的资料来支持观点,比如引用[3]关于<span>的作用,引用[4]关于<i>的语义问题。最后,检查是否有遗漏或错误,确保信息准确无误。</think>#### HTML `<span>`、`<a>`、`<i>` 标签的区别与用法详解 --- ##### **一、核心功能与语义差异** 1. **`<span>` 标签** - **语义作用**:无特定语义,是**通用行内容器**,用于包裹文本或行内元素以实现样式化(如修改颜色、字体)或脚本操作[^3]。 - **默认样式**:无任何默认样式(`display: inline`)。 - **典型用例**: ```html <p>价格:<span class="price">¥99</span></p> ``` 2. **`<a>` 标签** - **语义作用**:定义**超链接**,用于导航到其他页面或锚点,具有明确的交互语义。 - **默认样式**:蓝色文字、下划线(未访问)/紫色(已访问),可通过 CSS 覆盖。 - **关键属性**:`href`(链接地址)、`target`(打开方式,如 `_blank`)。 - **典型用例**: ```html <a href="https://example.com" target="_blank">访问示例网站</a> ``` 3. **`<i>` 标签** - **语义作用**:在 HTML5 中表示**“另一种语气或声音”**的文本(如技术术语、外来语、思想片段等),不再单纯表示斜体样式[^4]。 - **默认样式**:斜体(`font-style: italic`)。 - **典型用例**: ```html <p>科学名称:<i>Homo sapiens</i></p> ``` --- ##### **二、显示行为与样式控制对比** | 特性 | `<span>` | `<a>` | `<i>` | |--------------------|-------------------------------|--------------------------------|--------------------------------| | **默认显示类型** | 行内元素(`inline`) | 行内元素(`inline`) | 行内元素(`inline`) | | **默认样式** | 无 | 下划线、颜色变化 | 斜体 | | **语义强度** | 无语义 | 强语义(导航功能) | 弱语义(语气变化) | | **是否支持嵌套块级元素** | ❌(仅限行内内容) | ❌(HTML5 允许包裹块级元素) | ❌ | --- ##### **三、常见使用场景与代码示例** 1. **`<span>` 的典型应用** - **文本局部样式化**: ```html <p>重点内容:<span style="color: red; font-weight: bold">红色加粗文字</span></p> ``` - **动态内容标记**: ```html <div id="counter">点击次数:<span id="count">0</span></div> ``` 2. **`<a>` 的进阶用法** - **锚点跳转**: ```html <a href="#section2">跳转到第二节</a> <section id="section2">...</section> ``` - **邮件与电话链接**: ```html <a href="mailto:contact@example.com">发送邮件</a> <a href="tel:+123456789">拨打电话</a> ``` 3. **`<i>` 的语义化使用** - **图标字体(Font Awesome)**: ```html <i class="fas fa-user"></i> 用户图标 ``` - **特殊术语标注**: ```html <p>量子力学中的<i>叠加态</i>是一个核心概念。</p> ``` --- ##### **四、常见错误与解决方案** 1. **错误1:用 `<span>` 替代 `<a>` 实现交互** - **问题**: ```html <span onclick="location.href='#'">伪按钮</span> <!-- 违反语义,无法被屏幕阅读器识别 --> ``` - **解决**:使用 `<a>` 或 `<button>` 添加 ARIA 角色: ```html <a href="#" role="button">合法按钮</a> ``` 2. **错误2:滥用 `<i>` 仅实现斜体效果** - **问题**: ```html <i>仅为了斜体的文本</i> <!-- 语义不明确 --> ``` - **解决**:使用 CSS 替代样式,保留 `<i>` 的语义: ```css .italic { font-style: italic; } ``` ```html <span class="italic">斜体文本</span> ``` 3. **错误3:`<a>` 包裹非链接内容** - **问题**: ```html <a> <div>整个区块可点击但无实际链接</div> </a> <!-- 语义混淆 --> ``` - **解决**:为区块添加 `role="button"` 绑定点击事件: ```html <div role="button" tabindex="0" @click="handleClick">...</div> ``` --- ##### **五、语义化与无障碍访问建议** 1. **`<a>` 标签的必备属性** - 始终包含 `href` 属性,若为占位链接可使用 `href="javascript:void(0)"`。 - 为图标链接添加 `aria-label` 描述: ```html <a href="#" aria-label="返回顶部"><i class="fas fa-arrow-up"></i></a> ``` 2. **`<i>` 标签的语义增强** - 结合 `aria-hidden` 隐藏纯装饰性图标: ```html <i class="icon-star" aria-hidden="true"></i> 收藏 ``` 3. **`<span>` 的合理限制** - 避免用 `<span>` 包裹大段内容或替代段落标签(如 `<p>`)。 --- #### 相关问题 1. 如何通过 CSS 移除 `<a>` 标签的下划线? 2. `<i>` 标签在图标字体技术中为何被广泛使用? 3. 为什么 HTML5 禁止在 `<span>` 内嵌套块级元素?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值