Framewrok7 - 页面(Page)介绍1(页面的结构、事件、以及数据)

本文详细介绍了页面结构的组织方式,包括页面元素(Page)、视图(Views)及其在DOM中的布局规则。此外,还深入解析了Page事件,如pageInit、pageBeforeAnimation等,并展示了如何通过JavaScript操作这些事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,页面结构说明
页面( Pages )和我们在在网页中打开的页面是同样的意思,比如下面一个简单的样例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
< body >
   ...
   <!-- Views -->
   < div  class = "views" >
     <!-- Your main view -->
     < div  class = "view view-main" >
       <!-- Pages -->
       < div  class = "pages" >
         < div  class = "page"  data-page = "home" >
           < div  class = "page-content" >
             ... 这里是页面内容 ...
           </ div >
         </ div >
       </ div >
     </ div >
     <!-- Another view -->
     < div  class = "view another-view" >
       <!-- Pages -->
       < div  class = "pages" >
         < div  class = "page"  data-page = "home-another" >
           < div  class = "page-content" >
             ... 这里是页面内容 ...
           </ div >
         </ div >
       </ div >
     </ div >         
   </ div >
   ...
</ body >
(1) Pages  是必须的,因为同一个  View  下所有的页面切换都在这里。
(2)每一个  Page  都应该放在  Pages  容器中( <div class="pages"> ),而  Pages  必须是  View  的子元素( <div class="view"> )。
(3)每个  Page 都有一个  data-page 属性,存储了一个唯一的  page 名。这个属性不是必须的,但是强烈推荐使用。因为这个属性在  page 事件中或者在  page 回调函数中可以用来帮助我们确定加载的是哪一个页面。
(4)所有的可见的内容,比如列表和表单等,都应该放在  <div class="page-content"> 中,它是  <div class="page"> 的子元素。这样才能保证正确的样式,布局和滚动。

2,Page 事件介绍
(1)在  Page 事件响应中,我们可以通过  JS 来操作加载好的  Page。具体的事件如下:
EventTargetDescription
pageBeforeInitPage Element
<div class="page">
当Framework7把新页面插入DOM的时候会触发
pageInitPage Element
<div class="page">
当Framework7初始化页面的组件的时候会触发
pageReinitPage Element
<div class="page">
This event will be triggered when cached page becomes visible. 
It is only applicaple for Inline Pages (DOM cached pages)
pageBeforeAnimationPage Element
<div class="page">
当页面初始化完成并且可以做动画的时候触发
pageAfterAnimationPage Element
<div class="page">
在页面动画完成之后触发
pageBeforeRemovePage Element
<div class="page">
Page从DOM中移除之前就会触发这个事件。如果你希望做一些解除事件绑定或者销毁一些插件的时候,这个方法是很有用的。
pageBackPage Element
<div class="page">
在返回上一页动画执行之前就会触发这个事件。和 "pageBeforeAnimation" 的不同之处在于,这个事件在老页面上也会触发,也就是那个从中间滑动到右边的页面。
pageAfterBackPage Element
<div class="page">
返回上一页动画执行完成之后触发这个事件。同样,区别于"pageAfterAnimation",他也会在老页面上触发。

(2)有两种方式可以使用这些事件。下面以  pageInit  事件为例:
1
2
3
4
5
6
7
8
9
10
// 方式1. 处理所有页面的pageInit事件 (推荐):
$$(document).on( 'pageInit' function  (e) {
   // 当页面加载并初始化完毕后执行一些代码....
 
})
 
// 方式2. 处理指定页面(data-page="about")的 pageInit事件 (不推荐):
$$(document).on( 'pageInit' '.page[data-page="about"]' function  (e) {
   // 当页面加载并初始化完毕后执行一些代码....
})

3,Page 数据介绍
在  Page  事件中, event  实例中包含了关于当前页面非常详细的数据。
(1)下面样例中,我们将页面数据保存到一个变量中。
1
2
3
4
$$(document).on( 'pageInit' function  (e) {
   //获取页面数据,这里面保存了所有的请求信息
   var  page = e.detail.page;
})

(2)上面将页面数据保存到一个对象中,这个对象里面包含的属性如下:
Page Data Properties
page.name就是 data-page 设定的名称
page.url当前页面的URL
page.query当前页面的get参数,是一个对象。假设你的页面URL是 "about.html?id=10&count=20&color=blue",那么query就是:
{
  id: '10',
  count: '20',
  color: 'blue'
}                  
page.viewobject. 包含当前页面的view对象(前提是view已经初始化完成)
page.containerPage 对应的 HTMLElement
page.fromstring 当前页面从哪个方向加载进来。如果是新加载的页面,则为"right",如果是返回上一步的页面,则为"left"
page.navbarInnerContainernavbar-inner" 对应的 HTMLElement,只有动态导航栏才有。
page.swipeBackboolean。当前页面是否是滑动返回的。只有在 onPageBefore/AfterAnimation 回调函数/事件 中才可以访问。
page.contextobject. 这个页面的 Template7 上下文
page.fromPageobject. 上一个页面的pageData

(3)使用样例如下。比如我们可以在一个  handler  中,根据不同的  page.name  来处理不同的页面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$$(document).on( 'pageInit' function  (e) {
     var  page = e.detail.page;
     // 处理about页面
     if  (page.name ===  'about' ) {
         // 获取url中的count参数值 (about.html?count=10)
         var  count = page.query.count;
         // 根据count生成对应数量的列表
         var  listHTML =  '<ul>' ;
         for  ( var  i = 0; i < count; i++) {
             listHTML +=  '<li>'  + i +  '</li>' ;
         }
         listHTML +=  '</ul>' ;
         // 将列表数据填充到页面内容区域上
         $$(page.container).find( '.page-content' ).append(listHTML);
     }
     // 处理services页面
     if  (page.name ===  'services' ) {
         myApp.alert( 'Here comes our services!' );
     }
});

原文出自: www.hangge.com   转载请保留原文链接: http://www.hangge.com/blog/cache/detail_1353.html
### 创建和使用弹窗 #### 使用 `PopupWindow` 实现基本弹窗 对于简单的应用内弹窗需求,可以直接利用 `PopupWindow` 类来实现。此方式适用于仅需在当前 Activity 或者 Fragment 上显示的场景。 ```java View popupView = getLayoutInflater().inflate(R.layout.popup_layout, null); final PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.showAtLocation(parentView, Gravity.CENTER, 0, 0); // 显示位置设置为中心 ``` 为了使弹窗能够覆盖其他视图并保持顶层状态,可以通过调整窗口布局类型来达到目的[^1]。 #### 系统级弹窗权限申请 针对需要跨越应用程序边界展示的系统级弹窗,则必须先声明相应的权限,并根据不同版本处理不同的参数配置: - 对于 API Level 小于 Oreo (API level 26) 的设备,应请求 `SYSTEM_ALERT_WINDOW` 权限; - 当目标 SDK 版本大于等于 Oreo 时,则应该改为请求 `SYSTEM_OVERLAY_WINDOW` 权限[^3]。 ```xml <!-- AndroidManifest.xml --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- or for newer versions --> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/> ``` 接着,在代码逻辑里判断当前系统的 API Level 并相应地设定 WindowManager 参数: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } ``` #### 复杂情况下的解决方案 然而,由于不同制造商可能对框架进行了自定义更改,单纯依靠反射调用内部方法可能会遇到兼容性问题。此时建议采用官方推荐的方式构建服务端组件,比如通过继承 `Service` 类并在其中管理浮动窗口生命周期,从而绕过潜在的安全限制[^4]。 另外一种思路是在特定条件下触发广播接收器监听事件,进而动态加载指定 UI 组件作为临时界面呈现给用户查看。这种方式不仅提高了灵活性还增强了安全性[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值