作者 | 汤姆大叔
介绍
在《JavaScript与DOM(上)》一文中,我们介绍了JavaScript的基本内容和DOM对象的各个方面,包括如何访问node节点。本章我们将讲解如何通过DOM操作元素并且讨论浏览器事件模型。
本文参考:http://net.tutsplus.com/tutorials/javascript-ajax/javascript-and-the-dom-lesson-2/
操作元素
在《JavaScript与DOM(上)》一文中,我们提到了DOM节点集合或单个节点的访问步骤,每个DOM节点都包括一个属性集合,大多数的属性都提供为相应的功能提供了抽象。例如,如果有一个带有ID属性intro的文本元素,你可以很容易地通过DOM API来改变该元素的颜色:
document.getElementById('intro').style.color = '#FF0000';
为了理解这个API的功能,我们一步一步分开来看就非常容易理解了:
var myDocument = document;var myIntro = myDocument.getElementById('intro');var myIntroStyles = myIntro.style; // 现在,我们可以设置颜色了: myIntroStyles.color = '#FF0000';
现在,我们有了该文本的style对象的引用了,所以我们可以添加其它的CSS样式:
myIntroStyles.padding = '2px 3px 0 3px';myIntroStyles.backgroundColor = '#FFF';myIntroStyles.marginTop = '20px';
这里我们只是要了基本的CSS属性名称,唯一区别是CSS属性的名称如果带有-的话,就需要去除,比如用marginTop代替margin-top。例如,下面的代码是不工作的,并且会抛出语法错误:
myIntroStyles.padding-top = '10em'; // 产生语法错误:// 在JavaScript里横线-是减法操作符// 而且也没有这样的属性名称
属性可以像数组一样访问,所以利用这个知识我们可以创建一个函数来改变任何给定元素的样式:
function changeStyle(elem, property, val) { elem.style[property] = val; // 使用[]来访问属性}
// 使用上述的函数:var myIntro = document.getElementById('intro'); // 获取intro文本对象changeStyle(myIntro, 'color', 'red');
这仅仅是个例子,所以该函数也许没什么用,语法上来说,直接用还是会快点,例如(elem.style.color = ‘red’)。除了style属性以外,一个节点(或元素)也还有其他很多属性可以操作,如果你使用Firebug,点击DOM选项卡可以看到所有该节点(或元素)的所有属性:
所有的属性都可以通过点标示符来访问(例如:Element.tabIndex)。不是所有的属性都是原始数据类型(strings, numbers, Booleans等等),sytle属性也是一个包含自己属性的对象,很多元素的属性都是只读的,也就是说不能修改他们的值。例如,你不能直接修改一个节点的parentNode属性,如果你修改只读属性的时候浏览器会抛出错误:例如,抛出错误“setting a property that has only a getter”,只是我们需要注意的。
通常DOM操作都是改变原始的内容,这里有几种方式来实现这个,最简单的是使用innerHTML属性,例如:
var myIntro = document.getElementById('intro'); // 替换当前的内容myIntro.innerHTML = 'New content for the amazing paragraph!'; // 添加内容到当前的内容里 myIntro.innerHTML += '... some more content...';
唯一的问题是该方法没在规范里定义,而且在DOM规范里也没有定义,如果你不反感的话请继续使用,因为它比我们下面要讨论其它的方法快多了。
Node节点
通过DOM API创建内容的时候需要注意node节点的2种类型,一种是元素节点,一种是text节点,上一章节已经列出了所有的节点类型,这两种需要我们现在特别注意。创建元素可以通过createElement方法,而创建text节点可以使用createTextNode,相应代码如下:
var myIntro = document.getElementById('intro'); // 添加内容var someText = 'This is the text I want to add'; var textNode = document.createTextNode(someText); myIntro.appendChild(textNode);
这里我们使用了appendChild方法将新text节点附件到文本字段,这样做比非标准的innerHTML方法显得有点长,但了解这些原理依然很重要,这里有一个使用DOM方法的更详细例子:
var myIntro = document.getElementById('intro'); // 添加新连接到文本节点// 首先,创建新连接元素var myNewLink = document.createElement('a'); // myNewLink.href = 'http://google.com'; // myNewLink.appendChild(document.createTextNode('Visit Google')); // Visit Google // 将内容附件到文本节点myIntro.appendChild(myNewLink);
另外DOM里还有一个insertBefore方法用于再节点前面附件内容,通过insertBefore和appendChild我们可以实现自己的insertAfter函数:
// 'Target'是DOM里已经存在的元素// 'Bullet'是要插入的新元素 function insertAfter(target, bullet) { target.nextSibling ? target.parentNode.insertBefore(bullet, target.nextSibling) : target.parentNode.appendChild(bullet); } // 使用了3目表达式: // 格式:条件?条件为true时的表达式:条件为false时的表达式
上面的函数首先检查target元素的同级下一个节点是否存在,如果存在就在该节点前面添加bullet节点,如果不存在,就说明target是最后一个节点了,直接在后面append新节点就可以了。DOM API没有给提供insertAfter是因为真的没必要了——我们可以自己创建。
DOM操作有很多内容,上面你看到的只是其中一部分。
Event事件
浏览器事件是所有web程序的核心,通过这些事件我们定义将要发生的行为,如果在页面里有个按钮,那点击此按钮之前你需要验证表单是否合法,这时候就可以使用click事件,下面列出的最标准的事件列表:
注:正如我们上章所说的,DOM和JavaScript语言是2个单独的东西,浏览器事件是DOM API的一部分,而不是JavaScript的一部分。
鼠标事件
‘mousedown’ – 鼠标设备按下一个元素的时候触发mousedown事件。
‘mouseup’ – 鼠标设备从按下的元素上弹起的时候触发mouseup事件。
‘click’ – 鼠标点击元素的时候触发click事件。
‘dblclick’ – 鼠标双击元素的时候触发dblclick事件。
‘mouseover’ – 鼠标移动到某元素上的时候触发mouseover事件。
‘mouseout’ – 鼠标从某元素离开的时候触发mouseout事件。
‘mousemove’ – 鼠标在某元素上移动但未离开的时候触发mousemove事件。
键盘事件
‘keypress’ – 按键按下的时候触发该事件。
‘keydown’ – 按键按下的时候触发该事件,并且在keypress事件之前。
‘keyup’ – 按键松开的时候触发该事件,在keydown和keypress事件之后。
表单事件
‘select’ – 文本字段(input, textarea等)的文本被选择的时候触发该事件。
‘change’ – 控件失去input焦点的时候触发该事件(或者值被改变的时候)。
‘submit’ – 表单提交的时候触发该事件。
‘reset’ – 表单重置的时候触发该事件。
‘focus’ – 元素获得焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
‘blur’ – 元素失去焦点的时候触发该事件,通常来自鼠标设备或Tab导航。
其它事件
‘load’ – 页面加载完毕(包括内容、图片、frame、object)的时候触发该事件。
‘resize’ – 页面大小改变的时候触发该事件(例如浏览器缩放)。
‘scroll’ – 页面滚动的时候触发该事件。
‘unload’ – 从页面或frame删除所有内容的时候触发该事件(例如离开一个页面)。
还有很多各种各样的事件,上面展示的事件是我们在JavaScript里最常用的事件,有些事件在跨浏览器方面可能有所不同。还有其它浏览器实现的一些属性事件,例如Gecko实现的DOMContentLoaded或DOMMouseScroll等,Gecko的详细事件列表请查看这里。
事件处理
我们将了事件,但是还没有将到如何将处理函数和事件管理起来,使用这些事件之前,你首先要注册这些事件句柄,然后描述该事件发生的时候该如何处理,下面的例子展示了一个基本的事件注册模型:
基本事件注册:
Click me!
// JavaScript: var myElement = document.getElementById('my-button');
// 事件处理句柄: function buttonClick() { alert('You just clicked the button!');}
// 注册事件myElement.onclick = buttonClick;
使用document.getElementById命令,通过ID=my-button获取该button对象,然后创建一个处理函数,随后将该函数赋值给该DOM的onclick属性。就这么简单!
基本事件注册是非常简单的,在事件名称前面添加前缀on作为DOM的属性就可以使用了,这是事件处理的基本核心,但下面的代码我不推荐使用:
Click me!
上述Inline的事件处理方式不利用页面维护,建议将这些处理函数都封装在单独的js文件,原因和CSS样式的一样的。
高级事件注册:
别被标题迷惑了,“高级”不意味着好用,实际上上面讨论的基本事件注册是我们大部分时候用的方式,但有一个限制:不能绑定多个处理函数到一个事件上。这也是我们要讲解该小节原因:
该模型运行你绑定多个处理句柄到一个事件上,也就是说一个事件触发的时候多个函数都可以执行,另外,该模型也可以让你很容易里删除某个已经绑定的句柄。
严格来说,有2中不同的模型:W3C模型和微软模型,除IE之外W3C模型支持所有的现代浏览器,而微软模型只支持IE,使用W3C模型的代码如下:
// 格式:target.addEventListener( type, function, useCapture );// 例子: var myIntro = document.getElementById('intro');myIntro.addEventListener('click', introClick, false);
使用IE模型的代码如下:
// 格式: target.attachEvent ( 'on' + type, function );// 例子: var myIntro = document.getElementById('intro');myIntro.attachEvent('onclick', introClick);
introClick的代码如下:
function introClick() { alert('You clicked the paragraph!');}
事实上,要做出通用的话,我们可以自定义一个函数以支持跨浏览器:
function addEvent(elem, type, fn) { if (elem.attachEvent) { elem.attachEvent('on' + type, fn); return; } if (elem.addEventListener) { elem.addEventListener(type, fn, false); }}
该函数首先检查attachEvent和addEventListener属性,谁可以就用谁,这两种类型的模型都支持删除句柄功能,参考下面的removeEvent函数。
function removeEvent(elem, type, fn) { if (elem.detachEvent) { elem.detachEvent('on' + type, fn); return; } if (elem.removeEventListener) { elem.removeEventListener(type, fn, false); }}
你可以这样使用:
var myIntro = document.getElementById('intro');addEvent(myIntro, 'click', function () { alert('YOU CLICKED ME!!!');});
注意到我们传入了一个匿名函数作为第三个参数,JavaScript运行我们定义和执行匿名函数,这种匿名函数特别适合作为参数传递,实际上我们也可以传递有名的函数(代码如下),但是你们函数更容易做。
如果你只想在第一次click的时候触发一个函数,你可以这么做:
// 注意:前提是我们已经定于好了addEvent/removeEvent函数// (定义好了才能使用哦)var myIntro = document.getElementById('intro');addEvent(myIntro, 'click', oneClickOnly);
function oneClickOnly() { alert('WOW!'); removeEvent(myIntro, 'click', oneClickOnly);}
当第一次触发以后,我们就立即删除该句柄,但是有匿名函数的话却很难将自身的引用删除,不过实际上可以通过如下的形式来做(只不过有点麻烦):
addEvent(myIntro, 'click', function () { alert('WOW!'); removeEvent(myIntro, 'click', arguments.callee);});
这里我们是有了arguments对象的callee属性,arguments对象包含了所有传递进来的参数以及该函数自身(callee),这样我们就可以放心地删除自身的引用了。 关于W3C和微软模型还有其他的少许差异,比如this,在触发事件的时候函数中的this一般都是该元素上下文,,也就说this引用该元素自身,在基本事件注册和W3C模型中都没有问题,但在微软模型的实现里却可能出错,请参考如下代码:
function myEventHandler() { this.style.display = 'none';}
// 正常工作,this是代表该元素myIntro.onclick = myEventHandler;
// 正常工作,this是代表该元素myIntro.addEventListener('click', myEventHandler, false);
// 不正常,这时候的this是代表Window对象myIntro.attachEvent('onclick', myEventHandler);
这里有一些方式可以避免这个问题,最简单的方式是使用前面的基本事件注册方式,或者是再做一个通用的addEvent,通用代码请参考John Resig或Dean Edward的文章。
Event对象
另外一个非常重要的内容是Event对象,当事件发生的时候出发某个函数,该Event对象将自动在函数内可用,该对象包含了很多事件触发时候的信息,但IE却没有这么实现,而是自己实现的,IE浏览器是通过全局对象window下的event属性来包含这些信息,虽然不是大问题,但我们也需要注意一下,下面的代码是兼容性的:
function myEventHandler(e) {
// 注意参数e // 该函数调用的时候e是event对象(W3C实现)
// 兼容IE的代码 e = e || window.event;
// 现在e就可以兼容各种浏览器了
}
// 这里可以自由地绑定事件了
这里判断e对象(Event对象)是否存在我们使用了OR操作符:如果e不存在(为null, undefined,0等)的时候,将window.event赋值给e,否则的话继续使用e。通过这方式很快就能在多浏览器里得到真正的Event对象,如果你不喜欢这种方式的话,你可以使用if语句来处理:
if (!e) { e = window.event;} // 没有else语句,因为e在其它浏览器已经定义了
另外Event对象下的命令和属性都很有用,遗憾的是不不能全兼容浏览器,例如当你想取消默认的行为的时候你可以使用Event对象里的preventDefault()方法,但IE里不得不使用对象的returnValue属性值来控制,兼容代码如下:
function myEventHandler(e) { e = e || window.event; // 防止默认行为 if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; }}
例如,当你点击一个连接的时候,默认行为是导航到href里定义的地址,但有时候你想禁用这个默认行为,通过returnValue和preventDefault就可以实现,Event对象里的很多属性在浏览器里都不兼容,所以很多时候需要处理这些兼容性代码。
注意:现在很多JS类库都已经封装好了e.preventDefault代码,也就是说在IE里可用了,但是原理上依然是使用returnValue来实现的。
事件冒泡
事件冒泡,就是事件触发的时候通过DOM向上冒泡,首先要知道不是所有的事件都有冒泡。事件在一个目标元素上触发的时候,该事件将触发一一触发祖先节点元素,直到最顶层的元素:
如图所示,如果a连接被点击,触发触发连接的click事件,然后触发p的click事件,以此再触发div和body的click事件。顺序不变,而且不一定是在同时触发的。 这样你就可以利用该特性去处理自己的逻辑了,并且再任何时候都可以停止冒泡,比如,如果你只想冒泡到文本节点上,而不再进一步冒泡,你可以在p的click事件处理函数里丁停止冒泡:
function myParagraphEventHandler(e) {
e = e || window.event;
// 停止向上冒泡 if (e.stopPropagation) { // W3C实现 e.stopPropagation(); } else { // IE实现 e.cancelBubble = true; }
}
// 使用我们自定义的addEvent函数将myParagraphEventHandler绑定到click事件上:addEvent(document.getElementsByTagName('p')[0], 'click', myParagraphEventHandler);
事件委托
举例来说,如果你有一个很多行的大表格,在每个
上绑定点击事件是个非常危险的想法,因为性能是个大问题。流行的做法是使用事件委托。事件委托描述的是将事件绑定在容器元素上,然后通过判断点击的target子元素的类型来触发相应的事件。
var myTable = document.getElementById('my-table');
myTable.onclick = function () {
// 处理浏览器兼容 e = e || window.event; var targetNode = e.target || e.srcElement;
// 测试如果点击的是TR就触发 if (targetNode.nodeName.toLowerCase() === 'tr') { alert('You clicked a table row!'); }
}
事件委托依赖于事件冒泡,如果事件冒泡到table之前被禁用的话,那上面的代码就无法工作了。
总结
本文我们覆盖到了DOM元素的操作以及相关的浏览器事件模型,希望大家能对DOM有了进一步的了解。有任何问题,请留言讨论。
你可能感兴趣的:(java,javascript,css,js,vue)
Node.js 中文编码问题全解析
skinGap
node.js Jenkins android-studio
Node.js中文编码问题全解析问题背景在Node.js中执行Gradle命令时遇到中文输出乱码问题。这个问题涉及Windows系统、Java进程和Node.js三个层面的编码处理。问题分析最初的错误代码gradleProcess.stdout.setEncoding('utf-8');//错误:假设输出是UTF-8编码gradleProcess.stdout.on('data',(data)=>
日志采集框架filebeat
躲在没风的地方
linux 日志采集框架 服务器 linux elasticsearch filebeat logstash
日志采集框架1filebeat和logstash比较filebeat比logstash更小巧,更简洁一些,但是功能上logstash更强大logstash(用java编写的)用于ELK中,也是用来采集传输数据的,比较浪费资源。完全可以将logstash替换为filebeat,形式EFK体系。filebeat(elastic公司)特点(1)异常中断重启后会继续上次停止的位置(通过${filebeat
web前端三大主流框架
109702008
人工智能 编程 前端框架 人工智能
Claude3OpusWeb前端开发中,目前有三个主流的框架:1.React:React是由Facebook开发的一款JavaScript库,用于构建用户界面。它采用组件化的开发模式,将界面拆分成多个独立且可复用的组件,使开发和维护更加高效。React的核心思想是虚拟DOM(VirtualDOM)和单向数据流,通过高效的DOMdiff算法进行页面更新,提供出色的性能和用户体验。2.Angular:
【前端】Electron入门开发教程,从介绍Electron到基础引用以及部分深度使用,附带常见的十个报错问题的解决方案和代码优化。
爱上大树的小猪
前端 electron javascript
Electron是一个使用JavaScript、HTML和CSS等Web技术创建跨平台桌面应用程序的框架。它结合了Chromium渲染引擎和Node.js运行时,允许开发者构建高质量的桌面应用。下面是一个简要的Electron开发教程,从基础到深入,并包括一些常见的报错问题及其解决方案。一、介绍ElectronElectron能够使用前端技术栈开发桌面应用,支持Windows、macOS和Linu
JSON( JSON基础,ESP8266 JSON解析)ESP8266通过JSON实现物联网数据通讯( ESP8266客户端请求JSON信息, ESP8266客户端发送JSON信息)
@@庆
json 物联网 esp8266 嵌入式硬件
JSONJSON基础JSON(JavaScriptObjectNotation)是一种通用的轻量级数据交换文本格式。它很容易让人阅读和编写,也便于机器进行解析和生成。它使用JavaScript语法来存储和描述数据对象,但是JSON完全独立于JavaScript。JSON可适用于多种流行编程语言。这些特性使JSON成为理想的数据交换格式。数据以“名”“值”对呈现数据“名”和“值”之间由冒号分隔大括号
cesium 源码修改 支持ArcGIS 服务属性过滤
yanasdf789
cesium javascript
@[TOC]#前言功能效果:在cesium中加载arcgis矢量服务,使其通过字段定义过滤图形,如objectid>100,在ArcGISforjs中可以有现成的定义参数definitionExpression,ceisumz必须修改源码#一、比对URLarcgisapiforjs请求:http://localhost:6080/arcgis/rest/services/02_01_2019_ot
Redis从入门到超神-(六)SpringCache操作缓存
乖巧程序员
Redis从入门到超神 缓存 redis 数据库
引言java操作Redis有很多中方案,Jedis,SpringBootDataRedis,Redisson等,本篇文章的目的是使用SpringBootDataRedis整合SpringCache基于Redis实现缓存操作一、SpringBoot整合Redis实现缓存SpringBoot提供了整合Redis的方案,我们使用spring-boot-starter-data-redis包就可以很方便的
低代码产品表单渲染架构
露临霜
低代码 低代码
在React和Vue没有流行起来的时候,低代码产品的表单渲染设计通常会使用操作Dom的方式实现。下面是一个表单的例子:产品层用户通过打开表单,使用不同业务场景业务下的表单页面,中间的Render层就是技术实现。每一个不同业务的表单页面就是低代码产品中的一个元素。技术层渲染层的核心在于View和Controller,现代基于框架实现一般是MVVM的实现。上面是基于传统的前端框架实现(Jquery),
网络爬虫爬取动态网页数据
db_sqy_2012
爬虫
目录一、导学与指南豆瓣单页分析豆瓣多页输出二、理论学习1.抓取动态网页的技术2.Selenium和WebDriver的安装与配置3.Selenium的基本使用三、小结一、导学与指南豆瓣单页分析importjsonimportrequests#基础URL不顶事了url_base="https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%
核心线程数和最大线程数设置参考标准【Java】
松树戈
实用配置 java 开发语言
核心线程数和最大线程数设置参考标准【Java】首先确定Java线程是什么态的?Java的线程是用户态+内核态,而内核态线程通过操作系统来调用,最终的可用线程数与操作系统的核数相关【如果设置了太多,很多是无效线程】一个设计标准:根据当前业务是IO密集型还是CPU密集型,设置核心线程数CPU密集型:核心线程数=CPU核数+1【机器学习、视频转码】IO密集型:核心线程数=CPU核数*2【Web应用】Ja
Vue 3.0打造响应式用户界面的新方式
随风九天
Vue六脉神剑 性能九阴白骨爪 前端 vue.js 前端 响应式
1简介Vue.js是一个用于构建用户界面的渐进式框架。Vue3.0是其最新版本,引入了许多新特性和改进,使得开发者能够更高效地构建响应式的Web应用程序。本文将带你深入了解如何使用Vue3.0来打造响应式用户界面,并通过实际案例和代码示例帮助你快速上手。2环境搭建要开始学习Vue3.0,首先需要安装Node.js和npm。然后可以通过以下命令全局安装@vue/cli:npminstall-g@vu
js-mdict 项目教程
符汝姿
js-mdict项目教程js-mdict*.mdx/*.mddinterpreterjsimplements,supportmdictindexfile项目地址:https://gitcode.com/gh_mirrors/js/js-mdict1.项目的目录结构及介绍js-mdict/├──dist/│├──index.js│└──...├──src/│├──index.ts│├──mdict.
GitHub热门开源项目
李小白杂货铺
计算机技术杂谈 github
文章目录GitHub高级搜索GitHub秘籍GitHub开源项目排行榜热门开源项目学习类、资料类freeCodeCampfree-programming-bookscoding-interview-universityawesomedeveloper-roadmapsystem-design-primerYou-Dont-Know-JSCS-Notesjavascript-algorithmsbu
【每日一道算法题】Leetcode之decode-ways解码方式问题 Java 动态规划
佛系宅女
leetcode 算法
91.leetcode题目描述:一条仅包含字母‘A’-‘Z’的消息用下列的方式加密成数字‘A’->1‘B’->2…‘Z’->26现在给出加密成数字的密文,请判断有多少种解密的方法例如:给出的密文为“12”,可以解密为"AB"(12)或者"L"(12).所以密文"12"的解密方法是2种.importjava.util.*;publicclassSolution{publicintnumDecodin
Github 2025-01-12 php开源项目日报 Top10
老孙正经胡说
github php 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2025-01-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量PHP项目10JavaScript项目1Shell项目1SymfonyPHP框架和组件创建周期:5130天开发语言:PHP协议类型:MITLicenseStar数量:28999个Fork数量:9440次关注人数:28999人贡献人数:368人Open
Github 2025-01-28 Python开源项目日报 Top9
老孙正经胡说
github python 开发语言 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2025-01-28统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量Python项目9Rust项目1ComfyUI:强大而模块化的稳定扩散GUI创建周期:399天开发语言:Python,JavaScript协议类型:GNUGeneralPublicLicensev3.0Star数量:25663个Fork数量:2741次
Github 2024-08-18 php开源项目日报 Top10
老孙正经胡说
github php 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2024-08-18统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量PHP项目10Shell项目1Blade项目1JavaScript项目1SecLists-安全测试人员的伴侣创建周期:4375天开发语言:PHP协议类型:MITLicenseStar数量:52010个Fork数量:23569次关注人数:52010人贡
Github 2024-07-14 php开源项目日报 Top10
老孙正经胡说
github php 开源 Github趋势分析 开源项目 Python Golang
根据GithubTrendings的统计,今日(2024-07-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下:开发语言项目数量PHP项目10CSS项目1SymfonyPHP框架和组件创建周期:5130天开发语言:PHP协议类型:MITLicenseStar数量:28999个Fork数量:9440次关注人数:28999人贡献人数:368人OpenIssues数量:846个Gi
初识CSS
大耳朵图图!
总结 心得 css
一.初识css1.什么是cssCascadingStyleSheet:层叠样式表,简称样式表。作用:实现网页布局,美化网页2.css的特性表现层和结构层完全分离,符合web标准便于团队开发(视觉设计师和内容编辑分离)便于网站的更新升级,维护性好用户体验好,网站性能高能够适应不同的显示设备二.CSS基本语法1.引入css的三种方法(1)行内样式就是直接在标签的开始标签中,使用style属性,如下:
.cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?
程序员小迷
编程语言 小话c语言 Java c语言 开发语言 java swift objective-c c++ 扩展名
.cc扩展名是什么语言?.cc是C++语言使用的扩展名,一种说法是它是cwithclass的简写,当然C++语言使用的扩展名不止.cc和.cpp,还包含.cxx,.c++,.C等,这些在不同编译器系统采用的默认设定不同,需要区分使用。当然,编译器提供编译选项将源代码指定为特定编程语言的方式,例如gcc提供-xc++将源代码指定为c++代码,哪怕源代码扩展名是.java也会被当做c++代码。关于.c
CSS中的响应式布局初识
匹马夕阳
css集锦 css 前端
响应式布局是一种Web设计方法,使网站能够在各种设备(如台式电脑、平板电脑、手机等)上有良好的显示效果。响应式布局通常使用CSS媒体查询来调整页面布局以适应不同的屏幕尺寸和分辨率。下面我将通过一个简单的示例来讲解如何实现响应式布局。示例场景假设我们要创建一个简单的Web页面,它包含一个标题和两个并排的内容区域。在较大的屏幕上,内容区域将并排显示;在较小的屏幕上,内容区域将堆叠显示。HTML代码首先
LeetCode刷题第九天(994. 腐烂的橘子)
隰有扶苏丶
leetcode java 算法 python 数据结构
文章目录题目描述广度深度优先解法JAVA代码算法复杂度题目描述在给定的网格中,每个单元格可以有以下三个值之一:值0代表空单元格;值1代表新鲜橘子;值2代表腐烂的橘子。每分钟,任何与腐烂的橘子(在4个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回-1。示例1:输入:[[2,1,1],[1,1,0],[0,1,1]]输出:4示例2:输入:[[
深入浅出:Node.js高级重试机制
前端
在分布式系统中,优雅地处理异常是构建可靠应用程序的关键。无论是网络抖动、服务暂时不可用,还是数据库连接超时,这些短暂的故障都可能让系统陷入混乱。而重试模式,作为一种经典的设计模式,正是解决这些问题的利器。今天,我们将深入探讨如何在Node.js中实现高级重试机制,并分享一些实用的策略和最佳实践。什么是重试模式?重试模式是一种用于提高系统稳定性的设计模式。它的核心思想是:在面对短暂的故障时,不要轻易
刷题前必学!栈与队列!用JavaScript学数据结构与算法
JavaScript数据结构与算法-HowieCong务必要熟悉JavaScript使用再来学!一、数组增删操作在了解栈和队列前,明确数组中的增删操作具有什么样的特性、对应的方法有哪些:灵活增删的数组数组增加元素的三种方法:unshift方法,添加元素到数组的头部constarr=[1,2]arr.unshift(0)//[0,1,2]push方法,添加元素到数组的尾部constarr=[1,2
Android OkHttp使用和源码详解
2401_85729264
android okhttp
本文使用的OkHttp的版本为3.14.2,不是不会接入高版本,主要是4.0.x版本已经全部由java替换到了Kotlin,Kotlin不太熟怕理解错了,误导人民群众。dependencies{//本文使用implementation‘com.squareup.okio:okio:1.15.0’implementation‘com.squareup.okhttp3:okhttp:3.14.2’//
Vue全流程--Vue2组件的理解第二部分
不清参
Vue全流程 vue.js javascript 前端
组件命名规则好的命名规则可以省去很多不必要的麻烦,这个好习惯还是要养成的一个单词组成:第一种写法(首字母小写):school第二种写法(首字母大写):School多个单词组成:第一种写法(kebab-case命名):my-school第二种写法(CamelCase命名):MySchool(需要Vue脚手架支持)备注:(1).组件名尽可能回避HTML中已有的元素名称,例如:h2、H2都不行。(2).
elasticsearch的常见面试题?
Dusk_橙子
K8S elasticsearch 运维 linux
在面试过程中除去各个公司的不同服务架构之外,也会存在一些普遍大众的面试点,以下将会从三个维度进行介绍。基础知识类elasticsearch和数据库之间区别?elasticsearch:面向文档,数据以文档的形式存储,即JSON格式的对象。更强调数据的搜索、索引和分析。数据库:更侧重于事务处理、数据的严格结构化和完整性,适用于关系复杂、数据一致性要求高的业务场景。elasticsearch和核心组件
Java基础入门day55
zpz2001
java hive 开发语言
day55过滤器简介过滤器filter,是处于客户端与服务器端目标资源之间的一道过滤技术技术作用执行地位在servlet之前,客户发送请求时,会先经过Filter,再到达目标Servlet中。相应时,会根据执行流程再次反向执行Filter可以解决多个Servlet共性代码的冗余问题编写新增一个类,实现Filter接口编写其生命周期方法再doFilter当中实现过滤方法packagecom.saas
Java基础入门-Day1
weixin_45795542
JAVA JAVA基础入门-Day1
Java基础入门-Day1JAVA开发入门特点分类Java字节执行方式JDK的使用Java垃圾回收机制Java编译JAVA开发入门Java是一种高级计算机语言。他是由Sun公司(已被Oracle公司于2009年4月20日收购)于1995年5月推出的一种可以编写跨平台应用软件丶完全面向对象的程序设计语言。特点资源免费跨平台健壮,安全高性能简单面向对象动态性多线程分类Java针对不同的开发市场,Sun
VSCode:deepspeed调试【.vscode/launch.json配置】
u013250861
图神经网络 # LLM/训练 vscode ide 编辑器
在控制台利用whichdeepspeed找到deepspeed路径:/home/wyr/anaconda3/envs/rlhf/bin/deepspeed{//使用IntelliSense了解相关属性。//悬停以查看现有属性的描述。//欲了解更多信息,请访问:https://go.microsoft.com/fwlink/?linkid=830387"version":"0.2.0","confi
关于旗正规则引擎规则中的上传和下载问题
何必如此
文件下载 压缩 jsp 文件上传
文件的上传下载都是数据流的输入输出,大致流程都是一样的。
一、文件打包下载
1.文件写入压缩包
string mainPath="D:\upload\"; 下载路径
string tmpfileName=jar.zip; &n
【Spark九十九】Spark Streaming的batch interval时间内的数据流转源码分析
bit1129
Stream
以如下代码为例(SocketInputDStream):
Spark Streaming从Socket读取数据的代码是在SocketReceiver的receive方法中,撇开异常情况不谈(Receiver有重连机制,restart方法,默认情况下在Receiver挂了之后,间隔两秒钟重新建立Socket连接),读取到的数据通过调用store(textRead)方法进行存储。数据
spark master web ui 端口8080被占用解决方法
daizj
8080 端口占用 spark master web ui
spark master web ui 默认端口为8080,当系统有其它程序也在使用该接口时,启动master时也不会报错,spark自己会改用其它端口,自动端口号加1,但为了可以控制到指定的端口,我们可以自行设置,修改方法:
1、cd SPARK_HOME/sbin
2、vi start-master.sh
3、定位到下面部分
oracle_执行计划_谓词信息和数据获取
周凡杨
oracle 执行计划
oracle_执行计划_谓词信息和数据获取(上)
一:简要说明
在查看执行计划的信息中,经常会看到两个谓词filter和access,它们的区别是什么,理解了这两个词对我们解读Oracle的执行计划信息会有所帮助。
简单说,执行计划如果显示是access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引),而filter表示谓词条件的值并不会影响数据访问路径,只起到
spring中datasource配置
g21121
dataSource
datasource配置有很多种,我介绍的一种是采用c3p0的,它的百科地址是:
http://baike.baidu.com/view/920062.htm
<!-- spring加载资源文件 -->
<bean name="propertiesConfig"
class="org.springframework.b
web报表工具FineReport使用中遇到的常见报错及解决办法(三)
老A不折腾
finereport FAQ 报表软件
这里写点抛砖引玉,希望大家能把自己整理的问题及解决方法晾出来,Mark一下,利人利己。
出现问题先搜一下文档上有没有,再看看度娘有没有,再看看论坛有没有。有报错要看日志。下面简单罗列下常见的问题,大多文档上都有提到的。
1、repeated column width is largerthan paper width:
这个看这段话应该是很好理解的。比如做的模板页面宽度只能放
mysql 用户管理
墙头上一根草
linux mysql user
1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户mysql> insert into mysql.user(Host,User,Password) values(‘localhost’,'jeecn’,password(‘jeecn’));//刷新系统权限表mysql>flush privileges;这样就创建了一个名为:
关于使用Spring导致c3p0数据库死锁问题
aijuans
spring Spring 入门 Spring 实例 Spring3 Spring 教程
这个问题我实在是为整个 springsource 的员工蒙羞
如果大家使用 spring 控制事务,使用 Open Session In View 模式,
com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.
百度词库联想
annan211
百度
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RunJS</title&g
int数据与byte之间的相互转换实现代码
百合不是茶
位移 int转byte byte转int 基本数据类型的实现
在BMP文件和文件压缩时需要用到的int与byte转换,现将理解的贴出来;
主要是要理解;位移等概念 http://baihe747.iteye.com/blog/2078029
int转byte;
byte转int;
/**
* 字节转成int,int转成字节
* @author Administrator
*
简单模拟实现数据库连接池
bijian1013
java thread java多线程 简单模拟实现数据库连接池
简单模拟实现数据库连接池
实例1:
package com.bijian.thread;
public class DB {
//private static final int MAX_COUNT = 10;
private static final DB instance = new DB();
private int count = 0;
private i
一种基于Weblogic容器的鉴权设计
bijian1013
java weblogic
服务器对请求的鉴权可以在请求头中加Authorization之类的key,将用户名、密码保存到此key对应的value中,当然对于用户名、密码这种高机密的信息,应该对其进行加砂加密等,最简单的方法如下:
String vuser_id = "weblogic";
String vuse
【RPC框架Hessian二】Hessian 对象序列化和反序列化
bit1129
hessian
任何一个对象从一个JVM传输到另一个JVM,都要经过序列化为二进制数据(或者字符串等其他格式,比如JSON),然后在反序列化为Java对象,这最后都是通过二进制的数据在不同的JVM之间传输(一般是通过Socket和二进制的数据传输),本文定义一个比较符合工作中。
1. 定义三个POJO
Person类
package com.tom.hes
【Hadoop十四】Hadoop提供的脚本的功能
bit1129
hadoop
1. hadoop-daemon.sh
1.1 启动HDFS
./hadoop-daemon.sh start namenode
./hadoop-daemon.sh start datanode
通过这种逐步启动的方式,比start-all.sh方式少了一个SecondaryNameNode进程,这不影响Hadoop的使用,其实在 Hadoop2.0中,SecondaryNa
中国互联网走在“灰度”上
ronin47
管理 灰度
中国互联网走在“灰度”上(转)
文/孕峰
第一次听说灰度这个词,是任正非说新型管理者所需要的素质。第二次听说是来自马化腾。似乎其他人包括马云也用不同的语言说过类似的意思。
灰度这个词所包含的意义和视野是广远的。要理解这个词,可能同样要用“灰度”的心态。灰度的反面,是规规矩矩,清清楚楚,泾渭分明,严谨条理,是决不妥协,不转弯,认死理。黑白分明不是灰度,像彩虹那样
java-51-输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
bylijinnan
java
public class PrintMatrixClockwisely {
/**
* Q51.输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9
mongoDB 用户管理
开窍的石头
mongoDB用户管理
1:添加用户
第一次设置用户需要进入admin数据库下设置超级用户(use admin)
db.addUsr({user:'useName',pwd:'111111',roles:[readWrite,dbAdmin]});
第一个参数用户的名字
第二个参数
[游戏与生活]玩暗黑破坏神3的一些问题
comsci
生活
暗黑破坏神3是有史以来最让人激动的游戏。。。。但是有几个问题需要我们注意
玩这个游戏的时间,每天不要超过一个小时,且每次玩游戏最好在白天
结束游戏之后,最好在太阳下面来晒一下身上的暗黑气息,让自己恢复人的生气
&nb
java 二维数组如何存入数据库
cuiyadll
java
using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
namespace WindowsFormsApplication1
{
本地事务和全局事务Local Transaction and Global Transaction(JTA)
darrenzhu
java spring local global transaction
Configuring Spring and JTA without full Java EE
http://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/
Spring doc -Transaction Management
http://docs.spring.io/spri
Linux命令之alias - 设置命令的别名,让 Linux 命令更简练
dcj3sjt126com
linux alias
用途说明
设置命令的别名。在linux系统中如果命令太长又不符合用户的习惯,那么我们可以为它指定一个别名。虽然可以为命令建立“链接”解决长文件名的问 题,但对于带命令行参数的命令,链接就无能为力了。而指定别名则可以解决此类所有问题【1】。常用别名来简化ssh登录【见示例三】,使长命令变短,使常 用的长命令行变短,强制执行命令时询问等。
常用参数
格式:alias
格式:ali
yii2 restful web服务[格式响应]
dcj3sjt126com
PHP yii2
响应格式
当处理一个 RESTful API 请求时, 一个应用程序通常需要如下步骤 来处理响应格式:
确定可能影响响应格式的各种因素, 例如媒介类型, 语言, 版本, 等等。 这个过程也被称为 content negotiation。
资源对象转换为数组, 如在 Resources 部分中所描述的。 通过 [[yii\rest\Serializer]]
MongoDB索引调优(2)——[十]
eksliang
mongodb MongoDB索引优化
转载请出自出处:http://eksliang.iteye.com/blog/2178555 一、概述
上一篇文档中也说明了,MongoDB的索引几乎与关系型数据库的索引一模一样,优化关系型数据库的技巧通用适合MongoDB,所有这里只讲MongoDB需要注意的地方 二、索引内嵌文档
可以在嵌套文档的键上建立索引,方式与正常
当滑动到顶部和底部时,实现Item的分离效果的ListView
gundumw100
android
拉动ListView,Item之间的间距会变大,释放后恢复原样;
package cn.tangdada.tangbang.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import andr
程序员用HTML5制作的爱心树表白动画
ini
JavaScript jquery Web html5 css
体验效果:http://keleyi.com/keleyi/phtml/html5/31.htmHTML代码如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="UTF-8" >
<ti
预装windows 8 系统GPT模式的ThinkPad T440改装64位 windows 7旗舰版
kakajw
ThinkPad 预装 改装 windows 7 windows 8
该教程具有普遍参考性,特别适用于联想的机器,其他品牌机器的处理过程也大同小异。
该教程是个人多次尝试和总结的结果,实用性强,推荐给需要的人!
缘由
小弟最近入手笔记本ThinkPad T440,但是特别不能习惯笔记本出厂预装的Windows 8系统,而且厂商自作聪明地预装了一堆没用的应用软件,消耗不少的系统资源(本本的内存为4G,系统启动完成时,物理内存占用比
Nginx学习笔记
mcj8089
nginx
一、安装nginx 1、在nginx官方网站下载一个包,下载地址是:
http://nginx.org/download/nginx-1.4.2.tar.gz
2、WinSCP(ftp上传工
mongodb 聚合查询每天论坛链接点击次数
qiaolevip
每天进步一点点 学习永无止境 mongodb 纵观千象
/* 18 */
{
"_id" : ObjectId("5596414cbe4d73a327e50274"),
"msgType" : "text",
"sendTime" : ISODate("2015-07-03T08:01:16.000Z"
java术语(PO/POJO/VO/BO/DAO/DTO)
Luob.
DAO POJO DTO po VO BO
PO(persistant object) 持久对象
在o/r 映射的时候出现的概念,如果没有o/r映射,就没有这个概念存在了.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数据库的操作.
VO(value object) 值对象
通
算法复杂度
Wuaner
Algorithm
Time Complexity & Big-O:
http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o
http://bigocheatsheet.com/
http://www.sitepoint.com/time-complexity-algorithms/