DOM

1.编写JS脚本程序

JS在网页中通常被嵌入到HTML文档中,在HTML中,JS代码需要被放入标签之中,JS代码可以嵌入到和部分
标签中的内容会优先于中的内容被加载,建议将script标签中的内容放置在结束标签之后,这样,程序会优先加载页面然后加载JS脚本,否则,先加载脚本会产生延迟。如果JS脚本内容较小,或者是某些版本检测内容(检测当前浏览器是否支持某个函数),则建议放在标签之中,因为其会被优先加载,以便进行某些处理。

  1. document.write(string)
    该方法用于在HTML页面中打印字符串,其还可以打印HTML代码,你几乎可以使用该方法输出所有的HTML元素,部分的script框架采用该方法输出HTML页面。document.write()方法大多只用于调试。
  <head> </head>
  <body>
    <script>
      document.write("Hello World!");
      //or
   	//document.write("<i>Hello World</i>");
    </script>
  </body>
</html> 

提示:

  • innerHTML, used to manipulate HTML elements.
  • document.write(), used for testing purpose.
  • console.log(), used for debugging in browser console.
  • window.alert(), is used to pop-up a message or something else.
  1. <script>
    参数:language,type,两者共同指定script的类型(language属性已经被弃用,应该尽量避免使用他)
<script language="javascript" type="text/javascript">
...
</script>

   因为JS作为默认的脚本执行语言,通常情况下,type属性,也不是必须的。

  1. <noscript>
    当客户端浏览器不支持script时,其中的内容会被打印并执行。

  2. alert(string)
    该方法弹出一个提示框。

  3. JS脚本也可以被单独额外的放在另一个.js文件中(该脚本中不应该包含<script>标签,因为该标签不会被加载),通常情况下,这么做会增加代码的可读性和可复用性 。
    通过使用src属性(表示外部脚本的文件地址)在HTNL中y引入一个外部脚本:

<html>
   <head>
     <title> </title>
     <script src="demo.js"></script>
   </head>
   <body>
   </body>
</html>
  1. 使用**//或者/*…*/**注释代码。
HTML<!- -…- -> 该注释会被发送到客户端,即用户在调试端可以看到
JSP<%-- --%> 该注释不会被发送到客户端
  1. JS关键字:

在这里插入图片描述

2. DOM

  1. 定义
  2. 节点有父节点,子节点,兄弟节点
    在这里插入图片描述
    上图中
    <html> 有两个子节点
    <head> 有一个子节点一个父节点
    <title> 有一个父节点,没有子节点
    <body> 有两个子节点一个父节点
    如下:
    <p>即是<body>的子节点,<h1>的父节点
<body>
  <p>
    <h1>Hi</h1>
  </p>
</body>
  1. document对象
    document是JS中的一个预定义对象,可以被用于访问基于DOM的所有元素,换句话说,document是你网页中所有其他对象的所有者(或者说根),所以你可以通过document访问网页中的所有其他对象并进行修改,如:
document.body.innerHTML = "Some text";
  1. 查找对象
    在DOM模型中,所有的HTML元素都是对象,并且所有的对象都有相应的属性和方法。document提供了特定方法同于查找对应元素,进而修改元素属性
  • document.getElementById(id) 该方法通过ID查找特定元素,并返回匹配到的对象。
  • document.getElementsByClassName(name) 通过类名(class name)查找,该方法有可能匹配到多个对象,若匹配到多个对象,则返回匹配到的所有对象组成的数组
  • document.getElementsByTagName(name) 通过标签名(tag name)查找,该方法也可能匹配多个对象,并返回一个数组。
var elem = document.getElementById("demo");
elem.innerHTML = "Hello World!";

var arr =  document.getElementsByClassName("demo");
//accessing the second element
arr[1].innerHTML = "Hi";

<p>hi</p>
<p>hello</p>
<p>hi</p>
<script>
var arr = document.getElementsByTagName("p");
for (var x = 0; x < arr.length; x++) {
  arr[x].innerHTML = "Hi there";
}
</script>

  • element.childNodes 返回所有子节点组成的数组
  • element.firstChild 返回第一个子节点
  • element.lastChild 返回最后一个子节点
  • element.hasChildNodes 返回true如果element拥有任何一个子节点
  • element.nextSibling 返回下一个兄弟节点
  • element.previousSibling 返回上一个兄弟节点
  • element.parentNode 返回父节点
<html>
  <body>
    <div id ="demo">
      <p>some text</p>
      <p>some other text</p>
    </div>

    <script>
     var a = document.getElementById("demo");
     var arr = a.childNodes;
     for(var x=0;x<arr.length;x++) {
       arr[x].innerHTML = "new text";				<!--修改标签文本-->
     }
    </script>

  </body>
</html>
  1. 修改对象属性
  • 事实上可以通过(JS)DOM修改元素的所有属性
<img id="myimg" src="orange.png" alt="" />
<script>
var el = document.getElementById("myimg");
el.src = "apple.png";
</script>
<a href="http://www.example.com">Some link</a>
<script>
var el = document.getElementsByTagName("a");
el[0].href = "http://www.sololearn.com";
</script>
  • 通过style对象修改HTML标签样式,style对象可以访问所有外观属性。
    所有的CSS属性都可以被JS设置和定义,不要在属性名中使用“-”符号,使用驼峰标识代替表示。
<div id="demo" style="width:200px">some text</div>
<script>
  var x = document.getElementById("demo");
  x.style.color = "6600FF";
  x.style.width = "100px";
</script>
  1. 创建节点
  • element.cloneNode() 克隆一个元素并且返回一个节点
  • document.creatElement(element) 新建一个节点,elemen是标签名称
  • document.createTextNode(txt) 新建一个文本节点,它不会自己显示在网页上,除非将他添加到一个已知的元素上
    也可以通过如下方法避免创建一个文本节点,而选择直接将其插入到一个元素中
<script>
var p=document.createElement("p");
p.innerHTML="Some new text";
var div = document.getElementById("demo");
div.appendChild(p);
</script>

innerHTML和createTextNode之间的区别在于:后者对文本进行转义,而前者将完全按照你打印的内容输出到网页上,这意味着,当你在innerHTML中插入HTML标记时,其将不会被解析为HTML。

  • element.appendChild(newNode) 添加一个新的子节点到一个元素的最后
  • element.insertBefore(node1,node2) 添加一个新的子节点node1到子节点node2之前
<div id ="demo">some content</div>

<script>
  //creating a new paragraph
  var p = document.createElement("p");
  var node = document.createTextNode("Some new text");
  //adding the text to the paragraph
  p.appendChild(node);

  var div = document.getElementById("demo");
  //adding the paragraph to the div
  div.appendChild(p);
</script>
  1. 删除节点
  • parentNode.removeChild(childNode) 删除父节点之下的一个子节点
    以下代码会从页面中删除id为p1的子节点
<div id="demo">
  <p id="p1">This is a paragraph.</p>
  <p id="p2">This is another paragraph.</p>
</div>
<script>
var parent = document.getElementById("demo");
var child = document.getElementById("p1");
parent.removeChild(child);
</script>
  • childNode.parentNode 通过parentNode属性直接获取节点的父节点
child.parentNode.removeChild(child);
  1. 替换节点
  • element.replaceChild(newNode,oldNode) 该方法替换节点
<div id="demo">
  <p id="p1">This is a paragraph.</p>
  <p id="p2">This is another paragraph.</p>
</div>
<script>
var p = document.createElement("p");
var node = document.createTextNode("This is new");
p.appendChild(node);
var parent = document.getElementById("demo");
var child = document.getElementById("p1");
parent.replaceChild(p, child);
</script>

3.动画

  1. var A = setInterval(function,timer) 开始一个动画A,该方法会建立一个计时器,在以timer(int-ms)为单位时间的循环内,根据function重复通过更改对应属性来实现动画效果。
    以下代码实现将红色方块右移至绿色方块最右端位置
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<div id="container">
            <div id="box"> </div>
        </div>
	</body>
</html>

//CSS
#container {
    width: 200px;
    height: 200px;
    background: green;
    position: relative;
}
#box {
    width: 50px;
    height: 50px;
    background: red;
    position: absolute;
}

//JS
//calling the function in window.onload to make sure the HTML is loaded
window.onload = function() {
     var pos = 0; 
    //our box element
    var box = document.getElementById('box');
    var t = setInterval(move, 10);
  
    function move() {
        if(pos >= 150) {
            clearInterval(t);
        }
        else {
            pos += 1;
            box.style.left = pos+'px';
        }
    }
};

  1. clearInterval(A) 结束动画A
    window.clearInterval(iIntervalID) 这个要插入一个Id

4.Event

事件发生指当用户执行某项操作或者达到某种特定条件时,执行某段特定代码。

EventDescription
onclick当用户点击一个元素时发生
onload页面载入时触发
onunload页面关闭时触发
onbeforeunload在页面关闭之前触发(一般用于确认是否关闭页面)
onchange当一个元素的文本内容被更改,或者状态发生改变时发生
onmouseover当鼠标移动到一个节点或其子节点时发生
onmouseout当鼠标移除一个节点或其子节点时发生
onmousedown当用户在一个元素上按下鼠标按钮时发生
onmouseup当用户在一个元素上松开鼠标按钮时发生
onblur当一个元素失去焦点时发生
onfocus当一个用户得到焦点时发生
  1. 事件可以作为属性被添加进HTML元素中:例如:<p οnclick=“somefunc()”>一些文本</p>(不推荐使用)
<button onclick="show()">Click Me</button>
<script>
function show() {
  alert("Hi there");
}
</script>
var x = document.getElementById("demo");
x.onclick = function () {
  document.body.innerHTML = Date();
}
  1. **element.addEventListener(event,function,useCapture)**给一个元素添加一个事件监听
    event表示事件类型,如click,mouseover(即上述事件除去on)
    function表示事件发生后的处理方法
    useCapture 是一个boolean值,表示事件的传播机制(冒泡或捕获),此参数是可选的。
    一个元素可以添加多个事件处理,一种事件也可以添加多个处理方法。
    Example:
element.addEventListener("click", myFunction);
element.addEventListener("mouseover", myFunction);

function myFunction() {
  alert("Hello World!");
}
  1. element.removeEventListener(event,function) 将一个事件从元素中移除
    Example:
<button id="demo">Start</button>

<script>
var btn = document.getElementById("demo");
btn.addEventListener("click", myFunction);
function myFunction() {
  alert(Math.random());
  btn.removeEventListener("click", myFunction);
}
</script>

注意:IE8或该版本以下都不支持addEventListener,和removeEventListener方法,但是可以通过document.attachEvent()方法来添加相应的事件处理。

5.Event Propagation(事件传播)(难点)

HTML DOM中有两种事件传播机制:bubbling和capturing。
事件传播机制允许定义相同性质的的”嵌套“事件发生时的执行顺序,例如,在一个<div>元素中有一个<p>元素,那么,当用户点击了<p>元素时,浏览器应该先处理那个事件呢?

在bubbling(冒泡)模式中,最里层的目标事件被优先处理,相同事件从内向外得到执行,所以<p>元素中的事件被首先执行。
而在capturing(捕获)模式中,最外层的目标事件则被首先执行,即由外而内,所以此时<div中的事件被优先执行>。
如:
在这里插入图片描述

  • 当为捕获机制时: 当点击黄色方块时(结构嵌套, 黄色为里面的div, 红色为父级), 先出发的是红色点击事件, 之后是绿色, 黄色;
  • 当为冒泡机制时, 先触发黄色事件, 然后依次向父级冒泡, 为绿色, 红色.

addEventListener(event,function,useCapture)方法中的useCapture参数可用于定义元素行为的传播机制,默认属性是false,表示bubling,而当其被设置为true时,其表示capturing。

通过将事件对象的cancelBubble设置为true,即可取消冒泡:
IE8以及以前可以通过 window.event.cancelBubble=true阻止事件的继续传播;IE9+/FF/Chrome通过event.stopPropagation()阻止事件的继续传播

element.event =function(event){
                                     event= event || window.event;
                                     event.cancelBubble= true;
                            };


ele.onxxx = function(event) { }兼容性好, 但是一个元素的同一个事件上只能绑定一个处理程序基本等同于写在HTML行间
obj.addEventListener(type, function( ){ }, flase);IE9以下不兼容, 可以为一个事件绑定多个处理程序
obj.attachEvent(‘on’ + type, fn);IE独有, 一个事件同样可以绑定多个处理程序

6.Form Validation(表单验证)

<form οnsubmit=“return function” >…</form> onsubmit属性通过function检验表单内容是否合法。
function返回true时,表示内容合法会被提交。否则不会被提交。

示例

  1. 图片轮显
HTML:
<div>
  <button onclick="prev()"> Prev </button>
  <img id="slider" src="http://www.sololearn.com/uploads/slider/1.jpg" 
    width="200px" height="100px"/>
  <button onclick="next()"> Next </button>
</div>

JS:
  var images = [
  "http://www.sololearn.com/uploads/slider/1.jpg", 
  "http://www.sololearn.com/uploads/slider/2.jpg", 
  "http://www.sololearn.com/uploads/slider/3.jpg"
  ];
  var num = 0;

function next() {
  var slider = document.getElementById("slider");
  num++;
  if(num >= images.length) {
    num = 0;
  }
  slider.src = images[num];
  }

function prev() {
  var slider = document.getElementById("slider");
  num--;
  if(num < 0) {
    num = images.length-1;
  }
  slider.src = images[num];
}

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值