脚本化文档

选取文档元素

1.用指定的ID属性

var section = document.getElementById('section')

2.用指定的name属性

name属性的值不是必须唯一:多个元素可能有同样的名字,在表单中,单选和复选按钮通常是这种情况。而且,和id不一样的是name属性只在少数html元素中有效,包括表单、表单元素、<iframe>和<img>元素

使用getElementsByName()

var radio = document.getElementsByName('radio')    name = radio

3.用指定的标签名字

选取文档中的第一个<span>元素
var spans = document.getElementsByTagName('span')[0];
var spans = document.getElementsByTagName('span');     <span></span>

document.images和document.forms的属性为HTMLCollection对象,这些对象都是只读的类数组对象,它们有length属性,也可以像真正的数组一样索引(只是读而不是写),给它们的内容用如下标准的循环进行迭代

for(var i = 0;i<document.images.length;++i){    //循环所有的图片
    document.images[i].style.display = 'none';  //....隐藏它们
}

不能直接在nodeLis和HTML集合上调用Array的方法,但可以间接地使用

var content = Array.prototype.map.call(document.getElementsByTagName('span'),
    function(e){
        return e.innerHTML
    }
    )
输出:["124"]

如果要迭代一个nodeList对象时在文档中添加或删除的元素,首先会需要对NodeList对象生成一个静态的副本:

var list = ['a','b','c','d'];
var a = Array.prototype.slice.call(list,0);
console.log(a)
输出:["a", "b", "c", "d"]  

4.用指定的CSS类

//查找class为war的所有元素
var war = document.getElementsByClassName('war');
//查找id为log并且有'fatal'和'error'类的元素的所有后代
var log = document.getElementById('log');
var fatal = log.getElementsByClassName('fatal error');
console.log(fatal)
输出:[span.fatal.error, span.fatal.error]
<span id="log">
    <span class="fatal error"></span>
</span>

5.匹配指定的CSS选择器

元素可以基于属性值来选取

p[lang = 'fr']   //所有使用法语的段落,如:<p lang = 'fr'>

*[name = 'x']  //所有包含name = 'x'属性的元素

querySelector和querySelectAll的区别

querySelector返回的是一个对象,querySelectorAll返回的一个集合(NodeList)
var b = document.querySelector('#log');
console.log(b);
输出:<span id = "log"></span>
var c = document.querySelectorAll('#log')
console.log(c);
输出:[span#log] 

节点树的文档

parentNode   该节点的父节点

childNodes     该节点的子节点

firstChild / lastChild   该节点的子节点的第一个和最后一个

nextSibling / previoursSibling   该节点的兄弟节点中的前一个和下一个。具有相同父节点的两个节点为兄弟节点

nodeType   该节点的类型。9代表Document节点,1代表Element节点,3代表Text节点,8代表Comment节点,11代表DocumentFragment节点

nodeValue   Text节点或Comment节点的文本内容

nodeName   元素的标签名,以大写形式表示

HTML属性作为Element的属性

查询一张图片的URL

var img = document.getElementById('imgs'); 
var imgu = img.src;  //查找src属性是图片的URL

设置form表单提交属性

var f = document.forms[0];  //找到文档中第一个form
f.action = 'www.baidu.com';   //设置提交至的URL
f.method = 'POST'   //HTTP请求类型
同等于:
<form action="www.baidu.com" method="post"></form>

getAttribute() 方法返回指定属性名的属性值

提示:如果您希望以 Attr 对象返回属性,请使用 getAttributeNode

实例:

//获得链接的 target 属性
<img src="piao1.jpeg" target="_blank">
var image = document.getElementsByTagName('img')[0].getAttribute('target');
输出:_blank

setAttribute() 方法添加指定的属性,并为其赋指定的值

如果这个指定的属性已存在,则仅设置/更改值

语法:element.setAttribute(attributename,attributevalue)

实例:

设置 input 元素的 type 属性

<input onclick="setA()">
function setA(){
        document.getElementsByTagName('input')[0].setAttribute('type','button');  //给input设置type="button",点击之后变成button按钮
    }

hasAttribute()  如果存在指定属性,则 hasAttribute() 方法返回 true,否则返回 false

语法:element.hasAttribute(attributename)

实例:

<p id="demo">请点击按钮来查看 button 元素是否拥有 onclick 属性。</p>
<button onclick="myFunction()">试一下</button>
function myFunction()
{
var btn=document.getElementsByTagName("BUTTON")[0];
var x=document.getElementById("demo");
x.innerHTML=btn.hasAttribute("onclick");
}

removeAttribute()  方法删除指定的属性

此方法与 removeAttributeNode() 方法的差异是:removeAttributeNode() 方法删除指定的 Attr 对象,而此方法删除具有指定名称的属性。结果是相同的。同时此方法不返回值,而 removeAttributeNode() 方法返回被删除的属性,以 Attr 对象的形式

语法:element.removeAttribute(attributename)     无返回值

实例:

删除 header 元素的 style 属性

<h1 style="color:red">Hello World</h1>
<p id="demo">点击按钮来删除标题中的 style 属性。</p>
<button onclick="myFunction()">试一下</button>
function myFunction()
{
document.getElementsByTagName("H1")[0].removeAttribute("style"); 
}

textContent()  属性设置或返回指定节点的文本内容,以及它的所有后代

如果您设置了 textContent 属性,会删除所有子节点,并被替换为包含指定字符串的一个单独的文本节点

提示:有时,此属性可用于取代 nodeValue 属性,但是请记住此属性同时会返回所有子节点的文本

语法:设置节点的文本内容    node.textContent=text

   返回节点的文本内容    node.textContent

实例:

获得列表的所有文本内容
document.getElementById("myList).textContent;

split()   方法用于把一个字符串分割成字符串数组

语法:stringObject.split(separator,howmany)

返回值:

一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括separator 自身。

但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

提示和注释

注释:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

注释:String.split() 执行的操作与 Array.join 执行的操作是相反的。

实例1:

var str="How are you doing today?"
document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))
输出:
How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

实例2:

//分割结构更为复杂的字符串
"2:3:4:5".split(":")    //将返回["2", "3", "4", "5"]
"|a|b|c".split("|")    //将返回["", "a", "b", "c"]

实例3:

//把句子分割成单词
var words = sentence.split(' ')

//使用正则表达式作为 separator
var words = sentence.split(/\s+/)

//如果您希望把单词分割为字母,或者把字符串分割为字符,可使用下面的代码
"hello".split("")       //可返回 ["h", "e", "l", "l", "o"]

//若只需要返回一部分字符,请使用 howmany 参数
"hello".split("", 3)    //可返回 ["h", "e", "l"]

map Map 对象表示 HTML <map> 元素

访问 Map 对象

您可以通过使用 getElementById() 来访问 <map> 元素:

<map name="myMap" id="myMap">

<area
shape="circle"
coords="180,139,14"
href ="/example/html/venus.html"
target ="_blank"
alt="Venus" />

<area
shape="circle"
coords="129,161,10"
href ="/example/html/mercur.html"
target ="_blank"
alt="Mercury" />

<area
shape="rect"
coords="0,0,110,260"
href ="/example/html/sun.html"
target ="_blank"
alt="Sun" />

</map>

<p>点击按钮来获得图像映射中 area 元素的数目。</p>

<p id="demo"></p>

<button onclick="myFunction()">试一下</button>

<script>
function myFunction()
{
var x = document.getElementById("myMap").areas.length;
document.getElementById("demo").innerHTML = x;
}
输出:3

创建 Map 对象

您可以通过使用 document.createElement() 方法来创建 <map> 元素

<p id="demo"></p>

<button onclick="myFunction()">试一下</button>

<script>
function myFunction()
{
var x = document.createElement("MAP");
x.setAttribute("id", "myMap");
x.setAttribute("name", "myMap");
document.body.appendChild(x);

var y = document.createElement("AREA");
y.setAttribute("href", "/example/html/venus.html");
y.setAttribute("shape", "circle");
y.setAttribute("coords", "180,139,14");
document.getElementById("myMap").appendChild(y);

document.getElementById("demo").innerHTML = "已创建 MAP,现在您可以在图像中点击 venus 区域。";
}
输出:已创建 MAP,现在您可以在图像中点击 venus 区域(创建成功)

jquery map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象

语法:.map(callback(index,domElement))

详细说明

由于返回值是 jQuery 封装的数组,使用 get() 来处理返回的对象以得到基础的数组。

.map() 方法对于获得或设置元素集的值特别有用。请思考下面这个带有一系列复选框的表单

<form method="post" action="">
  <fieldset>
    <div>
      <label for="two">2</label>
      <input type="checkbox" value="2" id="two" name="number[]">
    </div>
    <div>
      <label for="four">4</label>
      <input type="checkbox" value="4" id="four" name="number[]">
    </div>
    <div>
      <label for="six">6</label>
      <input type="checkbox" value="6" id="six" name="number[]">
    </div>
    <div>
      <label for="eight">8</label>
      <input type="checkbox" value="8" id="eight" name="number[]">
    </div>
  </fieldset>
</form>

<p><b>Values: </b></p>

$("p").append($(':checkbox').map(function() {   //遍历:checkbox,将:checkbox里的id放入p标签里
    return this.id;
  }).get().join(','));

输出:Values: two,four,six,eight
<p class="textmap"><b>Values: </b></p>
    <form class="textmapForm">
          <input type="text" name="name" value="John"/>
          <input type="text" name="password" value="password"/>
          <input type="text" name="url" value="http://ejohn.org/"/>
    </form>

    <script>
    $(function(){
        $(".textmap").append( $("input").map(function(){
              return $(this).val();   //遍历input,将input里的value放入class="textmap"里
        }).get().join(", ") );
        console.log($("input").map(function(){
              return $(this).val();
        }));
    });
    </script>
输出:Values: John, password, http://ejohn.org/

get()原来JQuery下有一个概念叫“类数组”,例如$("li");获取的集合就是类数组,有数组的一些属性,但是不是真正的数组,这类数组的instance of Array是false。

从jQuery对象和js对象的角度来理解的话就是JQuery这种类数组可以理解为属于JQuery对象的数组,所以不能应用JS对象的方法。

map()的工作有两步:

1、遍历。遍历集合中的每一个元素。

2、替换。对每一个元素执行callback,用返回值替换集合中原本的值。

所以值虽然变了,但是依然属于JQuery对象。

总结:

map()函数返回JQuery对象的数组。

get()函数返回JS对象的数组。

ps:jQuery对象只能用JQuery的方法。

textContent()  纯文本元素内容

var div = document.getElementsByTagName('div')[0];  //选div第一个
var text = div.textContent;  //纯文本显示
div.textContent = "hello document";  //修改纯文本内容

toUpperCase() 将字母转换为大写

createElement 创建节点

<span onclick="span()">span</span>

function span(){
        var spans = document.getElementsByTagName('span')[0];  //选span第一个
        var s = document.createElement('span');   //创建一个节点
        s.textContent= '新增';   //给节点赋值
        spans.appendChild(s);   //将新增的节点放入到第一个span里面
    }

createTextNode   创建文本节点

appendChild()  方法向节点添加最后一个子节点

提示:如果您需要创建包含文本的新段落,请记得添加到段落的文本的文本节点,然后向文档添加该段落。

您也可以使用 appendChild() 方法从一个元素向另一个元素中移动元素。

实例:

从一个列表向另一个列表中移动列表项

<ul id="myList1"><li>Coffee</li><li>Tea</li></ul>
<ul id="myList2"><li>Water</li><li>Milk</li></ul>
<p id="demo">请点击按钮把项目从一个列表移动到另一个列表中。</p>
<button onclick="myFunction()">亲自试一试</button>

function myFunction()
{
var node=document.getElementById("myList2").lastChild;
document.getElementById("myList1").appendChild(node);
}

语法:node.appendChild(node)

返回值

insetBefore()   方法在您指定的已有子节点之前插入新的子节点

提示:如果您希望创建包含文本的新列表项,请记得创建文本节点形式的文本,以便追加到 LI 元素中,然后向列表插入这个 LI。

您也可以使用 insertBefore 方法插入/移动已有元素。

实例1:

把一个列表项从一个列表移动到另一个中

<ul id="myList1"><li>Coffee</li><li>Tea</li></ul>
<ul id="myList2"><li>Water</li><li>Milk</li></ul>
<p id="demo">请点击按钮把项目从一个列表移动到另一个列表中。</p>
<button onclick="myFunction()">亲自试一试</button>

function myFunction(){
        var node = document.getElementById("myList2").lastChild;  //myList2的最后一个子节点
        var list = document.getElementById("myList1");
        list.insertBefore(node,list.childNodes[0]);
    }

实例2:

将第二个节点添加到第一个节点的子节点中

<button onclick="btn1()">节点一</button>
<button onclick="btn2()">节点二</button>
<button onclick="btn3()">节点三</button>

function btn3(){
        var btn3 = document.getElementsByTagName('button')[2];
        var btn1 = document.getElementsByTagName('button')[0];
        btn1.insertBefore(btn3,btn1.childNodes[0]);      //将btn3插入到btn1的第一个子节点
    }

语法:node.insertBefore(newnode,existingnode)

removeChild()  方法指定元素的某个指定的子节点。以 Node 对象返回被删除的节点,如果节点不存在则返回 null。

语法:node.removeChild(node)

实例:

从列表中删除一个项目

<ul id="myList">
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>
<p id="demo">点击按钮来删除列表中的首个项目。</p>
<button onclick="myFunction()">试一下</button>

function myFunction()
{
var list=document.getElementById("myList");
list.removeChild(list.childNodes[0]);
}

replaceChild() 方法用新节点替换某个子节点

这个新节点可以是文档中某个已存在的节点,或者您也可创建新的节点。

语法:node.replaceChild(newnode,oldnode)

实例:

用一个新项目替换列表中的某个项目

<ul id="myList">
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>
<p id="demo">点击按钮来替换列表中的首个项目。</p>
<button onclick="myFunction()">试一下</button>

function myFunction()
{
var textnode=document.createTextNode("Water");
var item=document.getElementById("myList").childNodes[0];
item.replaceChild(textnode,item.childNodes[0]);
}

//首先创建一个新的文本节点。
//然后替换首个列表项中的首个子节点。
//注释:本例用文本节点 "Water" 替换文本节点 "Coffee",而不是整个 LI 元素,这是替换节点的另一种方法。

用函数展示replaceChild()的另一种用法:

//用一个新的<b>元素替换n节点,并使n成为该元素的子节点
function embolden(n){
        //假如参数为字符串而不是节点,将其当作元素的id
        if(typeof n == "string")n = document.getElementById(n);
        var parent = n.parentNode;      //获得n的父节点
        var b = document.createElement('b');     //创建一个<b>元素
        parent.replaceChild(b,n);   //用该<b>元素替换节点n
        b.appendChild(n);   //使n成为<b>元素的子节点
}

outerHTML()  设置或获取对象及其内容的 HTML 形式

innerHTML() / outerHTML() / innerText() / outerText()不同之处:

1)、innerHTML与outerHTML在设置对象的内容时包含的HTML会被解析,而innerText与outerText则不会。 
2)、在设置时,innerHTML与innerText仅设置标签内的文本,而outerHTML与outerText设置包括标签在内的文本。 
    对于一个id为"testdiv"的div来说,outerHTML、innerHTML以及innerTEXT三者的区别可以通过下图展示出来:

insertAdjacentHTML() 可以在指定的地方插入html内容和文本内容

insertAdjacentText方法与 insertAdjacentHTML方法类似,只不过只能插入纯文本,参数相同

参数介绍:
where:插入位置。包括beforeBegin,beforeEnd,afterBegin,afterEnd。
el:用于参照插入位置的html元素对象
html:要插入的html代码

nsertAdjacentHTML 方法:在指定的地方插入html标签语句

原型:insertAdajcentHTML(swhere,stext)

参数:

swhere: 指定插入html标签语句的地方,

stext:要插入的内容

有四种值可用:

1.     beforeBegin: 插入到标签开始前

2.     afterBegin:插入到标签开始标记之后

3.     beforeEnd:插入到标签结束标记前

4.     afterEnd:插入到标签结束标记后

实例:insertAdjacentHTML()用法

<body onload="some()">
<div id="ya">原著</div>
</body>

 function some(){
        document.all.ya.insertAdjacentHTML('afterBegin','<h1>在文本前容器内插入内容1</h1>')
        document.all.ya.insertAdjacentHTML('beforeEnd','<h2>在文本前容器内插入内容2</h2>')
        document.all.ya.insertAdjacentHTML('beforeBegin','<h4>在文本前容器内插入内容3</h4>')
        document.all.ya.insertAdjacentHTML('afterEnd','<h5>在文本前容器内插入内容4</h5>')
    }

creatDocumentFragment() 创建空文档片段

pageXOffset()  pageYOffset()   设置或返回当前页面相对于窗口显示区左上角的 X 位置。pageYOffset 设置或返回当前页面相对于窗口显示区左上角的 Y 位置

语法:

window.pageXOffset
window.pageYOffset

注意: IE 8 及 更早 IE 版本不支持该属性,但可以使用 "document.body.scrollLeft" 和 "document.body.scrollTop" 属性 

怪异模式下下在文档的<body>元素(document.body)上查询

实例:

滚动100个像素的内容,并弹出pageXOffset和pageYOffset

function scrollWindow(){
    window.scrollBy(100,100)
    alert("pageXOffset: " + window.pageXOffset + ", pageYOffset: " + window.pageYOffset)
}

<input type="button" onclick="scrollWindow()" value="滚动" />
<p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动</p>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动</p>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<p>滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动 滚动</p>

jquery CSS操作 -- scrollLeft()  方法返回或设置匹配元素的滚动条的水平位置

滚动条的水平位置指的是从其左侧滚动过的像素数。当滚动条位于最左侧时,位置是 0

语法:$(selector).scrollLeft()

 实例1:

设置 <div> 元素中滚动条的水平偏移

$(document).ready(function(){
  $("button").click(function(){
    $("div").scrollLeft(100);
  });
});

<div style="border:1px solid black;width:100px;height:130px;overflow:auto">
The longest word in the english dictionary is: pneumonoultramicroscopicsilicovolcanoconiosis.
</div>
<button class="btn1">把滚动条的水平位置设置为 100px</button>

实例2:

返回水平滚动条位置

返回第一个匹配元素的水平滚动条位置。

语法:$(selector).scrollLeft()

$(document).ready(function(){
  $(".btn1").click(function(){
    alert($("div").scrollLeft()+" px");
  });
});

<div style="border:1px solid black;width:100px;height:130px;overflow:auto">
The longest word in the english dictionary is: pneumonoultramicroscopicsilicovolcanoconiosis.
</div>
<button class="btn1">获得滚动条的水平位置</button>
<p>试着移动滚动条,然后再次点击按钮。</p>

实例3:

设置水平滚动条位置

设置所有匹配元素的水平滚动条位置。

语法:$(selector).scrollLeft(position)

$(document).ready(function(){
  $("button").click(function(){
    $("div").scrollLeft(100);
  });
});

<div style="border:1px solid black;width:100px;height:130px;overflow:auto">
The longest word in the english dictionary is: pneumonoultramicroscopicsilicovolcanoconiosis.
</div>
<button class="btn1">把滚动条的水平位置设置为 100px</button>

innerheight()  innerwidth ()

定义和用法

只读属性,声明了窗口的文档显示区的高度和宽度,以像素计。

这里的宽度和高度不包括菜单栏、工具栏以及滚动条等的高度。

IE 不支持这些属性。它用 document.documentElement 或 document.body (与 IE 的版本相关)的 clientWidth 和 clientHeight 属性作为替代。

getBoundingClientRect()

getBoundingClientRect用于获取某个元素相对于视窗的位置集合。集合中有top, right, bottom, left等属性

 语法:这个方法没有参数

rectObject = object.getBoundingClientRect()

返回值类型:TextRectangle对象,每个矩形具有四个整数性质( 上, 右 , 下,和左 )表示的坐标的矩形,以像素为单位

   rectObject.top:元素上边到视窗上边的距离;

 rectObject.right:元素右边到视窗左边的距离;

 rectObject.bottom:元素下边到视窗上边的距离;

 rectObject.left:元素左边到视窗左边的距离;

 

               

width和height:ie9以上支持width/height属性

但在原始的IE中未实现:

var box = e.getBoundingClientRect();
var w = box.width || (box.right - box.left);
var h = box.height || (box.bottom - box.top)

兼容ie6~ie8的width/height的写法:

var rectWidth = rectObject.right - rectObject.left;
    rectHeight = rectObject.bottom - rectObject.top;

ie7及ie7以下会多出两个像素

解决方法如下:

var rectLeft = rectObject.left - document.documentElement.clientLeft || 2;
    rectRight = rectObject.right - document.documentElement.clientLeft || 2;
    rectBottom = rectObject.bottom - document.documentElement.clientTop || 2;
    rectTop = rectObject.top - document.documentElement.clientTop || 2;

附原文:http://www.cnblogs.com/Songyc/p/4458570.html

附offset,scroll,client详解链接:http://www.jb51.net/article/35478.htm

document.elementFromPoint()    判定元素在某点(接上)

 每个HTML元素都有一下属性:

<form>表单

//id为"shipping"的表单中所得的单选按钮
document.querySelectorAll('#shipping input[type="radio"]');
//id为"shipping"的表单中所有名字为"method"的单选按钮
document.querySelectorAll('#shipping input[type="radio"][name="method"]');

有name或id属性的<form>元素能够通过很多方法来选取。 name="address" 属性的<form>可以用以下任何方法来选取:

如果address的表单第一个元素的name是"street",可以使用以下任何一种表达式来引用该元素:

如果要明确的选取一个表单元素,可以索引表单对象的elements属性:

考虑以下表单,它包含多个单选按钮来选择运输方式:

<form name="shop">
        <fieldset>
            <legend>Shop Method</legend>
            <label>
                <input type="radio" name="method" value="1st">first-class
            </label>
            <label>
                <input type="radio" name="method" value="2day">2-day Air
            </label>
            <label>
                <input type="radio" name="method" value="overnite">Overnight
            </label>
        </fieldset>
</form>

//对于该表单,用如下代码来引用单选按钮元素数组:
var methods = document.forms.shop.elements.method;   //引用单选按钮的元素数组
console.log(methods);  //[input, input, input, value: ""] input数组

//注意,<form>元素本身有一个HTML属性和对应的Javascript属性叫"method",所以在此案例中,必须要用该表单的elements属性而非直接访问method属性。为了判定用户选取哪种运输方式,需要遍历数组中的表单元素并检测它们的checked属性:

var shop_method;
    for(var i=0;i<methods.length;++i){
        console.log(methods[i]);   //<input type="radio" name="method" value="1st">
        if(methods[i].checked)
            shop_method = methods[i].value;
    }

form对象的submit()方法来提交表单,调用reset()方法来重置表单元素的值

通过onreset事件提醒用户来确认是否重置:

<form name="shop" onreset="return confirm('Really erase ALL input and start over?')">
<button type="reset">Clear and Start Over</button>
</form>

查询选取的文本

有时判定用户在文档中选取了哪些文本非常有用。可以用类似如下的函数达到目的:

 function getSelectedText(){
       if(window.getSelection) return window.getSelection().toString();   //HTML5标准API
       else if(document.selection) return document.selection.createRange().text;   //IE特有的技术
    }

如上代码在书签工具中特别有用,它操作选取的文本,然后利用搜索引擎或参考站点查找某个单词。例如,如下HTML链接在Wikipedia上查找当前选取的文本。收藏书签后,该链接和它包含的javascriptURL就变成了一个书签工具:

<a href="javascript:var q;
   if(window.getSelection) q = window.getSelection().toString();
   else if(document.selection) q = window.selection.createRange().text;
   void window.open('http://en.wikipedia.org/wiki/' + q)
">Look Up Selected Text In Wikipedia</a>

上述展示的查询选取代码兼容性不佳,window对象的getSelection()方法无法返回那些表单元素<input>或<textarea>内部选中的文本,它只返回在文档主体本身中选取的文本。另一方面,IE的document.selection属性可以返回文档中任意地方选取的文本。

从文本输入域或<textarea>元素中获取选取的文本可使用一下代码:

elt.value.substring(elt.selectionStart,elt.selectionEnd);

IE8以及更早版本的浏览器不支持selectionStart和selectionEnd属性。

可编辑的内容

有两种方法来启用编辑功能:其一,设置任何标签的HTML contenteditable属性;其二,设置对应元素的javascript contenteditable属性;这都将使得元素的内容变成可编辑。

<div contenteditable="true">可编辑</div>

//当contenteditable = true  表示可编辑,当等于false 表示不可编辑

将Document对象的designMode属性设置为字符串 “on” 使得整个文档可编辑,设置为 “off” 将恢复为只读文档(不可编辑)。designMode属性并没有对应的HTML属性。

<iframe id="edt" src="about:blank"> <!--空iframe-->

var edt = document.getElementById('edt');    //获得iframe中的文档对象
edt.contentDocument.designMode = "on";    //开启编辑

当谈到它们实际的可编辑行为时,它们是不太兼容的。

setSelectionRange HTML文档/文字内容选中(未完待续......)

<p><input type="text" id="mytextbox" size="20" value="Mozilla"/></p>
<p><button onclick="SelectText()">Select text</button></p>

function SelectText () {
            var input = document.getElementById("mytextbox");
            input.focus();
            input.setSelectionRange(2,5);  //第二个到第五个被选中的文字
       }

execCommand()

语法:bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)

返回值:

一个 Boolean ,如果是 false 则表示操作不被支持或未被启用

参数:

命令:

 实例:

<p>点击复制后在右边textarea CTRL+V看一下</p>
<input type="text" id="inputText" value="测试文本"/>
<input type="button" id="btn" value="复制"/>
<textarea rows="4"></textarea>

var btn = document.getElementById('btn');
        btn.addEventListener('click', function(){
            var inputText = document.getElementById('inputText');
            var currentFocus = document.activeElement;  //获取页面焦点
            inputText.focus();   //获取文本焦点
            console.log(inputText.value.length);
            inputText.setSelectionRange(0, inputText.value.length);  //
            document.execCommand('copy', true);   //复制文本
            currentFocus.focus();
     });

更多命令查看地址:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/execCommand

execCommand()所支持的命令通常是由工具栏上的按钮触发的。当要触发的命令不可用时,良好的UI会使对应的按钮无效。调用document.queryCommandEnabled()来查询当前所使用的命令,或者查询浏览器是否支持该命令。

fontname()命令使用document.queryCommandValue()查询

如果当前选取的文本使用了两种不同的字体“fontname”的查询结果是不确定的。使用document.queryCommandIndeterm()来检测这种情况。

命令:

 互操作命令列表,请参见:https://www.quirksmode.org/dom/execCommand.html

 

posted @ 2017-04-19 18:04  JoyJin  阅读(488)  评论(0编辑  收藏  举报