首页 > 其他分享 >JS中的浏览器对象模型-DOM(一)

JS中的浏览器对象模型-DOM(一)

时间:2023-07-25 16:11:44浏览次数:46  
标签:JavaScript 浏览器 DOM 元素 JS getElementById var document 节点

document对象中,document元素的选取、修改、添加、删除是常见的应用。

元素的选取

下面一段HTML代码,我们可以非常方便地选取指定的元素。例如:

  <!-- HTML结构 -->
  <div id="test-div">
      <div class="c-red">
          <p id="test-p">JavaScript</p>
          <p>Java</p>
      </div>
      <div class="c-red c-green">
          <p>Python</p>
          <p>Ruby</p>
          <p>Swift</p>
      </div>
      <div class="c-green">
          <p>Scheme</p>
          <p>Haskell</p>
      </div>
  </div>

现在的问题是,要如何选取JavaScript元素?元素的选取可以有三种方式:

  • getElementById(),通过元素id获取元素;
  • getElementsByClassName(),通过class名称获取元素集合
  • getElementsByTagName(),通过标签名称获取元素集合
  //如何选择<p>JavaScript</p>:
  var p1 = document.getElementById("test-p");  //方法一
  var p2 = document.getElementsByClassName("c-red")[0].firstElementChild; //方法二 
  var p3 = document.getElementById("test-div").firstElementChild.firstElementChild; //方法三
  console.log(p1.innerText === p2.innerText,p1.innerText===p3.innerText);
        
  // 选择<p>Python</p>,<p>Ruby</p>,<p>Swift</p>:
  var p4 = document.getElementsByClassName("c-red c-green")[0].children;
        
  // 选择<p>Haskell</p>:
  var p6 = document.getElementsByClassName("c-green")[1].lastElementChild;
  var p7 = document.getElementsByClassName("c-green")[1].children[1];
  var p8 = document.getElementsByTagName("p")[6];
  console.log(p6.innerText === p8.innerText,p7.innerText === p8.innerText);

firstElementChild表示元素的第一个子元素。lastElementChild表示元素的最后一个子元素。

getElementsByClassName()和getElementsByTagName()方法获取的是一元素集合,定位到具体的元素需要加索引。

元素的选取还可以使用querySelector()和querySelectorAll()获取

  • querySelector(),获取给定选择器后查询到的第一个节点。
  • querySelectorAll(),获取给定选择器后查询到的节点集合。
  // 选择<p>Python</p>,<p>Ruby</p>,<p>Swift</p>:
  var p5 = document.querySelectorAll(".c-red.c-green>p");

.c-red表示c-red class选择器,.c-green表示c-green class选择器,两个class选择器之间没有空格表示且的关系,“>”表示子选择器。如果两个class选择器类型之间用逗号隔开表示或的关系。

节点和元素的区别

在HTML中标签以及标签所包裹的内容是一个元素;节点包括元素、comment、文本等。例如

  <div id="div1">
      这是一个大框
      <!-- 下面是一个内部框  -->
      <div id="div2">
          内部框
      </div>
  <div>

上述代码中,div1元素下包括三个节点,一个文本节点、一个注释节点、一个div2元素节点。然而,div1元素下只有一个div2元素。

修改DOM

通过innerText属性,获取或修改元素的文本,通过innerHtml属性,获取或修改元素的HTML内容。

下面一段HTML代码,我们可以非常方便地修改元素。例如:

  <h1>JS DOM UPDATE</h1>
  <!-- HTML结构 -->
  <div id="test-div">
      <p id="test-js">javascript</p>
      <p>Java</p>
  </div>

要如何修改javascript为JavaScript?

  // 获取<p>javascript</p>节点:
  var js = document.getElementById("test-js");
  // 修改文本为JavaScript:
  // TODO:
  js.innerText="JAVASCRIPT";

修改元素的样式属性

  var js = document.getElementById("test-js");
  // 修改CSS为: color: #ff0000, font-weight: bold
  js.style.color="#ff0000";
  js.style.fontWeight = "bold";
  //
  js.setAttribute("style","color:#ff0000;font-size:30px");

通过元素的style属性修改,通过setAttribute方法进行修改两种方法是等效的。

插入DOM

插入DOM有两种方式:

  • 第一种方式,先找到父元素,然后使用appendChild()方法,把元素添加到子元素的最后;
  • 第二种方式,先找到父元素,然后使用insertBefore()方法,在它的某一子元素前面添加元素

下面一段HTML代码为例:

  <!-- HTML结构 -->
  <ol id="test-list">
      <li class="lang">Scheme</li>
      <li class="lang">JavaScript</li>
      <li class="lang">Python</li>
      <li class="lang">Ruby</li>
      <li class="lang">Haskell</li>
  </ol>

使用insertBefore,在Ruby元素前面添加Css元素

  var css = document.createElement("li");
  css.className="lang";
  css.innerText="Css";
  var testList = document.getElementById("test-list");
  var ruby = testList.children[3];
  testList.insertBefore(css,ruby);

使用appendChild,在ol列表末尾添加一项Css语言

  var css = document.createElement("li");
  css.className="lang";
  css.innerText="Css";
  var testList = document.getElementById("test-list");
  testList.appendChild(css);

删除DOM

要删除一个节点,首先要获得该节点本身以及它的父节点,然后,调用父节点的removeChild把自己删掉:

  // 拿到待删除节点:
  var self = document.getElementById('to-be-removed');
  // 拿到父节点:
  var parent = self.parentElement;
  // 删除:
  var removed = parent.removeChild(self);
  removed === self; // true

以下面HTML结构为例:

  <!-- HTML结构 -->
  <ul id="test-list">
      <li>JavaScript</li>
      <li>Swift</li>
      <li>HTML</li>
      <li>ANSI C</li>
      <li>CSS</li>
      <li>DirectX</li>
  </ul>

请删除与网页开发无关的语言

  //拿到父节点
  var list = document.getElementById("test-list");
  var arrRemoved = ["Swift","ANSI C","DirectX"];
  //分别删除数组种的语言
  arrRemoved.forEach(x =>{
      var lis = document.getElementsByTagName("li")
      var element = Array.from(lis).find(e=>e.innerText == x);
          list.removeChild(element);
      })

表单

用JavaScript操作表单和操作DOM是类似的,因为表单本身也是DOM树。

表单可以接收用户的输入内容,HTML表单的输入控件主要有以下几种:

  • 文本框,对应的<input type="text">,用于输入文本;
  • 口令框,对应的<input type="password">,用于输入口令;
  • 单选框,对应的<input type="radio">,用于选择一项;
  • 复选框,对应的<input type="checkbox">,用于选择多项;
  • 下拉框,对应的<select>,用于选择一项;
  • 隐藏文本,对应的<input type="hidden">,用户不可见,但表单提交时会把隐藏文本发送到服务器;
  • 日期框,对应的<input type="date">,输入日期;
  • 日期时间框,对应的<input type="datetiem-local">,输入日期时间;
  • 颜色框,对应的<input type="color">,输入颜色;
  • 按钮<input type="button">,用于按钮。

获取值

如果我们获得了一个<input>节点的引用,就可以直接调用value获得对应的用户输入值:

  // <input type="text" id="email">
  var input = document.getElementById('email');
  input.value; // '用户输入的值'

对于单选框和复选框,value属性返回的永远是HTML预设的值,而我们需要获得的实际是用户是否“勾上了”选项,所以应该用checked判断:

  //<label><input type="radio" name="weekday" id="monday" value="1"> Monday</label>
  //<label><input type="radio" name="weekday" id="tuesday" value="2"> Tuesday</label>
  var mon = document.getElementById('monday');
  var tue = document.getElementById('tuesday');
  mon.value; // '1'
  tue.value; // '2'
  mon.checked; // true或者false
  tue.checked; // true或者false

设置值

设置值和获取值类似,对于text、password、hidden以及select,直接设置value就可以:

  // <input type="text" id="email">
  var input = document.getElementById('email');
  input.value = '[email protected]'; // 文本框的内容已更新

提交表单

下面一段HTML代码,按要提交输入信息:

  <!-- HTML结构 -->
  <form id="test-register" action="#" target="_blank" onsubmit="return checkRegisterForm()">
      <p id="test-error" style="color:red"></p>
      <p>
          用户名: <input type="text" id="username" name="username">
      </p>
      <p>
          口令: <input type="password" id="password" name="password">
      </p>
      <p>
          重复口令: <input type="password" id="password-2">
      </p>
      <label><input type="radio" name="weekday" id="monday" value="1" checked/> Monday</label>
      <label><input type="radio" name="weekday" id="tuesday" value="2" /> Tuesday</label>
      <p>
          <input type="submit" value="提交"/> <input type="reset" value="重置"/>
      </p>
  </form>
对应的js代码如下:
  // 用户名必须是3-10位英文字母或数字;
  // 口令必须是6-20位;
  // 两次输入口令必须一致。
  function checkRegisterForm(){
      var username = document.getElementById("username").value;
      var password = document.getElementById("password").value;
      var password2 = document.getElementById("password-2").value;
      console.log(username,password,password2);
      if (username.length>=3 && username.length<=10){
          if (password.length>=6 && password.length<=20){
              if (password2.length>=6 && password2.length<=20){
                  if (password == password2){
                      return true;
                  }
              }
          }
      }
      return false;
  }

上述代码种,当点击提交按钮时,执行form的onsubmit事件,完成表单的提交。

AJAX

AJAX不是JavaScript的规范,它是Asynchronous JavaScript and XML的缩写,意思就是用JavaScript执行异步网络请求。

用Form提交数据,点击“提交”按钮,表单开始提交,浏览器就会刷新页面。

如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面, 这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。

在现代浏览器上写AJAX主要依靠XMLHttpRequest对象:

  var request;
  if (window.XMLHttpRequest) {
      request = new XMLHttpRequest();
  } else {
      request = new ActiveXObject('Microsoft.XMLHTTP');
  }
        
  function success(text) {
      var textarea = document.getElementById('test-ie-response-text');
      textarea.value = text;
  }
        
  function fail(code) {
      var textarea = document.getElementById('test-ie-response-text');
      textarea.value = 'Error code: ' + code;
  }
        
  request.onreadystatechange = function () { // 状态发生变化时,函数被回调
      if (request.readyState === 4) { // 成功完成
          // 判断响应结果:
          if (request.status === 200) {
              // 成功,通过responseText拿到响应的文本:
              return success(request.responseText);
          } else {
              // 失败,根据响应码判断失败原因:
              return fail(request.status);
          }
      } else {
          // HTTP请求还在继续...
      }
  }
        
  // 发送请求:
  request.open('GET', '/api/categories');
  request.send();
  alert('请求已发送,请等待响应...');

文章同时发表在:码农编程网 欢迎访问

本节重点:

  • 如何选取document元素;
  • document元素的查询、修改、添加、删除等操作。
  • 表单元素的介绍;
  • 表单元素值的获取和设置;
  • 表单提交。
  • 什么是AJAX,在JavaScript中如何使用异步请?

标签:JavaScript,浏览器,DOM,元素,JS,getElementById,var,document,节点
From: https://www.cnblogs.com/qqxz/p/17553311.html

相关文章

  • 浏览器不需要安装插件,前端网页播放在线视频方案,hls协议下的h.265视频播放方案推荐
    一般我们播放本地视频都是使用video标签,但是<video>元素只支持三种视频格式:MP4、WebM、Ogg,对于在线视频直接使用video是没法播放的,这里介绍几款这两天我在做播放在线监控视频功能时使用过的几款播放器,初次接触流媒体踩了一堆坑,到目前为止对这部分内容都还了解的很浅显,若有问题请......
  • 【Python】蒙特卡洛模拟 | PRNG 伪随机数发生器 | LCG 线性同余算法 | 马特赛特旋转算
    ......
  • json 包 转字符串为dict json.loads(data_str)
    importjson##假设有一个JSON对象#data={#"name":"John",#"age":30,#"city":"NewYork"#}###将JSON对象转换为字符串#json_str=json.dumps(data)##print(json_str)#str转json类型是字典data_......
  • 【大联盟】20230714 T1 三分网络(tri) 题解 CF1666K 【Kingdom Partition】
    题目描述here。题解赛时得分:\(30/30\),想了很久网络流最后不会。感觉这题就纯纯对脑洞,因为把题目中的\(2\)改成\(3\)就做不了)))不过还是相当有意思的。考虑如下建模方式:首先,考虑最小割。对于每个点\(i\),我们用两个点\(x_{i}\),\(y_i\)来表示。\(x_i\)表示\(i\)号点是......
  • 大json传输优化方法
    1.http流式传输数据压缩gzip、deflate、br分块传输Transfer-Encoding:chunked范围请求Range:bytes=0-100多段数据multipart/byteranges分隔标记boundary类似于文件上传下载2.json特有压缩算法     参考:基于HTTP流式传输的长时响应体验提升    ......
  • 爬虫js基础11
    产业平台  importrequestsimportexecjscookies={'Hm_lvt_6146f11e5afab71309b3accbfc4a932e':'1689929133','Hm_lpvt_6146f11e5afab71309b3accbfc4a932e':'1689929133','JSESSIONID':'AF490D30B86E......
  • 爬虫js基础12
    犀牛网站  importrequestsimportexecjs#data={"payload":"LBc3V0I6ZGB5bXsxTCQnPRBuBAQVcDhbICcmb2x3AjI",#"sig":"CE704F132C4E47B31E91773020275904",#"v":1}defret_maji():ploma={"sor......
  • Python随机函数random使用详解
    在python中用于生成随机数的模块是random,在使用前需要import,下面看下它的用法。random.randomrandom.random()用于生成一个0到1的随机符点数:0<=n<1.0注意: 以下代码在Python3.5下测试通过,python2版本可稍加修改描述random()方法返回随机生成的一个实数,它在(0,1)范围内。......
  • 爬虫js基础
    URL转义fromurllib.parseimportunquote_plus,quote_plusconstjsdom=require('jsdom');npminstalljsdomnpminstallcrypto-js碰到数据加密可以使用这个作为入口的多种方法解密:decrypt,加密搜encryptajax渲染JSON.parse——————JSON.parse(函数或者方法(密文))---搜......
  • vue组件中引入自定义js文件
    在组件的script标签内直接引入:importmyFunctionfrom'@/util/custom.js'; 开始使用自定义js中的方法:exportdefault{//...otherVuecomponentoptionsmethods:{someMethod(){//Callthecustomfunctionfromyourcustom.jsmyFunctio......