关于html和javascript在浏览器中的加载顺序问题的讨论(zz)

深入理解ASP.NET AJAX中客户端页面生命周期
本文探讨了HTML页面加载过程、JavaScript作用域、变量作用域、不同脚本段之间的关系,以及HTML页面的生命周期。重点分析了页面加载顺序、作用域规则和关键事件(如onLoad和onUnload)。并通过实例展示了现代网页如何利用JavaScript生成动态内容,并讨论了事件触发多个响应函数的实现方式,以及如何利用DOM API增强页面交互性。

前一阵子横扫了javascript,当时自我感觉良好。现在一想,又觉得没什么。今天的任务是把asp.net ajax中客户端页面生命周期那一章研究完。然而,因为这一章的内容使我产生了一些迷惑。这些疑惑在书中都没有只字提及。

一、html页面的详细加载过程是什么呢?页面元素在加载时的优先级是什么?

  二、javascript的作用域、变量的作用域、不同脚本段之间的关系?

  三、html页面的生命周期?

  这些问题真的打中了我的死穴。不了解这些,我就无法透过asp.net ajax的框架看到其底层原理。只知其然而不知其所以然。

  在网上广泛查阅资料的情况下。获得了部分答案。

关于html的加载:

  总体上,html的是按从上到下的顺序边加载边解析,边生成dom对象,至于在html中夹杂的:

  document.write("xxxx");

  <script type="text/javascript" src="aaa.js"></script>

  之类的东西,它们的顺序是怎样的呢?还是一样,如果在解析html时,遇到这些东西就会停止解析,转而执行这些生成语句,如果中间插入外部链接,就转而解析、执行外部链接对应的js。对于以下语句对于不同浏览器存在不同的结果:

  <script type="text/javascript" src="aaa.js"></script>

  在ie中。不会等待aaa.js下载并解析完的,会创建另一线程搞定它,而主线程则越过去。但在ff中。则会等待,直到aaa.js下载、解析、执行完毕。

关于javascript的执行情况,请见本文后面所附的参考资料,里面有详尽的讨论。

关于html中页面的生命周期:

  最重要的两个事件就是onLoad、onUnLoad。onLoad在页面加载完毕的时候触发。onUnLoad在页面的dom销毁完后触发。不过,onLoad有点特殊状况,也请参见本文后面所附的参考资料。一定要引起注意。

  我看了几个站点的html源码,发现如下代码:

<div class="ad1602"><script src="/ggjs/view1602_w.js"></script></div>

  这是某网站在页面中显示广告的代码,国内网站,显示广告一般都是用iframe来引入第三方页面,这儿却是直接用javascript段来生成。后来,我又看了163博客生成的html代码,超变态啊。整个html代码只有一个架子,所有页面的生成都是通过js。我看到它的页面后面引入了几个js文件,最后在页面最后还有一个initAll函数的调用。我没有去仔细研究它的js代码,我怀疑它把所有表现层的功能全面放到客户端的js文件中去了。服务器端仅仅是很少的页面架子和许多的webservices。真是叹为观止啊。

关于一个事件触发多个响应函数:

  我曾想过要自己实现一个c#中委托一样的东西。可以让javascript的事件不止是关联到一个function。可以一次触发一个事件列表。这几天研究asp.net ajax,里面对此有封装。

  asp.net ajax中,可以把一个dom元素封装成asp.net ajax中的Sys.UI.DomElement对象。然后就可以用它的方法:addHandler()、addHandlers()、removeHander()来操作事件列表。真是方便啊。当时不大明白这个原理。今天看到后面参考资料中的两段代码让我彻底明白这中间的细节:

  一、使用dom 2中的接口:

  if(document.addEventListener){
    window.addEventListener('load',f,false);
    window.addEventListener('load',f1,false);
    ……
  }else{
    window.attachEvent('onload',f);
    window.attachEvent('onload',f1);
    ……
  }

  原来,dom中早有这个概念了。才晓得。看来,我对dom还是有许多不了解的地方啊。

  二、这个方法就是纯手实现了。请参见下面代码:

function addLoadEvent(func) {

   var oldonload = window.onload;

   if (typeof window.onload != 'function') {

    window.onload = func;

   } else {

     window.onload = function() {

       if (oldonload) {

         oldonload();

       }

       func();

     }

   }

}

这个函数写得很巧妙。利用匿名函数搞定!

参考资料:

javascript 控制优化页面 js 加载顺序

html的加载过程

动态加载外部css或js文件

如何减少网页的内存与CPU占用

Javascript在页面加载时的执行顺序

document.onLoad事件的奇怪现象

javascript中的attachEvent与addEventListener

判断一个变量是否定义的方法

居然有js写的Virtual OS

<think>我们正在讨论的是在CSS文件中添加网络图片的方法。根据之前的交流,用户已经了解了基本方法,现在需要更详细的指导或解决可能的问题。 回顾之前的回答,我们知道: - 在CSS中,使用`background-image: url('完整的图片URL');`来添加网络图片。 - 需要确保URL正确且可公开访问。 现在,用户的问题明确为:在.css文件中添加网络图片的方法。 我们可以这样组织回答: 1. **基本方法**:重申在CSS中通过`url()`函数完整的URL来引用网络图片。 2. **注意事项**:包括URL的写法(引号、协议)、图片的可访问性、跨域问题等。 3. **常见属性**:介绍如何配合其他背景属性(如background-size, repeat等)来调整图片显示。 4. **示例代码**:提供一段在CSS文件中使用网络图片的示例。 5. **问题排查**:如果图片不显示,如何检查(如URL有效性、跨域问题等)。 另外,根据引用[2]中提到的问题:确保文件扩展名正确以及区分大小写,这一点也适用于网络图片的URL。 引用[4]提到使用本地CSS文件,但我们的情况是网络图片,所以不需要考虑Django等框架的特殊处理。 因此,我们可以这样回答: ### 在CSS文件中添加网络图片的详细方法 在CSS文件中添加网络图片,主要通过`background-image`属性实现,将图片的完整URL作为参数传递给`url()`函数。以下是具体步骤注意事项: #### 1. 基本语法 在CSS规则中,使用`background-image: url('图片URL');`来设置背景图片。例如: ```css .element { background-image: url('https://example.com/images/background.jpg'); } ``` - **URL格式**:必须使用完整的URL(包括`http://`或`https://`协议头),且用引号(单引号或双引号均可)包裹。 - **可访问性**:确保该URL在浏览器中可以直接访问(公开资源)。 #### 2. 调整背景图片的显示 通常需要配合其他背景属性来控制图片的显示效果,例如: - `background-size`: 设置图片尺寸(如`cover`、`contain`或具体宽高值)。 - `background-repeat`: 控制重复方式(如`no-repeat`防止重复)。 - `background-position`: 设置图片位置(如`center`居中)。 示例代码: ```css .element { background-image: url('https://example.com/images/background.jpg'); background-size: cover; background-repeat: no-repeat; background-position: center; } ``` #### 3. 注意事项 - **URL正确性**:检查URL是否拼写正确,包括协议、域名、路径文件名。引用[2]中提到,文件扩展名(如`.jpg`或`.png`)必须与实际图片类型匹配,否则可能导致图片无法显示。 - **跨域问题**:如果图片所在的服务器设置了跨域限制(CORS),可能会导致图片无法加载(通常在开发者工具控制台会显示CORS错误)。需要确保图片服务器允许跨域访问,或者在服务器端进行代理。 - **性能考虑**:网络图片加载速度受网络状况图片大小影响,建议优化图片(压缩、使用CDN等)。 - **备用方案**:可以使用`background`缩写属性,但注意顺序(例如:`background: url(...) center/cover no-repeat;`)。 #### 4. 示例:在CSS文件中使用网络图片 假设我们有一个类名为`.banner`的元素,我们要为其设置一个来自网络的背景图片: ```css .banner { width: 100%; height: 300px; background-image: url('https://via.placeholder.com/1200x300'); background-size: cover; background-position: top center; background-repeat: no-repeat; } ``` #### 5. 图片不显示的常见原因及解决 - **URL无效**:在浏览器地址栏中直接输入URL,检查是否能打开图片。 - **扩展名错误**:如引用[2]所述,确保URL中的文件扩展名与实际类型一致(例如,`.jpg`图片不能用`.png`的URL)。 - **跨域限制**:如果是跨域图片,检查控制台是否有CORS错误。如果是第三方图片,可尝试联系服务商或使用代理。 - **缓存问题**:更新URL(如添加版本号`?v=1`)强制浏览器重新加载。 通过以上步骤,您可以在CSS文件中成功添加网络图片。 ### 相关问题 1. 如何解决CSS中网络图片加载失败或跨域问题? 2. 在CSS中使用网络图片本地图片有何性能差异? 3. 如何用CSS滤镜动态调整网络图片的颜色(如引用[^4]中的 `filter` 属性)? </think>### 在CSS文件中添加网络图片的完整指南 在CSS文件中添加网络图片主要通过`background-image`属性实现,以下是具体方法注意事项: #### 方法步骤 1. **使用`background-image`属性** 在CSS选择器中添加图片URL,必须包含完整协议(`https://`或`http://`): ```css .element { background-image: url('https://example.com/images/photo.jpg'); } ``` 2. **搭配常用背景属性**(优化显示效果): ```css .banner { background-image: url('https://via.placeholder.com/1920x1080'); background-size: cover; /* 图片覆盖整个容器 */ background-repeat: no-repeat; /* 禁止重复 */ background-position: center; /* 居中显示 */ background-attachment: fixed; /* 固定背景(视差效果) */ } ``` 3. **多背景图支持**(CSS3): ```css .hero-section { background-image: url('https://example.com/texture.png'), url('https://example.com/overlay.png'); background-blend-mode: multiply; /* 混合模式 */ } ``` #### 关键注意事项 1. **URL有效性验证** - 确保URL在浏览器中可直接访问(复制到地址栏测试) - 检查图片扩展名是否匹配实际类型(`.jpg` ≠ `.png`)[^2] ```css /* 正确示例 */ background-image: url('https://cdn.site.net/image.jpg'); /* 错误示例(缺少协议) */ background-image: url('cdn.site.net/image.jpg'); ``` 2. **跨域问题处理** 遇到图片不显示时: - 检查浏览器控制台的CORS错误 - 在`<img>`标签预加载图片: ```html <img src="https://example.com/image.jpg" style="display:none"> ``` 3. **性能优化技巧** ```css .optimized-image { background-image: url('https://example.com/small.webp'); background-size: contain; /* 添加低质量占位图(LQIP) */ background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9IiNlZWVlZWUiLz48L3N2Zz4='), url('https://example.com/high-res.webp'); } ``` #### 完整示例 ```css /* 网页头部背景图 */ header { background-image: url('https://images.unsplash.com/photo-1715167953132-8b7ece0d757d'); background-size: cover; background-position: center 30%; height: 80vh; position: relative; } /* 卡片悬浮效果 */ .card:hover { background-image: linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)), url('https://example.com/hover-bg.jpg'); transform: translateY(-5px); } /* 响应式适配 */ @media (max-width: 768px) { header { background-image: url('https://example.com/mobile-bg.jpg'); } } ``` #### 常见问题解决 1. **图片不显示** - 检查URL引号是否正确:`url('...')` vs `url(...)` - 验证图片是否被防盗链(尝试直接访问URL) - 使用开发者工具查看网络请求状态(404错误表示路径错误) 2. **动态修改图片** 通过CSS变量实现: ```css :root { --dynamic-bg: url('https://example.com/default.jpg'); } .element { background-image: var(--dynamic-bg); } ``` 在JavaScript中修改: ```js document.documentElement.style.setProperty( '--dynamic-bg', 'url("https://new-image.jpg")' ); ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值