当innerHTML遇上document.getElementById

      不知在通常的开发中,大家有没有遇到过这样的问题。

      例如现在有一个控件 ,如果想取这个控件的值有很多中方法,其中document.getElementById('name').value既是其中的一种。但是在实际的开发中可能碰到使用这个方法取不到值的情况。为了解决这个问题,我们有必要明白document.getElementById()这个函数的原理。

      这个函数是基于DOM树模型的,其中的id必须是唯一的。如果,id不唯一,取得是DOM树模型中第一个具有该标识的对象。因此,当使用这个函数取不到值时,因该检查一下在使用这个函数之前,是否有这个id,是否有同名的标识。

      innerHTML通常用来更改小区间的文档内容,可以和动态语言相结合达到很好的动态显示内容的效果。从DOM树模型来看,使用innerHTML可能对文档模型发生修改。这个时候使用JS来操作被修改区域的对象的时候,就需要从整体出发,尤其要注意ID是否重复。

      下面介绍一个让人迷惑的实例。

      

       这个HTML的基本思路是,由一个Div层作为container,动态的控制Div层中的内容。但是在浏览这个页面的时候,你会发现,使用alertAOutSide()和alertBOutSide()函数都取不到对应的填入的值,同时取到的值总是为空。

      通过这个现象,我们可以发现,在函数alertAOutSide()中所取到的对象和直接onclick后alert语句中的对象不一样。那么这是为什么呢?

      通过仔细分析文档结构,可以发现,当对container的div的innerHTML赋值完以后,innerHTML中就想到也增加了一个a<input type="text" id="Aname" name="Aname" οnclick="alert('AName='+this.value);alertAOutSide()"/>这样的语句,于是这个文档中就有两个id为Aname的对象。我们所填入的值是在第二个里,而我们用document.getElementById的时候取得是第一个值,第一个的值总是空,所以总是取不到值。

      明白了原因也就好解决了。解决的思路就是避免名称冲突。解决方法有很多种。基本都是使用display来控制,或者style.visibility来控制。下面给出一种解决方法。

     

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SodaRender 是轻量级的模板引擎。当前只支持 IE9,Chrome 和移动端的所有浏览器。SodaRender语法源自于AngularJS,前端框架Abstract.js已经内置SodaRender引擎,SodaRender引擎应用于腾讯手机QQ中,已被证实是一款优秀的模板引擎用法示例:Exampleshtml>head>title>SodaRender Examapletitle>head>div>ul id="targetUl">script type="text/soda" id="dataList">li soda-repeat="item in list" soda-if="item.show">{{item.name}}li>script>ul>div>html>var templateStr = document.getElementById("dataList")[removed];var target = document.getElementById("targetUl"); var data = {  list: [  {name: "A"},        {name: "B"}     ] };  var result = sodaRender(templateStr, data);target.appendChild(result);APIs Of SodaRendersodaRenderUSING :   SodaRender(String templateStr, Object data)DESCR :   Using templateStr with data to render templateRETURN: DOM Fragmentthe DOM Frament Object has a method innerHTML which will return the rendered HTML code.Meanwhile, you can use it like a common DOM Node, such as appending it to your target node.sodaFilterUSING :   SodaFilter(String filterName, Function func(input, args...))DESCR :   Defining Filters, so you can use filters in templateTemplate Language (AngularJs Template Like)More directives have been added{{}}out put expressions{{item.name 1}}soda-repeatsoda-repeat="item in array"soda-repeat="item in array track by index"soda-repeat="(key, value) in object"USING :   SodaRender(String templateStr, Object data)DESCR :   Using templateStr with data to render templatesoda-ifsoda-if="item.show"soda-classsoda-class="currItem === 'list1' ? 'active' : ''"soda-srcsoda-src="hello{{index}}.png"soda-bind-htmlsoda-bind-html="click"soda-stylesoda-style="style"soda-*soda-rx="{{rx}}%"filters{{input|filte1:args1:args2...|filter2:args...}} how to define filters? Just using sodaFilter Method as methioned above. Here is an example.sodaFilter('shortTitle', function(input, length){ return (input || '').substr(0, length); });Template belowdiv soda-repeat="item in list">div class="title">{{item.title|shortTitle:10}}div>div> 标签:SodaRender
以下是对代码的简要优化: 1. 去除重复代码 将 `setWatermark` 函数和 `outWatermark` 函数中的重复代码提取出来,作为一个单独的函数。 2. 使用箭头函数 将所有函数都改为箭头函数,以简化代码。 3. 使用 const 和 let 将所有变量声明方式都改为 `const` 或 `let`,以便更好地控制变量的作用域。 4. 简化代码逻辑 将 `set` 函数中的定时器逻辑改为判断页面是否有水印,如果没有则添加水印。 优化后的代码如下: ``` const setWatermark = str => { const id = '1.23452384164.123412415' const watermarkDiv = document.getElementById(id) if (watermarkDiv !== null) { document.body.removeChild(watermarkDiv) } const canvas = document.createElement('canvas') const context = canvas.getContext('2d') canvas.width = 200 canvas.height = 200 context.rotate((-15 * Math.PI) / 150) context.font = '14px Vedana' context.fillStyle = 'rgba(200, 200, 200, 0.40)' context.textAlign = 'left' context.textBaseline = 'middle' context.fillText(str, canvas.width / 8, canvas.height / 2) const div = document.createElement('div') div.id = id div.style.pointerEvents = 'none' div.style.top = '0px' div.style.left = '0px' div.style.position = 'fixed' div.style.zIndex = '100000' div.style.width = document.documentElement.clientWidth + 'px' div.style.height = document.documentElement.clientHeight + 'px' div.style.background = 'url(' + canvas.toDataURL('image/png') + ') left top repeat' document.body.appendChild(div) return id } const outWatermark = id => { const watermarkDiv = document.getElementById(id) if (watermarkDiv !== null) { watermarkDiv.style.display = 'none' } } const set = str => { setWatermark(str) window.onresize = () => { setWatermark(str) } } const out = () => { outWatermark('1.23452384164.123412415') } const reset = str => { out() set(str) } export default { set, out, reset, } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值