range.rst 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. Range API
  2. ========================================================
  3. .. contents::
  4. :depth: 2
  5. .. index:: K.range
  6. .. _K.range:
  7. K.range(mixed)
  8. --------------------------------------------------------
  9. 创建或选取KRange对象,KRange是原生Range的封装,包含大部分W3C Range接口,此外还有包含KRange和原生Range之间的转换功能。
  10. * 参数:
  11. * document|range mixed: document或原生range
  12. * 返回: KRange对象
  13. 示例:
  14. .. sourcecode:: js
  15. range = K.range(document);
  16. range = K.range(originalRange);
  17. .. note::
  18. DOM Level 2 Range Reference: http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
  19. .. index:: START_TO_START
  20. .. _START_TO_START:
  21. K.START_TO_START
  22. --------------------------------------------------------
  23. 调用 :ref:`KRange.compareBoundaryPoints` 时使用。
  24. .. index:: START_TO_END
  25. .. _START_TO_END:
  26. K.START_TO_END
  27. --------------------------------------------------------
  28. 调用 :ref:`KRange.compareBoundaryPoints` 时使用。
  29. .. index:: END_TO_END
  30. .. _END_TO_END:
  31. K.END_TO_END
  32. --------------------------------------------------------
  33. 调用 :ref:`KRange.compareBoundaryPoints` 时使用。
  34. .. index:: END_TO_START
  35. .. _END_TO_START:
  36. K.END_TO_START
  37. --------------------------------------------------------
  38. 调用 :ref:`KRange.compareBoundaryPoints` 时使用。
  39. .. index:: startContainer
  40. .. _KRange.startContainer:
  41. startContainer
  42. --------------------------------------------------------
  43. range的开始节点。
  44. .. index:: startOffset
  45. .. _KRange.startOffset:
  46. startOffset
  47. --------------------------------------------------------
  48. range的开始节点位置。
  49. .. index:: endContainer
  50. .. _KRange.endContainer:
  51. endContainer
  52. --------------------------------------------------------
  53. range的结束节点。
  54. .. index:: endOffset
  55. .. _KRange.endOffset:
  56. endOffset
  57. --------------------------------------------------------
  58. range的结束节点的位置。
  59. .. index:: collapsed
  60. .. _KRange.collapsed:
  61. collapsed
  62. --------------------------------------------------------
  63. range的折叠状态,当range处于折叠状态时true,否则false。。
  64. .. index:: commonAncestor
  65. .. _KRange.commonAncestor:
  66. commonAncestor()
  67. --------------------------------------------------------
  68. 取得KRange的共同祖先。
  69. * 参数: 无
  70. * 返回: Element
  71. 示例:
  72. .. sourcecode:: js
  73. var range = K.range(document);
  74. var element = range.commonAncestor();
  75. .. index:: setStart
  76. .. _KRange.setStart:
  77. setStart(node , offset)
  78. --------------------------------------------------------
  79. 设置KRange的开始节点和位置。
  80. * 参数:
  81. * Node node: 任意节点
  82. * Int offset: 位置
  83. * 返回: KRange
  84. 示例:
  85. .. sourcecode:: js
  86. var range = K.range(document);
  87. range.setStart(document.body, 1);
  88. .. index:: setEnd
  89. .. _KRange.setEnd:
  90. setEnd(node , offset)
  91. --------------------------------------------------------
  92. 设置KRange的结束节点和位置。
  93. * 参数:
  94. * Node node: 任意节点
  95. * Int offset: 位置
  96. * 返回: KRange
  97. 示例:
  98. .. sourcecode:: js
  99. var range = K.range(document);
  100. range.setEnd(document.body, 2);
  101. .. index:: setStartBefore
  102. .. _KRange.setStartBefore:
  103. setStartBefore(node)
  104. --------------------------------------------------------
  105. 将Node的开始位置设置成Range的开始位置。
  106. * 参数:
  107. * Node node: 任意节点
  108. * 返回: KRange
  109. 示例:
  110. .. sourcecode:: js
  111. var range = K.range(document);
  112. range.setStartBefore(K('div#id')[0]);
  113. .. index:: setStartAfter
  114. .. _KRange.setStartAfter:
  115. setStartAfter(node)
  116. --------------------------------------------------------
  117. 将Node的结束位置设置成Range的开始位置。
  118. * 参数:
  119. * Node node: 任意节点
  120. * 返回: KRange
  121. 示例:
  122. .. sourcecode:: js
  123. var range = K.range(document);
  124. range.setStartAfter(K('div#id')[0]);
  125. .. index:: setEndBefore
  126. .. _KRange.setEndBefore:
  127. setEndBefore(node)
  128. --------------------------------------------------------
  129. 将Node的开始位置设置成Range的结束位置。
  130. * 参数:
  131. * Node node: 任意节点
  132. * 返回: KRange
  133. 示例:
  134. .. sourcecode:: js
  135. var range = K.range(document);
  136. range.setEndBefore(K('div#id')[0]);
  137. .. index:: setEndAfter
  138. .. _KRange.setEndAfter:
  139. setEndAfter(node)
  140. --------------------------------------------------------
  141. 将Node的结束位置设置成Range的结束位置。
  142. * 参数:
  143. * Node node: 任意节点
  144. * 返回: KRange
  145. 示例:
  146. .. sourcecode:: js
  147. var range = K.range(document);
  148. range.setEndAfter(K('div#id')[0]);
  149. .. index:: selectNode
  150. .. _KRange.selectNode:
  151. selectNode(node)
  152. --------------------------------------------------------
  153. 将Node的开始位置和结束位置分别设置成Range的开始位置和结束位置。
  154. * 参数:
  155. * Node node: 任意节点
  156. * 返回: KRange
  157. 示例:
  158. .. sourcecode:: js
  159. var range = K.range(document);
  160. range.selectNode(K('div#id')[0]);
  161. .. index:: selectNodeContents
  162. .. _KRange.selectNodeContents:
  163. selectNodeContents(node)
  164. --------------------------------------------------------
  165. 将Node的子节点的开始位置和结束位置分别设置成Range的开始位置和结束位置。对于文本节点和无结束符的元素,相当于使用selectNode。
  166. * 参数:
  167. * Node node: 任意节点
  168. * 返回: KRange
  169. 示例:
  170. .. sourcecode:: js
  171. var range = K.range(document);
  172. range.selectNodeContents(K('div#id')[0]);
  173. .. index:: collapse
  174. .. _KRange.collapse:
  175. collapse(toStart)
  176. --------------------------------------------------------
  177. 折叠KRange,当toStart为true时向前折叠,false时向后折叠。
  178. * 参数:
  179. * Boolean toStart: 折叠方向
  180. * 返回: KRange
  181. 示例:
  182. .. sourcecode:: js
  183. var range = K.range(document);
  184. range.selectNodeContents(K('div#id')[0]);
  185. range.collapse(true);
  186. .. index:: compareBoundaryPoints
  187. .. _KRange.compareBoundaryPoints:
  188. compareBoundaryPoints(how , range)
  189. --------------------------------------------------------
  190. 根据how参数比较2个range的边界。
  191. * 参数:
  192. * Int how: 位置信息,可设置K.START_TO_START、K.START_TO_END、K.END_TO_END、K.END_TO_START。
  193. * Range range: 目标Range
  194. * 返回: 当this range在目标range的左侧时返回-1,在目标range的右侧时返回1,相同时返回0。
  195. how参数的方向规则:
  196. * K.START_TO_START:比较目标range的开始位置和this range的开始位置。
  197. * K.START_TO_END:比较目标range的开始位置和this range的结束位置。
  198. * K.END_TO_END:比较目标range的结束位置和this range的结束位置。
  199. * K.END_TO_START:比较目标range的结束位置和this range的开始位置。
  200. 示例:
  201. .. sourcecode:: js
  202. var range1 = K.range(document);
  203. range1.selectNode(K('div#id')[0]);
  204. var range2 = K.range(document);
  205. range2.selectNode(K('div#id p')[0]);
  206. var cmp = range1.compareBoundaryPoints(K.START_TO_START, range2);
  207. .. index:: cloneRange
  208. .. _KRange.cloneRange:
  209. cloneRange()
  210. --------------------------------------------------------
  211. 复制KRange。
  212. * 参数: 无
  213. * 返回: KRange
  214. 示例:
  215. .. sourcecode:: js
  216. var range = K.range(document);
  217. range.selectNodeContents(K('div#id')[0]);
  218. var newRange = range.cloneRange();
  219. .. index:: toString
  220. .. _KRange.toString:
  221. toString()
  222. --------------------------------------------------------
  223. 返回KRange的文本内容。
  224. * 参数: 无
  225. * 返回: String
  226. 示例:
  227. .. sourcecode:: js
  228. var range = K.range(document);
  229. range.selectNodeContents(K('div#id')[0]);
  230. var text = range.toString();
  231. .. index:: cloneContents
  232. .. _KRange.cloneContents:
  233. cloneContents()
  234. --------------------------------------------------------
  235. 复制并返回KRange的内容。
  236. * 参数: 无
  237. * 返回: documentFragment
  238. 示例:
  239. .. sourcecode:: js
  240. var range = K.range(document);
  241. range.selectNodeContents(K('div#id')[0]);
  242. var fragment = range.cloneContents();
  243. .. index:: deleteContents
  244. .. _KRange.deleteContents:
  245. deleteContents()
  246. --------------------------------------------------------
  247. 删除KRange的内容。
  248. * 参数: 无
  249. * 返回: KRange
  250. 示例:
  251. .. sourcecode:: js
  252. var range = K.range(document);
  253. range.selectNodeContents(K('div#id')[0]);
  254. range.deleteContents();
  255. .. index:: extractContents
  256. .. _KRange.extractContents:
  257. extractContents()
  258. --------------------------------------------------------
  259. 删除并返回KRange的内容。
  260. * 参数: 无
  261. * 返回: documentFragment
  262. 示例:
  263. .. sourcecode:: js
  264. var range = K.range(document);
  265. range.selectNodeContents(K('div#id')[0]);
  266. var fragment = range.extractContents();
  267. .. index:: insertNode
  268. .. _KRange.insertNode:
  269. insertNode(node)
  270. --------------------------------------------------------
  271. 将指定Node插入到KRange的开始位置。
  272. * 参数:
  273. * Node node: 任意Node或documentFragment
  274. * 返回: KRange
  275. 示例:
  276. .. sourcecode:: js
  277. var range = K.range(document);
  278. range.selectNodeContents(K('#id1')[0]);
  279. range.insertNode(K('#id2')[0]);
  280. .. index:: surroundContents
  281. .. _KRange.surroundContents:
  282. surroundContents(node)
  283. --------------------------------------------------------
  284. 用指定Node围住KRange的内容。
  285. * 参数:
  286. * Element node: 任意节点
  287. * 返回: KRange
  288. 示例:
  289. .. sourcecode:: js
  290. var range = K.range(document);
  291. range.selectNodeContents(K('#id1')[0]);
  292. range.surroundContents(K('#id2')[0]);
  293. .. index:: isControl
  294. .. _KRange.isControl:
  295. isControl()
  296. --------------------------------------------------------
  297. 判断当前KRange是否可选择的Contral Range。
  298. * 参数: 无
  299. * 返回: Boolean
  300. 示例:
  301. .. sourcecode:: js
  302. var range = K.range(document);
  303. range.selectNodeContents(K('#id1')[0]);
  304. var bool = range.isControl();
  305. .. index:: get
  306. .. _KRange.get:
  307. get([hasControlRange])
  308. --------------------------------------------------------
  309. 将KRange转换成原生Range并返回。
  310. * 参数:
  311. * Boolean hasControlRange: 是否包含Contral Range
  312. * 返回: Range
  313. 示例:
  314. .. sourcecode:: js
  315. var range = K.range(document);
  316. range.selectNodeContents(K('#id1')[0]);
  317. var originalRange = range.get();
  318. .. index:: html
  319. .. _KRange.html:
  320. html()
  321. --------------------------------------------------------
  322. 返回KRange内容的HTML。
  323. * 参数: 无
  324. * 返回: HTML string
  325. 示例:
  326. .. sourcecode:: js
  327. var range = K.range(document);
  328. range.selectNodeContents(K('#id1')[0]);
  329. var html = range.html();
  330. .. index:: down
  331. .. _KRange.down:
  332. down()
  333. --------------------------------------------------------
  334. 降低range的位置。
  335. * 参数: 无
  336. * 返回: KRange
  337. 示例:
  338. .. sourcecode:: js
  339. // <p><strong><span>123</span>abc</strong>def</p>
  340. range.setStart(strong, 1);
  341. range.down();
  342. console.log(range.startContainer, range.startOffset); // print "abc", 0
  343. .. index:: up
  344. .. _KRange.up:
  345. up()
  346. --------------------------------------------------------
  347. 提高range的位置。
  348. * 参数: 无
  349. * 返回: KRange
  350. 示例:
  351. .. sourcecode:: js
  352. // <p><strong><span>123</span>abc</strong>def</p>
  353. range.setStart("abc", 0);
  354. range.up();
  355. console.log(range.startContainer, range.startOffset); // print strong, 1
  356. .. index:: enlarge
  357. .. _KRange.enlarge:
  358. enlarge()
  359. --------------------------------------------------------
  360. 扩大边界。
  361. * 参数: 无
  362. * 返回: KRange
  363. 示例:
  364. .. sourcecode:: js
  365. // <p><strong><span>123</span>abc</strong>def</p>
  366. range.setStart("123", 0);
  367. range.setEnd("abc", 3);
  368. range.enlarge();
  369. console.log(range.startContainer, range.startOffset); // print p, 0
  370. console.log(range.endContainer, range.endOffset); // print p, 1
  371. .. index:: shrink
  372. .. _KRange.shrink:
  373. shrink()
  374. --------------------------------------------------------
  375. 缩小边界。
  376. * 参数: 无
  377. * 返回: KRange
  378. 示例:
  379. .. sourcecode:: js
  380. // <p><strong><span>123</span>abc</strong></p>
  381. range.setStart(p, 0);
  382. range.setEnd(p, 1);
  383. range.shrink();
  384. console.log(range.startContainer, range.startOffset); // print "123", 0
  385. console.log(range.endContainer, range.endOffset); // print "abc", 3
  386. .. index:: createBookmark
  387. .. _KRange.createBookmark:
  388. createBookmark([serialize])
  389. --------------------------------------------------------
  390. 创建bookmark。(插入临时节点标记位置)
  391. * 参数:
  392. * Boolean serialize: bookmark类型,默认值为false,true时bookmark包含临时节点的ID,false时bookmark包含临时节点的Element。
  393. * 返回: bookmark
  394. 示例:
  395. .. sourcecode:: js
  396. bookmark = range.createBookmark();
  397. console.log(bookmark); // print {start: startNode, end: endNode}
  398. bookmark = range.createBookmark(true);
  399. console.log(bookmark); // print {start: 'start_node_id', end: 'end_node_id'}
  400. .. index:: moveToBookmark
  401. .. _KRange.moveToBookmark:
  402. moveToBookmark(bookmark)
  403. --------------------------------------------------------
  404. 根据bookmark重新设置range。
  405. * 参数:
  406. * Object bookmark: 通过 :ref:`KRange.createBookmark` 得到的bookmark
  407. * 返回: KRange
  408. 示例:
  409. .. sourcecode:: js
  410. bookmark = range.createBookmark();
  411. // 在这里执行一些改变DOM的处理
  412. // ...
  413. range.moveToBookmark(bookmark);