render.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. function insert_visiability_info() {
  2. function get_body() {
  3. var body = document.getElementsByTagName('body')[0]
  4. return body
  5. }
  6. function insert_info(element) {
  7. is_visiable = element.offsetParent !== null
  8. element.setAttribute('is_visiable', is_visiable)
  9. if (is_visiable) {
  10. react = element.getBoundingClientRect()
  11. coordinate = JSON.stringify(react)
  12. element.setAttribute('coordinate', coordinate)
  13. }
  14. }
  15. function iter_node(node) {
  16. children = node.children
  17. insert_info(node)
  18. if (children.length !== 0) {
  19. for(const element of children) {
  20. iter_node(element)
  21. }
  22. }
  23. }
  24. function sizes() {
  25. let contentWidth = [...document.body.children].reduce(
  26. (a, el) => Math.max(a, el.getBoundingClientRect().right), 0)
  27. - document.body.getBoundingClientRect().x;
  28. return {
  29. windowWidth: document.documentElement.clientWidth,
  30. windowHeight: document.documentElement.clientHeight,
  31. pageWidth: Math.min(document.body.scrollWidth, contentWidth),
  32. pageHeight: document.body.scrollHeight,
  33. screenWidth: window.screen.width,
  34. screenHeight: window.screen.height,
  35. pageX: document.body.getBoundingClientRect().x,
  36. pageY: document.body.getBoundingClientRect().y,
  37. screenX: -window.screenX,
  38. screenY: -window.screenY - (window.outerHeight-window.innerHeight),
  39. }
  40. }
  41. function insert_page_info() {
  42. page_info = sizes()
  43. node = document.createElement('meta')
  44. node.setAttribute('name', 'page_visiability_info')
  45. node.setAttribute('page_info', JSON.stringify(page_info))
  46. document.getElementsByTagName('head')[0].appendChild(node)
  47. }
  48. insert_page_info()
  49. body = get_body()
  50. iter_node(body)
  51. }