• v0.13+" level="1">事件冒泡 v0.13+
    • 使用
    • 注意
    • stopPropagation

    v0.13+" class="reference-link">事件冒泡 v0.13+

    Weex 2.0 实现了 W3C 标准的事件冒泡机制。

    使用

    1. <template>
    2. <div class="root" @click="rootClick" bubble="true">
    3. <text style="font-size: 40px;">{{rootText}}</text>
    4. <div class="outer" @click="parentClick">
    5. <div>
    6. <text style="font-size: 40px;">{{parentText}}</text>
    7. </div>
    8. <text class="inner" @click="click">{{innerText}}</text>
    9. </div>
    10. </div>
    11. </template>
    12. <script>
    13. module.exports = {
    14. data: {
    15. innerText: 'click me',
    16. parentText: '',
    17. rootText: ''
    18. },
    19. methods: {
    20. click: function(e) {
    21. this.innerText = 'inner bubble'
    22. },
    23. parentClick: function(e) {
    24. this.parentText = 'parent bubble'
    25. },
    26. rootClick: function(e) {
    27. this.rootText = 'root bubble'
    28. }
    29. }
    30. }
    31. </script>
    32. <style scoped>
    33. .inner {
    34. font-size: 40px;
    35. text-align: center;
    36. background-color: #7a9b1b;
    37. padding: 40px;
    38. }
    39. .outer {
    40. font-size: 40px;
    41. text-align: center;
    42. background-color: #9b7a1b;
    43. padding: 120px;
    44. }
    45. .root {
    46. font-size: 40px;
    47. text-align: center;
    48. background-color: #7a1b9b;
    49. padding: 80px;
    50. }
    51. </style>

    try it

    运行以上代码,用客户端打开,点击中间的元素,可以看到事件向上传播,依次触发。

    注意

    需要注意的是: 为了兼容之前的版本,Weex 默认不会开启事件冒泡机制。需要在根元素的属性上,添加 bubble="true" 来开启冒泡机制。否则,将不会向上传播事件,保持与之前版本的效果相同。

    stopPropagation

    在事件处理函数中,可以使用 e.stopPropagation() 方法,来阻止本次事件向上的传递过程。注意,e.stopPropagation()bubble="true" 不同,前者只会影响当前元素以及父元素的传播,不会影响子元素的传播;后者是为了版本兼容而增加的开关机制,会全局关闭或者开启冒泡机制,两者可以共同存在使用,如下:

    1. <template>
    2. <div class="root" @click="rootClick" bubble="true">
    3. <text style="font-size: 40px;">{{rootText}}</text>
    4. <div class="outer" @click="parentClick">
    5. <div>
    6. <text style="font-size: 40px;">{{parentText}}</text>
    7. </div>
    8. <text class="inner" @click="click">{{innerText}}</text>
    9. </div>
    10. </div>
    11. </template>
    12. <script>
    13. module.exports = {
    14. data: {
    15. innerText: 'click me',
    16. parentText: '',
    17. rootText: ''
    18. },
    19. methods: {
    20. click: function(e) {
    21. this.innerText = 'inner bubble'
    22. },
    23. parentClick: function(e) {
    24. this.parentText = 'parent bubble'
    25. e.stopPropagation()
    26. },
    27. rootClick: function(e) {
    28. this.rootText = 'root bubble'
    29. // e.stopPropagation()
    30. }
    31. }
    32. }
    33. </script>
    34. <style scoped>
    35. .inner {
    36. font-size: 40px;
    37. text-align: center;
    38. background-color: #7a9b1b;
    39. padding: 40px;
    40. }
    41. .outer {
    42. font-size: 40px;
    43. text-align: center;
    44. background-color: #9b7a1b;
    45. padding: 120px;
    46. }
    47. .root {
    48. font-size: 40px;
    49. text-align: center;
    50. background-color: #7a1b9b;
    51. padding: 80px;
    52. }
    53. </style>

    try it

    运行以上代码,用客户端打开,点击中间的元素,可以看到事件向上传播到父元素被终止,不再继续往根元素传播。