getset.html 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>ideal</title>
  5. <meta charset="utf-8">
  6. </head>
  7. <body>
  8. <div id="test">
  9. <p>{{msg}}</p>
  10. <p>{{msg}}</p>
  11. <p>{{msg}}</p>
  12. <p>{{what}}</p>
  13. <p>{{hey}}</p>
  14. </div>
  15. <script>
  16. var bindingMark = 'data-element-binding'
  17. function Element (id, initData) {
  18. var self = this,
  19. el = self.el = document.getElementById(id)
  20. bindings = {} // the internal copy
  21. data = self.data = {} // the external interface
  22. content = el.innerHTML.replace(/\{\{(.*)\}\}/g, markToken)
  23. el.innerHTML = content
  24. for (var variable in bindings) {
  25. bind(variable)
  26. }
  27. if (initData) {
  28. for (var variable in initData) {
  29. data[variable] = initData[variable]
  30. }
  31. }
  32. function markToken (match, variable) {
  33. bindings[variable] = {}
  34. return '<span ' + bindingMark + '="' + variable +'"></span>'
  35. }
  36. function bind (variable) {
  37. bindings[variable].els = el.querySelectorAll('[' + bindingMark + '="' + variable + '"]')
  38. ;[].forEach.call(bindings[variable].els, function (e) {
  39. e.removeAttribute(bindingMark)
  40. })
  41. Object.defineProperty(data, variable, {
  42. set: function (newVal) {
  43. [].forEach.call(bindings[variable].els, function (e) {
  44. bindings[variable].value = e.textContent = newVal
  45. })
  46. },
  47. get: function () {
  48. return bindings[variable].value
  49. }
  50. })
  51. }
  52. }
  53. var app = new Element('test', {
  54. msg: 'hello'
  55. })
  56. </script>
  57. </body>
  58. </html>