JavaScript实现textarea中Tab键缩进及兼容性问题处理

作者:纸飞机时间:2026-10-29 11:59:51浏览:267

本文介绍在textarea中通过JavaScript实现Tab键缩进的方法,并指出该方案在部分现代浏览器(如Chrome)中因selection属性未定义而报错的问题。文章提供了完整的JS代码示例及HTML调用方式,帮助开发者解决文本编辑区的缩进功能实现与兼容性问题。

textarea Tab键缩进实现概述

本文详细介绍一种利用JavaScript实现textarea文本框中Tab键缩进处理的方法,供读者参考借鉴。

经搜索发现,网上存在多种解决方案,部分仅需几行JavaScript代码,但往往存在细微缺陷;另有基于jQuery的实现方式,虽然简洁但也各有优劣。

代码兼容性问题说明

本文提供的JavaScript代码旨在实现textarea中输入Tab键时自动进行缩进处理。需要注意的是,该段代码在Google Chrome浏览器中无法正常运行,会出现错误。

JavaScript缩进代码示例

具体实现代码如下:

sel =event.srcElement.document.selection.createRange()

上述代码行在执行时会抛出异常:


Uncaught exception TypeError: Cannot read property 'selection' of undefined

该代码在Internet Explorer浏览器中可以正常执行,效果如下:


<mce:script type="text/javascript">
<!-- 
function editTab() 
{ 
  var code, sel, tmp, r 
  var tabs="" 
  event.returnValue = false 
  sel =event.srcElement.document.selection.createRange() 
  r = event.srcElement.createTextRange() 
  switch (event.keyCode) 
  { 
    case (8)  : 
      if (!(sel.getClientRects().length > 1)) 
      { 
        event.returnValue = true 
        return 
      } 
      code = sel.text 
      tmp = sel.duplicate() 
      tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top) 
      sel.setEndPoint("startToStart", tmp) 
      sel.text = sel.text.replace(/^/t/gm, "") 
      code = code.replace(/^/t/gm, "").replace(//r/n/g, "/r") 
      r.findText(code) 
      r.select() 
      break 
    case (9)  : 
      if (sel.getClientRects().length > 1) 
      { 
        code = sel.text 
        tmp = sel.duplicate() 
        tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top) 
        sel.setEndPoint("startToStart", tmp) 
        sel.text = "/t"+sel.text.replace(//r/n/g, "/r/t") 
        code = code.replace(//r/n/g, "/r/t") 
        r.findText(code) 
        r.select() 
      } 
      else 
      { 
        sel.text = "/t" 
        sel.select() 
      } 
      break 
    case (13)  : 
      tmp = sel.duplicate() 
      tmp.moveToPoint(r.getBoundingClientRect().left, sel.getClientRects()[0].top) 
      tmp.setEndPoint("endToEnd", sel) 
      for (var i=0; tmp.text.match(/^[/t]+/g) && i<tmp.text.match(/^[/t]+/g)[0].length; i++)  tabs += "/t" 
      sel.text = "/r/n"+tabs 
      sel.select() 
      break 
    default   : 
      event.returnValue = true 
      break 
  } 
} 
// -->
</mce:script>

HTML调用方式

HTML调用方式如下:

具体HTML代码如下:

<textarea cols=80 rows=20 name="input" onkeydown="editTab()"></textarea>

希望本文所述的javascript程序设计内容能对广大开发者有所帮助。

作者最新文章