├── .gitattributes
├── .gitignore
├── Help.exe
├── Modules
├── Sciter4D.dll
└── sciter32.dll
├── README.md
├── articles
└── images
│ ├── behavior-mechanics.png
│ └── behavior-mechanics.xar
├── content
├── api
│ └── window.htm
├── behaviors
│ ├── button.htm
│ ├── calendar.htm
│ ├── check.htm
│ ├── clickable.htm
│ ├── date.htm
│ ├── decimal.htm
│ ├── edit.htm
│ ├── form.htm
│ ├── frame-set.htm
│ ├── frame.htm
│ ├── history.htm
│ ├── hyperlink.htm
│ ├── integer.htm
│ ├── label.htm
│ ├── masked-edit.htm
│ ├── menu-bar.htm
│ ├── menu.htm
│ ├── number.htm
│ ├── output.htm
│ ├── pager-behavior.htm
│ ├── password.htm
│ ├── plaintext.htm
│ ├── progress.htm
│ ├── radio.htm
│ ├── richtext.htm
│ ├── scrollbar.htm
│ ├── select-checkmarks.htm
│ ├── select-dropdown.htm
│ ├── select-multiple.htm
│ ├── select.htm
│ ├── slider.htm
│ ├── textarea.htm
│ ├── time.htm
│ ├── tree-checkmarks.htm
│ ├── tree-view.htm
│ └── video.htm
├── css
│ ├── Components_React.js_style.htm
│ ├── css-@mixin-feature.htm
│ ├── css-extensions.htm
│ ├── css-media-queries.htm
│ ├── css-properties-map.htm
│ ├── css-style-sets.htm
│ ├── css-transition-sciter.htm
│ ├── css-variables-support.htm
│ ├── expandable-images.htm
│ ├── image-map.htm
│ ├── images
│ │ ├── back-stretch.png
│ │ ├── back.png
│ │ ├── final-stretch.png
│ │ ├── final.png
│ │ ├── legos.jpg
│ │ └── schema.png
│ ├── popup-position.htm
│ └── properties.htm
├── preface.htm
├── reactor
│ ├── components.htm
│ ├── helloworld.htm
│ ├── lifecycle.htm
│ ├── lists-keys.htm
│ ├── mounting-point.htm
│ ├── preface.htm
│ ├── rendering.htm
│ └── styles-events.htm
├── sciter
│ ├── Attributes.htm
│ ├── CustomComponents.htm
│ ├── Element.htm
│ ├── Event.htm
│ ├── Events.htm
│ ├── Graphics.htm
│ ├── Image.htm
│ ├── Node.htm
│ ├── Request.htm
│ ├── Sciter.htm
│ ├── Selection.htm
│ ├── States.htm
│ ├── Style.htm
│ ├── Tokenizer.htm
│ ├── Transact.htm
│ ├── View.htm
│ └── images
│ │ ├── scroll.gif
│ │ └── scroll.vsd
└── script
│ ├── Angle.htm
│ ├── Array.htm
│ ├── Bytes.htm
│ ├── Color.htm
│ ├── Date.htm
│ ├── Error.htm
│ ├── Float.htm
│ ├── Function.htm
│ ├── Global.htm
│ ├── Index.htm
│ ├── Integer.htm
│ ├── Length.htm
│ ├── Math.htm
│ ├── Net.DataSocket.htm
│ ├── Net.Socket.htm
│ ├── Net.WebSocket.htm
│ ├── Object.htm
│ ├── RegExp.htm
│ ├── Storage.htm
│ ├── Stream.htm
│ ├── String.htm
│ ├── System.Process.htm
│ ├── System.htm
│ ├── Task.htm
│ ├── VM.htm
│ ├── XMLScanner.htm
│ └── language
│ ├── Classes.htm
│ ├── Decorators.htm
│ ├── Expressions.htm
│ ├── Functions.htm
│ ├── Statements.htm
│ ├── Syntax.htm
│ ├── Types.htm
│ ├── for-screen.css
│ ├── promise.htm
│ └── ssx.htm
├── core
├── 'this'-and-'this super'-function-arguments.htm
├── Better-CSS-sprites.htm
├── Caret-positions-in-HTML.htm
├── DOM-Inspector-how-remove-border-from-input.htm
├── Drag-and-Drop.htm
├── Formation.htm
├── Generators-and-yield.htm
├── HTML-Window.htm
├── IAccessible and UI automation testing.htm
├── Lang.htm
├── Localization.htm
├── Object-match-feature.htm
├── Plus-for-Sciter.htm
├── Promises A+.htm
├── Reusable-components.htm
├── Sciter-3.htm
├── Sciter-HTML-parsing-flavour.htm
├── Sciter-UI-application-architecture.htm
├── Sciter-UI-basic-principles.htm
├── Sciter-and-DirectX.htm
├── Sciter-on-multihead-system.htm
├── Sciter-video-support.htm
├── TIScript-syntax-compatible-with-CSS.htm
├── Theory-of-URL.htm
├── Use-of-CSS-constants-in-script.htm
├── behavior-prototype-aspect.htm
├── ccs-map.html
├── collapsed-and-expanded-state.htm
├── construction-mean-TIScript.htm
├── context-menus.htm
├── cssmap.htm
├── csss!-calc-function.htm
├── csss!-dom-object.htm
├── csss!-events.htm
├── csss!.htm
├── event_handler_assignment.htm
├── frame-content-style.htm
├── images
│ ├── css-sprites.png
│ ├── dom-inspector.png
│ ├── external-menu.png
│ ├── flat-window.png
│ ├── formation.png
│ ├── frame-extended.png
│ ├── icon_smile.gif
│ ├── images.jpg
│ ├── plus-part-0.png
│ ├── schema.png
│ ├── sciter-directx-schema.jpg
│ ├── sciter-video.jpg
│ ├── sciter.w81.gif
│ ├── standard-window.png
│ ├── transparent-window.png
│ ├── window-frame-extended-2.png
│ ├── window-layered.png
│ ├── wth.png
│ └── yield-sign-640x425.jpg
├── js-dart-tis.htm
├── js-dart-tis_files
│ ├── shBrushJScript.js
│ ├── shCore.js
│ └── shCoreDefault.css
├── new-TIScript-features.htm
├── pager-template-format.htm
├── path-images-doc.htm
├── plus-and-formation-what-the-difference.htm
├── plus.htm
├── q-doc.htm
├── sciter_for_AngularJS_practitioners.htm
├── sciter_script_hidden_treasures.htm
├── selectors.htm
├── specific-tags.htm
├── standalone_Sciter_executable.htm
├── task-await-feature.htm
├── upcomming-changes-in-4.1.html
├── visibility-none-article.htm
└── window-frame=extended.htm
├── flex-flow
├── flex-layout.css
├── flex-layout.htm
└── images
│ ├── flex-springs.png
│ ├── relative-flexes.png
│ ├── sample-horizontal-bottom.png
│ ├── sample-horizontal-fill.png
│ ├── sample-horizontal-flow.png
│ ├── sample-inline-block-1.png
│ ├── sample-inline-block-2.png
│ ├── sample-position-fixed.png
│ ├── sample-template.png
│ ├── sample-vertical-flow.png
│ └── sample-vertical.png
├── help-index.htm
├── main.htm
├── other
├── CSS3圆角样式(border-radius).doc
├── CSSS!脚本入门.doc
├── CSS属性background-position ,foreground-position用法.doc
├── CSS背景颜色半透明、渐变效果.doc
├── CSS选择器语法详解.doc
├── Data URL用法.doc
├── HTMLayout 使用 popup 弹出节点.doc
├── HTMLayout九宫格助手.exe
├── HTMLayout事件捕获与冒泡过程.doc
├── HTMLayout界面贴图技术.doc
├── HTMLayout非标准HTML标记include、widget、popup.doc
├── HTML常用标签说明.doc
├── MSAA
│ ├── MS Active Accessibility 接口技术编程尝试.doc
│ ├── MSAA简介.doc
│ └── Microsoft Active Accessibility体系结构.doc
├── MX3的皮肤引擎(HTMLayout)特性.doc
├── Sciter中的INPUT、WIDGET以及其他自定义元素.doc
├── Sciter是什么.doc
├── Sciter的10年之路.doc
├── Sciter简介.doc
├── Sciter绑定事件.doc
├── Stock URL用法.doc
├── UI编程的思考.doc
├── 什么是原型(Prototype).doc
├── 从实现的角度看闭包.doc
└── 如何在工作线程中执行GUI线程的代码.doc
├── sciter3.ppt
├── sciter4d
└── behaviors
│ ├── RouteManager.txt
│ ├── draggable.txt
│ ├── menutab.txt
│ └── windowCommand.txt
├── scripts
├── indexer.tis
├── lib_search.tis
└── toc.tis
├── snapshot.png
├── styles
├── autozoom.tis
├── content.css
├── lib_search.css
└── main.css
├── the.scapp
├── tiscript-article.htm
└── webdoc.css
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 |
17 | # Windows shortcuts
18 | *.lnk
19 |
20 | # =========================
21 | # Operating System Files
22 | # =========================
23 |
24 | # OSX
25 | # =========================
26 |
27 | .DS_Store
28 | .AppleDouble
29 | .LSOverride
30 |
31 | # Thumbnails
32 | ._*
33 |
34 | # Files that might appear in the root of a volume
35 | .DocumentRevisions-V100
36 | .fseventsd
37 | .Spotlight-V100
38 | .TemporaryItems
39 | .Trashes
40 | .VolumeIcon.icns
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
--------------------------------------------------------------------------------
/Help.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/Help.exe
--------------------------------------------------------------------------------
/Modules/Sciter4D.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/Modules/Sciter4D.dll
--------------------------------------------------------------------------------
/Modules/sciter32.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/Modules/sciter32.dll
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # sciter的中文帮助
2 | sciter渲染引擎的帮助的中文版
3 |
4 | 
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/articles/images/behavior-mechanics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/articles/images/behavior-mechanics.png
--------------------------------------------------------------------------------
/articles/images/behavior-mechanics.xar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/articles/images/behavior-mechanics.xar
--------------------------------------------------------------------------------
/content/behaviors/button.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:button
7 | 标准按钮行为。它可以应用到任何DOM元素上,并使该元素可聚焦和可点击(clickable,即可以接收到BUTTON_CLICK事件)。
8 | 元素
9 | 默认情况下,应用了behavior:button行为的元素有:
10 |
11 | <button></button>
12 | <input type=button>
13 | <input type=reset>
14 | <input type=submit>
15 | 示例
16 |
17 |
18 |
19 | 属性
20 | 该行为需要知道的属性:
21 |
22 | value="string"
- 按钮的标题,即<input type=button>按钮上应该出现的文字。
23 | name="name"
- 标准的name 属性 - from表单上一个input元素的名称。
24 | 事件
25 | 除了标准事件集(鼠标、按键、聚焦)外,behavior:button行为还生成:
26 |
27 | BUTTON_CLICK 事件, 当鼠标在按钮上按下/按起或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
28 | BUTTON_PRESS 事件, 当鼠标在按钮上按下或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
29 | 方法
30 | N/A - behavior:button没有引入任何特有的方法。
31 | value
32 | true/false - 只读, 反映按钮是否按下的状态值。
33 | 脚本中的按钮点击事件处理
34 | onClick
事件
35 | var btn = $(button#some);
36 | btn.onClick = function() { ... 事件处理代码 ... }
37 |
38 | on()
订阅
39 | var btn = $(button#some);
40 | btn.on("click", function() { ... 事件处理代码 ... });
41 | self.on("click", "button#some", function() { ... 事件处理代码 ... });
42 |
43 | decorators.tis 装饰器
44 | include "decorators.tis";
45 | @click @on "button#some" :: ... 事件处理代码 ...;
46 |
47 |
48 |
--------------------------------------------------------------------------------
/content/behaviors/calendar.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: calendar
8 | calendar是一个日期输入元素,它允许用户选择一个特定的日期。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="calendar" />
- 行内日期输入元素
13 | 示例
14 |
15 |
16 |
17 | 模型
18 | calendar有以下4种不同的视图模式:
19 |
20 | 十年视图 - 每个单元格为一个10年的时间段
21 | 年视图 - 每个单元格为一年
22 | 月视图 - 每个单元格为一个月
23 | 日视图 - 每个单元格为一天
24 | 每种模式使用一个<table>来渲染视图的内容。如果使用DOM捡拾器(inspector)就会发现每个视图的DOM结构。如果你需要重定义calandar的内容样式时,可以在CSS中直接使用这些DOM元素。
25 | 属性
26 | 该行为需要知道的属性:
27 |
28 | value="YYYY-MM-DD"
- 初始化日期, ISO 8601格式的字符串。
29 | 事件
30 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
31 |
32 | SELECT_STATE_CHANGED 事件 - 当视图被改变(如月份被改变)时生成该事件,该事件为异步事件。
33 | SELECT_SELECTION_CHANGED 事件 - 当日期被改变时生成该事件,该事件为异步事件。
34 | value
35 | Date值 或 undefined, 反应当前的选择内容。
36 | 方法
37 | N/A - 该行为没有引入任何特有的方法。
38 |
39 |
--------------------------------------------------------------------------------
/content/behaviors/check.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior:check
8 | 标准的复选框行为。它可以应用到任何需要切换:checked状态的DOM元素上。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="checkbox">
- 标准的HTML行内复选按钮;
13 | <button type="checkbox">
- Windows外观的复选按钮, 请这样使用它<button type=checkbox>caption</button>
.
14 | 示例
15 |
16 | 复选框1
17 | 复选框2
18 | 复选框3
19 |
20 | 属性
21 | 该行为需要知道的属性:
22 |
23 | checked
- 如果提供了该属性,则将会初始化元素的运行期状态添加checked 标志。
24 | mixed
- 如果提供了该属性,则该元素将有三种状态:选中(true)、未选中(undefined)、部分选中(undefined)。
25 | name="name"
- 标准的name 属性 - from表单上一个input元素的名称。
26 | value="..."
- 标准的value属性(用于behavior:form
)。
27 | 事件
28 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
29 |
30 | BUTTON_STATE_CHANGED 事件 - 当按钮修改了它的选中状态时生成该事件。该事件为异步事件。
31 | BUTTON_PRESS 事件 - 当鼠标在该按钮上按下或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
32 | value
33 | true/false
, 反映按钮的当前状态是否包含:checked
标志。
34 | 方法
35 | N/A - 该行为没有引入任何特有的方法。
36 |
37 |
38 |
--------------------------------------------------------------------------------
/content/behaviors/clickable.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:clickable
7 | 可点击但不聚焦的行为。一个轻量的按钮行为(在发生MOUSE_DOWN/UP事件时生成BUTTON_CLICK事件)。
8 | 元素
9 | 默认情况下,应用了behavior:clickable行为的元素有:
10 |
11 | <toolbar><button></button></toolbar>
12 | 示例
13 |
14 | button1
15 |
16 | 属性
17 | N/A
18 | 事件
19 | 除了标准事件集(鼠标、按键、聚焦)外,behavior:clickable行为还生成:
20 |
21 | BUTTON_CLICK 事件, 当鼠标在按钮上按下/按起或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
22 | BUTTON_PRESS 事件, 当鼠标在按钮上按下或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
23 | 方法
24 | N/A - behavior:clickable没有引入任何特有的方法。
25 | value
26 | N/A
27 | 脚本中的按钮点击事件处理
28 | onClick
事件
29 | var btn = $(button#some);
30 | btn.onClick = function() { ... 事件处理代码 ... }
31 |
32 | on()
订阅
33 | var btn = $(button#some);
34 | btn.on("click", function() { ... 事件处理代码 ... });
35 | self.on("click", "button#some", function() { ... 事件处理代码 ... });
36 |
37 | decorators.tis 装饰器
38 | include "decorators.tis";
39 | @click @on "button#some" :: ... 事件处理代码 ...;
40 |
41 |
42 |
--------------------------------------------------------------------------------
/content/behaviors/date.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: date
8 | 日期输入元素,它包含一个下拉日历。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="date" />
- 行内日期输入元素
13 | 示例
14 |
15 |
16 |
17 |
18 | 模型
19 | 初始化该行为时会创建下面的DOM结构:
20 | <input>
21 | <caption>
22 | <span.year>
23 | <span.month>
24 | <span.day>
25 | </caption>
26 | <button>
27 |
</input>
28 |
29 | 其中,<caption>
拥有behavior:masked
行为。<button>
按钮触发弹出下拉日历。
30 | 属性
31 | 该行为需要知道的属性:
32 |
33 | value="YYYY-MM-DD"
- input元素的初始日期
34 | 事件
35 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
36 |
37 | SELECT_SELECTION_CHANGED 事件 - 当元素(date)的value值由于用户操作被修改时生成该事件。该事件为异步事件。
38 | value
39 | Date 或 undefined, 反应内部编辑缓存区的当前状态。
40 | 方法
41 |
42 | showPopup()
43 | - 显示日历弹窗。
44 | today()
45 | - 设置为当前日期。
46 |
47 |
48 |
--------------------------------------------------------------------------------
/content/behaviors/decimal.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: decimal
8 | 浮点(float)数字输入元素行为。该行为可以被应用到任何合适的元素。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="decimal" />
- 行内浮点(float)类型输入元素
13 | 示例
14 |
15 |
16 |
17 |
18 | 模型
19 | 初始化该行为时会创建下面的DOM结构:
20 | <input>
21 | <caption>
22 | <button.plus>
23 | <button.minus>
24 |
</input>
25 |
26 | 其中,<caption>将拥有相应过滤器的behavior:edit
行为。如果input定义了step
属性,则将会创建<button.plus>
/<button.minus>
子元素。
27 | 所有的子元素将拥有:synthetic
状态标志。
28 | 属性
29 | 该行为需要知道的属性:
30 |
31 | value=float
- 元素的初始值。
32 | min=float
- 允许的最小值,注:Sciter并不会限制输入的大小,当value小于min时,输入框会处于:invalid状态。
33 | max=float
- 允许的最大值,注:Sciter并不会限制输入的大小,当value小于min时,输入框会处于:invalid状态。
34 | step=float
- 递增/减的步长。如果该属性被定义,该行为将会创建 -/+ 按钮。
35 | novalue="text"
- 当输入框为空时显示的文本。你可以使用CSS选择器:empty
来设置这个状态时的样式。
36 | readonly
- 声明该元素是只读的。
37 | 事件
38 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
39 |
40 | EDIT_VALUE_CHANGED 事件 - 当元素的值被用户修改时产生该事件。该事件为异步事件。
41 | EDIT_VALUE_CHANGING 事件 - 当任何修改该元素的值时发生该事件。通过该事件你可以在字符插入到文本框前过滤一些字符。该事件为同步事件。其中:
42 |
43 | event.reason 为以下值之一:
44 |
45 |
46 | const BY_INS_CHAR = 3; // 因输入单个字符引起的事件。
47 | const BY_INS_CHARS = 4; // 从剪切板粘贴引起的事件。
48 | const BY_DEL_CHAR = 5; // 由DELETE/BACKSPACE按键引起的事件。
49 | const BY_DEL_CHARS = 6; // 由删除选择内容引起的事件。
50 | event.data - string, 读/写。 如果reason为BY_INS_***值,则包含插入的字符;
51 | value
52 | float or undefined, 反应内部输入缓冲区的当前状态。
53 | 特有组合键
54 |
55 | LEFT, CTRL+LEFT, SHIFT+LEFT, CTRL+SHIFT+LEFT
56 | RIGHT, CTRL+RIGHT, SHIFT+RIGHT, CTRL+SHIFT+RIGHT
57 | HOME, SHIFT+HOME
58 | END, SHIFT+END
59 | BACKSPACE, ALT+BACKSPACE, CTRL+BACKSPACE
60 | CTRL+A
61 | DELETE, SHIFT+DELETE, CTRL+DELETE
62 | INSERT, SHIFT+INSERT, CTRL+INSERT
63 | CTRL+X
64 | CTRL+V
65 | CTRL+Z
66 | CTRL+(LEFT)SHIFT 和 CTRL+(RIGHT)SHIFT - 如果form表单上有dir
属性时,这个组合键用来在dir="ltr"
和切换dir="rtl"
间切换。
67 | 方法
68 | N/A - 该行为没有引入任何特有的方法,但是<caption>子元素拥有behavior:edit行为的特有方法。
69 |
70 |
71 |
--------------------------------------------------------------------------------
/content/behaviors/frame-set.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:frame-set
7 | 该行为处理<frameset>元素的扩展功能 - 由所谓的"分隔线(splitters)"分隔的"块面板"容器,它允许调整容器中面板的尺寸。
8 | 该行为可以应用到任何块级容器上,如<div>、<section>等。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
13 | 示例
14 |
15 |
16 |
19 |
20 | 主题1的内容
21 |
22 |
23 | 模型
24 | 在Sciter中,<frameset>元素可以包含<frame>元素,也可以包含其他块级元素(如 <div>、<section>等)来作为一个面板。
25 | 面板可以被<splitter>元素(可以指定splitter的特有样式)分隔。
26 | 示例, 一个典型的帮助窗口布局:
27 | <frameset cols="120px,*">
28 | <div id="help-index">
29 | <a href="first-topic.htm" target="help-content">主题1</a>
30 | </div>
31 | <splitter/>
32 | <frame id="help-content">主题1的内容</frame>
33 | </frameset>
34 |
35 | 第一个面板是一个<div>元素,它用于静态的内容。<frame>是选择的主题元素的容器。<splitter>用于交互式的调整面板的尺寸。
36 | 属性
37 | 该行为需要知道的属性:
38 |
39 | cols="宽度列表"
- 声明列布局,指定<frameset>中的列的初始宽度;
40 | rows="高度列表"
- 声明行布局,指定<frameset>中的行的初始高度;
41 | cols或rows属性必须定义其中一个,宽度/高度列表是一个以逗号分隔的Sciter长度单位: dips、px、mm等, 包括弹力单位(*
)。
42 | 事件
43 | N/A - 该行为没有特有事件。
44 |
45 | 方法
46 |
47 | framesetState
48 | () : array - 返回一个长度(lengths)数组 - 当前frameset中面板宽度/高度数组;
49 | framesetState
50 | (lengths: array) - 应用列/行的长度到frameset中。
51 | uiState方法用于持久化frameset的UI状态。
52 | value
53 | N/A
54 |
55 |
--------------------------------------------------------------------------------
/content/behaviors/frame.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:frame
7 | 该行为处理<frame>/<iframe>(宿主文档中的子文档容器)元素的扩展功能。
8 | 该行为可以应用到任何块级元素上, 如:<div>、<section>。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <frame>
- 块级文档容器;
13 | <iframe>
- 行内块文档容器。
14 | Sciter中, <frame>
是一个普通的DOM元素,它可以出现在任何其他块元素可出现的地方,而不仅仅是作为<frameset>的子元素。
15 | 模型
16 | <frame>元素初始时可以有任何子元素,这方面<frame>和<div>、<section>没有什么区别。
17 | <frame>
18 | <p>Select document to load</p>
19 | </frame>
20 |
21 | 在<frame>加载完子文档(由于src 的处理 或 调用了.load()
方法)后,frame将只有一个子元素 —— 加载文档根元素, 如<html>。
22 | <frame>和加载的文档:
23 | <frame>
24 | <html>
25 | <head>...</head>
26 | <body>...</body>
27 | </html>
28 | </form>
29 |
30 | 若脚本需要访问子文档,可以使用frame[0]来获取frame的第一个根元素 - 子文档的根元素:
31 | var frm = $(frame#main);
32 | var childDoc = frm[0];
33 | var someBtn = childDoc.$("button#some");
34 | ...
35 |
36 | 属性
37 | 该行为需要知道的属性:
38 |
39 | src="url"
- 可选, 加载到frame的文档的URL;
40 | content-style="url"
- 可选, 应用到加载文档的.css文件的URL。 该属性用于宿主文档需要给子文档应用一些特定样式时。
41 | 状态标志
42 |
43 | :busy
- 该标志表示文档正在加载。它可用于设置"文档加载中..."的样式。
44 | 事件
45 |
46 | DOCUMENT_CREATED 事件 - 该事件生成于文档加载的第一步骤。这一刻新文档已经存在但为空;
47 | DOCUMENT_COMPLETE 事件 - 该事件生成于文档完成加载时 ——DOM已经准备好,并且所有待处理资源请求已经处理完成。注意:该事件是Sciter特有的。
48 | 方法
49 |
50 | load
51 | (url:string) - 从指定URL加载html文档;
52 | load
53 | (html:string, baseUrl: string) - 从html 字符串加载html文档。baseUrl用于指定文档中的相对URL的根URL。
54 | clear
55 | () - 通过加载一个空文档来清除frame的内容。
56 | mediaVars
57 | () : object - 返回加载文档使用的媒体(media)变量的key/value映射表。
58 | mediaVars
59 | ( map: object [,reset: true | false] ) - 设置map为加载文档的媒体变量,如果reset 为true,将会应用该媒体。
60 | value
61 | N/A
62 | 脚本中Frame事件的处理
63 | var frame = $(frame#some);
64 | btn.onControlEvent = function(evt)
65 | {
66 | switch(evt.type) {
67 | case Event.DOCUMENT_CREATED: /* evt.target 是一个文档 */ break;
68 | case Event.DOCUMENT_COMPLETE: /* evt.target 是一个文档 */ break;
69 | }
70 | }
71 |
72 | 事件处理
73 | event complete $(frame#some) { ... 事件处理代码 ... }
74 |
75 |
76 |
--------------------------------------------------------------------------------
/content/behaviors/history.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:history
7 | 这个行为提供了对历史页面导航的支持, 类似于点击浏览器中的"前进"和"后退"按钮。
8 | 元素
9 | <frame history>
- 标准的frame元素,只是多了一个history属性。
10 | 模型
11 | 这个行为可以被应用到任何包含frame的元素上。比如,如果需要可以应用到<frameset>。
12 | 属性
13 | behavior:history没有使用任何特别的属性。
14 | 方法
15 |
16 | canGoBack
17 | ( ) : true | false , 如果存在"历史页面",并且goBack()方法将可以成功时,则返回true。
18 | canGoForward
19 | ( ) : true | false , 如果"向前"状态可用,并且goForward()方法将可以成功时,则返回true。
20 | goBack
21 | ( ) : true | false , "向后/回退"导航栈,当导航成功时返回true 。
22 | goForward
23 | ( ) : true | false , "向前"导航栈,当导航成功时返回true 。
24 | 状态
25 | N/A
26 | 事件
27 | 这个行为会生成以下事件:
28 |
29 | HISTORY_STATE_CHANGED
30 | - 当内部的导航栈状态被改变时触发。
31 | 这个行为反应了以下事件:
32 |
33 | HISTORY_PUSH
34 | - 发生了超链接导航,并且behavior:frame元素加载了新的内容。
35 | HISTORY_PRIOR
36 | - 该行为将会调用goBack()方法来处理该事件。
37 | HISTORY_NEXT
38 | - 该行为将会调用goForward()方法来处理该事件。
39 | 值
40 | N/A
41 | 在脚本中历史状态改变的处理
42 | onControlEvent
处理器:
43 | var edit = $(input#some);
44 | edit.onControlEvent = function(evt)
45 | {
46 | switch(evt.type) {
47 | case Event.HISTORY_STATE_CHANGED:
48 | /* evt.target为该元素 */
49 | break;
50 | }
51 | }
52 |
53 | decorators.tis处理器
54 | include "decorators.tis";
55 |
56 | @when Event.HISTORY_STATE_CHANGED @on "frame#content"
57 | function() {
58 | ... 事件处理代码 ...;
59 | }
60 |
61 |
62 |
--------------------------------------------------------------------------------
/content/behaviors/hyperlink.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:hyperlink
7 | 标准的超链接行为。它可以应用到任何有href
属性的DOM元素上。
8 | 元素
9 | 默认情况下,应用了behavior:hyperlink行为的元素有:
10 |
11 | <a href="url">...</a>
12 | 示例
13 |
16 | 属性
17 | 该行为需要知道的属性:
18 |
19 | href="url"
- 超链接URL;
20 | target="ID"
- 加载URL内容的frame元素的ID。
21 | 事件
22 | 除了标准事件集(鼠标、按键、聚焦)外,behavior:hyperlink行为还生成:
23 |
24 | HYPERLINK_CLICK 事件, 当鼠标在超链接上按下/按起或当超链接聚焦时按下空格
键时产生该事件。该事件为异步事件。
25 | 如果这个事件用户没有处理掉,则最接近该链接的文档将会处理加载该URL。
26 | 方法
27 | N/A - behavior:hyperlink没有引入任何特有的方法。
28 | value
29 | N/A.
30 | 脚本中的超链接点击事件处理
31 | onClick
事件
32 | var btn = $(a#some);
33 | btn.onClick = function() { 事件处理代码 ...;
34 | return true; /*标明事件以被处理*/ }
35 |
36 | on()
订阅
37 | var btn = $(a#some);
38 | btn.on("click", function() { ... 事件处理代码 ... });
39 | self.on("click", "button#some", function() { ... 事件处理代码 ... });
40 |
41 | decorators.tis 装饰器
42 | include "decorators.tis";
43 | @click @on "a#some" :: ... 事件处理代码 ...;
44 |
45 |
46 |
--------------------------------------------------------------------------------
/content/behaviors/integer.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: integer
8 | 整数(integer)数字输入元素行为。该行为可以被应用到任何合适的元素。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="integer" />
- 行内整数(integer)类型输入元素
13 | 示例
14 |
15 |
16 |
17 |
18 | 模型
19 | 初始化该行为时会创建下面的DOM结构:
20 | <input>
21 | <caption>
22 | <button.plus>
23 | <button.minus>
24 |
</input>
25 |
26 | 其中,<caption>将拥有相应过滤器的behavior:edit
行为。如果input定义了step
属性,则将会创建<button.plus>
/<button.minus>
子元素。
27 | 所有的子元素将拥有:synthetic
状态标志。
28 | 属性
29 | 该行为需要知道的属性:
30 |
31 | value=integer
- 元素的初始值。
32 | min=integer
- 允许的最小值,注:Sciter并不会限制输入的大小,当value小于min时,输入框会处于:invalid状态。
33 | max=integer
- 允许的最大值,注:Sciter并不会限制输入的大小,当value大于max时,输入框会处于:invalid状态。
34 | step=integer
- 递增/减的步长。如果该属性被定义,该行为将会创建 -/+ 按钮。
35 | novalue="text"
- 当输入框为空时显示的文本。你可以使用CSS选择器:empty
来设置这个状态时的样式。
36 | readonly
- 声明该元素是只读的。
37 | 事件
38 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
39 |
40 | EDIT_VALUE_CHANGED 事件 - 当元素的值被用户修改时产生该事件。该事件为异步事件。
41 | EDIT_VALUE_CHANGING 事件 - 当任何修改该元素的值时发生该事件。通过该事件你可以在字符插入到文本框前过滤一些字符。该事件为同步事件。其中:
42 |
43 | event.reason 为以下值之一:
44 |
45 |
46 | const BY_INS_CHAR = 3; // 因输入单个字符引起的事件。
47 | const BY_INS_CHARS = 4; // 从剪切板粘贴引起的事件。
48 | const BY_DEL_CHAR = 5; // 由DELETE/BACKSPACE按键引起的事件。
49 | const BY_DEL_CHARS = 6; // 由删除选择内容引起的事件。
50 | event.data - string, 读/写。 如果reason为BY_INS_***值,则包含插入的字符;
51 | value
52 | integer or undefined, 反应内部输入缓冲区的当前状态。
53 | 特有组合键
54 |
55 | LEFT, CTRL+LEFT, SHIFT+LEFT, CTRL+SHIFT+LEFT
56 | RIGHT, CTRL+RIGHT, SHIFT+RIGHT, CTRL+SHIFT+RIGHT
57 | HOME, SHIFT+HOME
58 | END, SHIFT+END
59 | BACKSPACE, ALT+BACKSPACE, CTRL+BACKSPACE
60 | CTRL+A
61 | DELETE, SHIFT+DELETE, CTRL+DELETE
62 | INSERT, SHIFT+INSERT, CTRL+INSERT
63 | CTRL+X
64 | CTRL+V
65 | CTRL+Z
66 | CTRL+(LEFT)SHIFT 和 CTRL+(RIGHT)SHIFT - 如果form表单上有dir
属性时,这个组合键用来在dir="ltr"
和切换dir="rtl"
间切换。
67 | 方法
68 | N/A - 该行为没有引入任何特有的方法,但是<caption>子元素拥有behavior:edit行为的特有方法。
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/content/behaviors/label.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:label
7 | 该行为将绑定了该行为的元素上的鼠标事件重定向到它标签指定的元素。因此,当鼠标在标签上点击时,会导致标签指定的元素获取焦点或生成点击事件。
8 | 元素
9 | 默认情况下,应用了该行为的元素有:
10 |
11 | <label>
12 | <label for=...>
13 | 属性
14 | 该行为需要知道的属性:
15 |
16 | for="id"
- label标签指定的输入元素的ID。
17 | 事件
18 | N/A - 该行为没有引入任何特有的事件。
19 | 方法
20 | N/A - 该行为没有引入任何特有的方法。
21 | value
22 | N/A
23 | 示例
24 | 下面的标记:
25 | <label>点我<input|text></label>
26 | <label for="buddy">也点我</label> <input|text id="buddy">
27 |
28 | 将会生成两个绑定了标签的input元素。
29 |
30 |
--------------------------------------------------------------------------------
/content/behaviors/menu-bar.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | behavior:menu-bar
9 | 该行为提供了一个横向菜单栏 —— 弹出菜单的顶层容器。
10 | 引擎的默认样式系统没有提供菜单栏的默认样式。如果你的应用程序需要菜单栏,请使用{sdk}/samples/menu/std-menu.css作为原型。
11 | 元素
12 | 默认没有元素应用该行为。{sdk}/samples/menu/std-menu.css 是假设<ul id="menu-bar">
元素定义了顶层菜单。
13 | 模型
14 | Sciter中,菜单的声明示例:
15 | <ul id="menu-bar">
16 | <li>
17 | <caption>文件</caption>
18 | <menu>
19 | <li id="file-open">打开<span.accesskey>Ctrl+O</span></li>
20 | <hr>
21 | <li id="file-save">保存<span.accesskey>Ctrl+S</span></li>
22 | <li id="file-save-as">另存为...<span.accesskey>Ctrl+Shift+S</span></li>
23 | </menu>
24 | <li>
25 | ...
26 | </ul>
27 |
28 | 属性
29 | 该行为没有引入特有的属性。
30 |
31 | 方法
32 | 没有特有的方法。
33 | 状态
34 |
35 | :owns-popup
当菜单显示时,菜单拥有者(上面的menuOwnerElement
)会设置该状态标志;
36 | :popup
- 当<menu>
显示时,该菜单会设置该状态标志。
37 | 事件
38 | MENU_ITEM_CLICK
39 | - 当用户点击菜单项时生成该事件,该事件为异步事件。Event.target是点击的菜单项。
40 | MENU_ITEM_ACTIVE
41 | - 当用户通过鼠标悬停或导航键激活菜单时生成该事件,该事件为同步事件。Event.target是激活的菜单项。
42 | 菜单项事件的传播采用所谓的菜单树顺序,菜单的拥有者元素会接收它拥有的菜单的所有的MENU_ITEM_CLICK事件。
43 | value
44 | N/A
45 | 脚本中菜单点击的处理
46 | onControlEvent
事件
47 | var edit = $(input#some);
48 | edit.onControlEvent = function(evt)
49 | {
50 | switch(evt.type) {
51 | case Event.MENU_ITEM_CLICK: /* evt.target是点击的菜单项 */ break;
52 | }
53 | }
54 |
55 | on()
订阅
56 | var edit = $(input#some);
57 | edit.on("click", "li#file-open", function(evt) {
58 | // 'this'这里是li#file-open元素
59 | });
60 |
61 | decorators.tis 装饰器
62 | include "decorators.tis";
63 | @click @on "li#file-open" :: ... 事件处理代码 ...;
64 |
65 |
66 |
--------------------------------------------------------------------------------
/content/behaviors/number.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: number
8 | 整数(integer)或浮点(float)数字输入元素行为。该行为可以被应用到任何合适的元素。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="number" />
- 行内整数(integer)或浮点(float)类型输入元素
13 | 示例
14 |
15 |
16 |
17 |
18 | 模型
19 | 初始化该行为时会创建下面的DOM结构:
20 | <input>
21 | <caption>
22 | <button.plus>
23 | <button.minus>
24 |
</input>
25 |
26 | 其中,<caption>将拥有相应过滤器的behavior:edit
行为。如果input定义了step
属性,则将会创建<button.plus>
/<button.minus>
子元素。
27 | 所有的子元素将拥有:synthetic
状态标志。
28 | 属性
29 | 该行为需要知道的属性:
30 |
31 | value=numeric
- 元素的初始值。
32 | min=numeric
- 允许的最小值,注:Sciter并不会限制输入的大小,当value小于min时,输入框会处于:invalid状态。
33 | max=numeric
- 允许的最大值,注:Sciter并不会限制输入的大小,当value大于max时,输入框会处于:invalid状态。
34 | step=numeric
- 递增/减的步长。如果该属性被定义,该行为将会创建 -/+ 按钮。
35 | novalue="text"
- 当输入框为空时显示的文本。你可以使用CSS选择器:empty
来设置这个状态时的样式。
36 | readonly
- 声明该元素是只读的。
37 | 事件
38 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
39 |
40 | EDIT_VALUE_CHANGED 事件 - 当元素的值被用户修改时产生该事件。该事件为异步事件。
41 | EDIT_VALUE_CHANGING 事件 - 当任何修改该元素的值时发生该事件。通过该事件你可以在字符插入到文本框前过滤一些字符。该事件为同步事件。其中:
42 |
43 | event.reason 为以下值之一:
44 |
45 |
46 | const BY_INS_CHAR = 3; // 因输入单个字符引起的事件。
47 | const BY_INS_CHARS = 4; // 从剪切板粘贴引起的事件。
48 | const BY_DEL_CHAR = 5; // 由DELETE/BACKSPACE按键引起的事件。
49 | const BY_DEL_CHARS = 6; // 由删除选择内容引起的事件。
50 | event.data - string, 读/写。 如果reason为BY_INS_***值,则包含插入的字符;
51 | value
52 | float or integer or undefined, 反应内部输入缓冲区的当前状态。
53 | 特有组合键
54 |
55 | LEFT, CTRL+LEFT, SHIFT+LEFT, CTRL+SHIFT+LEFT
56 | RIGHT, CTRL+RIGHT, SHIFT+RIGHT, CTRL+SHIFT+RIGHT
57 | HOME, SHIFT+HOME
58 | END, SHIFT+END
59 | BACKSPACE, ALT+BACKSPACE, CTRL+BACKSPACE
60 | CTRL+A
61 | DELETE, SHIFT+DELETE, CTRL+DELETE
62 | INSERT, SHIFT+INSERT, CTRL+INSERT
63 | CTRL+X
64 | CTRL+V
65 | CTRL+Z
66 | CTRL+(LEFT)SHIFT 和 CTRL+(RIGHT)SHIFT - 如果form表单上有dir
属性时,这个组合键用来在dir="ltr"
和切换dir="rtl"
间切换。
67 | 方法
68 | N/A - 该行为没有引入任何特有的方法,但是<caption>子元素拥有behavior:edit行为的特有方法。
69 |
70 |
71 |
--------------------------------------------------------------------------------
/content/behaviors/output.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior:output
8 | 格式化的输出行为。该行为可以被应用到任何文本容器上,如<span>、<em>等。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <output type=..>
- 只读输出元素;
13 | <(name)>
- Sciter特有的短格式语法,相当于<output name="name">
.
14 | 注意:在Sciter中你可以使用output的短格式语句。所以下面3个声明是等价的:
15 | <output name="first" type="text" />
16 | <output|text(first)/>
17 | <(first)|text>
18 |
19 | 示例
20 |
21 | 输出内容1
22 | 输出内容1
23 | <(first)|text>
24 |
25 | 属性
26 |
27 | type
- 格式化的类型,可以为以下值之一:
28 |
29 | "text"
- 输出纯文本, value值等同于toString()后的呈现;
30 | "integer"
- 输出整数;
31 | "decimal"
- 输出浮点数,值的格式基于当前地区(语言)的规则;
32 | "currency"
- 输出金额, 值的格式基于当前地区(语言)的规则;
33 | "date"
- 输出日期,值为UTC日期值,格式基于当前地区(语言)的规则;
34 | "date-local"
- 输出日期,值为当前时区的日期值,格式基于当前地区(语言)的规则;
35 | "time"
- 输出时间,值为UTC时间值,格式基于当前地区(语言)的规则;
36 | "time-local"
- 输出时间,值为当前时区的的时间值,格式基于当前地区(语言)的规则;
37 | name="name"
- 标准的name 属性 - from表单上一个input元素的名称。
38 | value="..."
- 标准的value 属性。该值的的显示格式基于type属性的定义。
39 | novalue="no value text"
- 当output没有输出内容时显示的文本。
40 | 如果value无法转换为声明的类型,则该元素会被设置:invalid
状态标志;
41 | 如果value是数字类型,且是一个负数,则该元素会有一个negative
属性,这样你可以通过该属性改变该元素的样式,如output[negative] { color:red; }
42 | 事件
43 | N/A - 该行为没有特有的事件。
44 | value
45 | any
value, 该值应该匹配type属性声明的类型。
46 | 方法
47 | N/A - 该行为没有引入任何特有的方法。
48 |
49 |
--------------------------------------------------------------------------------
/content/behaviors/pager-behavior.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | 打印页面(Pager)模板格式
4 |
5 |
6 |
7 | behavior:pager
8 | 该行为处理<frame|pager>和<frame type=pager>元素的相关功能。
9 | pager实现了打印和打印预览功能。
10 | 该行为可以被应用到任何块元素上。
11 | 元素
12 | 默认情况下,拥有behavior:pager 行为的元素有:
13 |
14 | <frame|pager>
- 页面打印预览的容器;
15 | 模型
16 | 在文档加载完成后,<frame|pager>元素将会有一些<pagebox>子元素,它们的数量由cols
和rows
属性定义:
17 | <frame|pager cols=2>
18 | <pagebox/>
19 | <pagebox/>
20 | </frame>
21 |
22 | 每个<pagebox/>元素渲染它自己要打印的页面的模板实例。
23 | 属性
24 | <frame>元素中有特定含义的属性:
25 |
26 | src="url"
- 可选, 加载到frame中的文档URL;
27 | page-template="url"
- 可选, 页面模板文档的URL;
28 | cols="number"
和 rows="number"
- 者两个属性定义打印预览时的<pagebox>(页面盒)的数量。
29 | 状态标识
30 |
32 | 事件
33 |
34 | "paginationstart"
事件 - 在分页时的第一步触发事件。这时要打印的文档刚加载完成;
35 | "paginationpage"
事件 - 在打印每个页面时触发该事件。event.reason是页号 - 1...N;
36 | "paginationend"
事件 - 在分页时的最后一步触发事件。这时待打印页数已经知道,并且通过event.reason字段来报告。
37 | 方法
38 |
39 | loadDocument
40 | ([templateUrl:string], documentUrl:string) - 从给定的url加载文档和打印模板;
41 | pagesTotal
42 | () : integer, 返回找到的页数;
43 | pageNo
44 | () : integer, 返回视图中渲染的第一个页面的页号;
45 | pageNo
46 | (number: integer), 将视图导航到number指定的页面;
47 | selectPrinter
48 | () : 打开系统的选择打印机对话框来选择目标打印机, 然后自动配置的页面尺寸,可能启动分页操作。
49 | selectDefaultPrinter()
50 | () : 选择默认打印机作为打印目标, 可能启动分页操作。
51 | print
52 | () - 打印当前文档到目标打印机上。
53 | 值
54 | N/A
55 | 在脚本中处理Frame事件
56 | var pager = $(frame#pager);
57 |
58 | pager.on("paginationstart", function() {...});
59 | pager.on("paginationend", function(evt) { var npages = evt.reason; ...});
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/content/behaviors/progress.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior:progress
8 | 进度条行为。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <progress>
;
13 | <meter>
.
14 | 示例
15 |
16 | progress:
17 |
18 | meter:
19 |
20 | 属性
21 | 该行为需要知道的属性:
22 |
23 | max=float
- 最大值, 默认为1.0;
24 | value=float
- 进度值, 该值在0.0 ... max
范围间。
25 | name="name"
- 标准的name 属性 - 该元素的名称。
26 | 事件
27 | N/A - 没有特有方法.
28 | value
29 | float
, 进度值,该值在0.0 ... max
范围间。
30 | 方法
31 | N/A - 没引入特有方法。
32 |
33 |
--------------------------------------------------------------------------------
/content/behaviors/radio.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: radio
8 | 标准的单选框按钮行为。 可以应用到任何一组具有相同的名称来实现一组选择(checked)功能的元素。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="radio">
- 标准的HTML行内单选按钮;
13 | <button type="radio">
- Windows外观的单选按钮, 请这样使用它<button|radio(group)>first</button>
<button|radio(group)>second</button>
.
14 | 示例
15 |
16 | 单选框1
17 | 单选框2
18 |
19 | 属性
20 | 该行为需要知道的属性:
21 |
22 | checked
- 如果提供了该属性,则将会初始化元素的运行期状态添加checked 标志。
23 | name="groupname"
- 标准的name 属性,但它有特殊的含义:拥有相同名称的复选框为一组。
24 | value="..."
- 标准的value属性(用于behavior:form
)。
25 | 事件
26 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
27 |
28 | BUTTON_STATE_CHANGED 事件 - 当按钮修改了它的选中状态时生成该事件。该事件为异步事件。
29 | BUTTON_PRESS 事件 - 当鼠标在该按钮上按下或当按钮聚焦时按下空格
键时产生该事件。该事件为异步事件。
30 | value
31 | true/false
, 反映按钮的当前状态是否包含:checked
标志。
32 | 注意: behavior:form行为将一组中的所有单选框元素认为是一个值。
33 |
34 |
--------------------------------------------------------------------------------
/content/behaviors/scrollbar.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 行为方法
7 | scrollbar
8 |
9 | element.setValues(position :int, minValue :int, maxValue :int, page :int, step :int):void
10 | set values of scrollbar element - position, minValue, maxValue, page - reflects to size of the slider, step - increment value of arrow buttons.
11 | element.position ():int
12 | returns current position.
13 | element.minValue ():int
14 | returns current minValue.
15 | element.maxValue ():int
16 | returns current maxValue.
17 | element.page ():int
18 | returns current page value.
19 | element.step ():int
20 | returns current minValue.
21 |
23 |
24 |
--------------------------------------------------------------------------------
/content/behaviors/select-checkmarks.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:select-checkmarks
7 | 有复选状态的<select multiple>列表。原则上它可以被应用到任何元素上。
8 | 元素
9 | 默认情况下,应用了该行为的元素有:
10 |
11 | <select size="2...N" multiple="checkmarks"></select>
12 | <select|list multiple="checkmarks"></select>
13 | 示例
14 |
15 |
16 | 选项1
17 | 选项2
18 | 选项3
19 |
20 |
21 | 选项1
22 | 选项2
23 | 选项3
24 |
25 |
26 | 模型
27 | 与behavior:select行为相同。
28 | 被选择项被设置了:checked
状态标志,因此可以在CSS中使用:checked伪类来设置选择状态项的样式:
29 | select > option:checked { background-image: url(my-checkmark.png); }
30 |
31 | 当用户在选择option元素的标记(foreground-image)上点击时behavior:select-checkmarks行为切换option的:checked状态。
32 | 属性
33 | 该行为需要知道的属性:
34 |
35 | size=integer
- 列表中可见元素的数量。注意:select元素的高度可以被CSS覆盖掉。
36 | name="name"
- 标准的name 属性 - from表单上一个input元素的名称。
37 | novalue="text"
- 如果select中没有使用<option selected>
初始化它,则将会使用该显示该文本。
38 | 事件
39 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
40 |
41 | SELECT_SELECTION_CHANGED event, 当修改select中的选择项(在一个option上点击)时产生该事件。该事件为异步事件。
42 | SELECT_SELECTION_CHANGING event, 当选择项将要改变时生成该事件。该事件为同步事件。
43 | 方法
44 | N/A - 该行为没有引入任何特有的方法。
45 | value
46 | value数组, 读/写属性, 选择项的列表。
47 | 在脚本中处理选择项的修改
48 | onValueChanged
事件
49 | var btn = $(select#some);
50 | btn.onValueChanged = function() { var v = this.value; ... }
51 |
52 | on()
订阅
53 | var btn = $(select#some);
54 | btn.on("change", function() { ... 事件处理代码 ... });
55 | self.on("change", "select#some", function() { ... 事件处理代码 ... });
56 |
57 | decorators.tis装饰器
58 | include "decorators.tis";
59 | @change @on "select#some" :: ... 事件处理代码 ...;
60 |
61 |
62 |
--------------------------------------------------------------------------------
/content/behaviors/select-multiple.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:select-multiple
7 | 多选列表(<select multiple>)的行为(当按照ctrl键时可以进行多选)。原则上它可以被应用到任何元素上。
8 | 元素
9 | 默认情况下,应用了该行为的元素有:
10 |
11 | <select size="2...N" multiple></select>
12 | <select|list multiple></select>
13 | 示例
14 |
15 |
16 | 选项1
17 | 选项2
18 | 选项3
19 |
20 |
21 | 选项1
22 | 选项2
23 | 选项3
24 |
25 |
26 | 模型
27 | 于behavior:select行为相同。
28 | 被选择项被设置了:checked
状态标志,因此可以在CSS中使用:checked伪类来设置选择状态项的样式:
29 | select > option:checked { background-image: url(my-checkmark.png); }
30 |
31 | 属性
32 | 该行为需要知道的属性:
33 |
34 | size=integer
- 列表中可见元素的数量。注意:select元素的高度可以被CSS覆盖掉。
35 | name="name"
- 标准的name 属性 - from表单上一个input元素的名称。
36 | novalue="text"
-如果select中没有使用<option selected>
初始化它,则将会使用该显示该文本。
37 | 事件
38 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
39 |
40 | SELECT_SELECTION_CHANGED event, 当修改select中的选择项(在一个option上点击)时产生该事件。该事件为异步事件。
41 | SELECT_SELECTION_CHANGING event, 当选择项将要改变时生成该事件。该事件为同步事件。
42 | 方法
43 | N/A - 该行为没有引入任何特有的方法。
44 | value
45 | value数组, 读/写属性, 选择项的列表。
46 | 在脚本中处理选择项的修改
47 | onValueChanged
事件
48 | var btn = $(select#some);
49 | btn.onValueChanged = function() { var v = this.value; ... }
50 |
51 | on()
订阅
52 | var btn = $(select#some);
53 | btn.on("change", function() { ... 事件处理代码 ... });
54 | self.on("change", "select#some", function() { ... 事件处理代码 ... });
55 |
56 | decorators.tis 装饰器
57 | include "decorators.tis";
58 | @change @on "select#some" :: ... 事件处理代码 ...;
59 |
60 |
61 |
--------------------------------------------------------------------------------
/content/behaviors/slider.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | behavior:slider
9 | 这种行为提供了滑块功能。
10 | 元素
11 | 默认情况下,应用了该行为的元素有:
12 |
13 | <input|hslider>
- 水平滑块;
14 | <input|vslider>
- 垂直滑块。
15 | 示例
16 |
17 |
18 |
19 |
20 |
21 | 注意: 要使创建的slider支持浮点范围,元素必须至少定义min和max属性,且它们的值必须是浮点数,例如:
22 | <input|hslider min="0.0" max="1.0" step="0.01">
23 | 模型
24 | 该行为初始化时会生成下面的DOM元素结构:
25 | <input type=hslider>
26 | <button.slider />
27 | </input>
28 |
29 | 其中,<button.slider>
是滑块中的"旋钮"。
30 | 属性
31 | 该行为需要知道的属性:
32 |
33 | min
34 | integer|float , 初始化滑块最小值;
35 | max
36 | integer|float , 初始化滑块最大值;
37 | step
38 | integer|float , 初始化步长值, 点击左/右侧的滑块是减/增的值。
39 | value
40 | integer|float , 初始值
41 | buddy
42 | string, "buddy"元素的ID,通常是一些<span>元素来接收value值的文本表示。
43 | 方法
44 | sliderMin
45 | () : integer|float 报告当前(运行时)的最小值。
46 | sliderMax
47 | () : integer|float 报告当前(运行时)的最大值。
48 | sliderStep
49 | () : integer|float 报告当前(运行时)的步长值。
50 | sliderRange
51 | (min : integer|float , max : integer|float [, step : integer|float ]) 设置滑块的范围,步长值参数可选。
52 | 事件
53 | BUTTON_STATE_CHANGED
54 | - 当滑块的值被用户修改时生成该事件。该事件为异步事件。
55 | BUTTON_CLICK
56 | - 当用户完成编辑滑块时生成该事件。该事件为异步事件。
57 | value
58 | integer|float , 滑块的当前值,返回在[ min ... max ]之间。
59 |
60 |
--------------------------------------------------------------------------------
/content/behaviors/time.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | behavior: time
8 | 时间输入元素。
9 | 元素
10 | 默认情况下,应用了该行为的元素有:
11 |
12 | <input type="time" />
- 行内时间输入元素
13 | 示例
14 |
15 |
16 |
17 |
18 | 模型
19 | 初始化该行为时会创建下面的DOM结构:
20 | <input>
21 | <caption>
22 | <span.hour>
23 | <span.minute>
24 | <span.second>
25 | <span.ampm>
26 | </caption>
27 | <button.plus>
28 | <button.minus>
29 |
</input>
30 |
31 | <span.ampm>
是可选的 - 它只出现在当前区域(语言)需要它时。
32 | <caption>
拥有behavior:masked
行为。
33 | <button.plus>
和<button.minus>
触发对当前的子字段的递增/减。
34 | 属性
35 | 该行为需要知道的属性:
36 |
37 | value="HH:MM:SS"
- time, 输入元素的初始化值。ISO 8601格式的时间部分。
38 | 事件
39 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
40 |
41 | EDIT_VALUE_CHANGED 事件 - 当元素(time)的value值由于用户操作被修改时生成该事件。该事件为异步事件。
42 | value
43 | Date 或 undefined, 反应内部编辑缓存区的当前状态。Date只有时间部分是有效的。
44 | 方法
45 | N/A - 该行为没有引入任何特有的方法,不过<caption>子元素有behavior:masked
行为的特有方法。
46 |
47 |
48 |
--------------------------------------------------------------------------------
/content/behaviors/tree-view.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | behavior:tree-view
7 | 树状结构的<select>列表行为。该行为可以被应用到任何块级容器元素上。
8 | 元素
9 | 默认情况下,应用了该行为的元素有:
10 |
11 | <select|tree></select>
12 | 示例
13 |
14 |
15 | 选项1
16 |
17 | 选项2
18 | 子选项1
19 | 子选项2
20 |
21 |
22 | 选项3
23 | 子选项1
24 | 子选项2
25 |
26 |
27 |
28 | 模型
29 | 该行为识别两种类型的<option>:
30 |
31 | "叶(Leaf)" <option> 指不包含子<option>的元素。
32 | "节点(Node)" <option> 指包含子<option>的元素。
33 | <option>
34 | <caption>Node标题</caption>
35 | <option>Leaf 1</option>
36 | <option>Leaf 2</option>
37 | </option>
38 |
39 | 被选择项会被设置:current
状态标志。
40 | 节点<option>在运行期会被设置:node
标志(在CSS中可以使用:node伪类)。因此下面的CSS选择器:
41 |
42 | option:node
- 匹配所有节点option;
43 | option:not(:node)
- 匹配所有的叶option.
44 | option:node
在响应UI事件(鼠标和键盘事件)时可能包含:expanded
或:collapsed
运行时状态标志。
45 | 该行为支持"虚拟树"模式。初始时,该树的所有节点option可能都是折叠的,并且是空的。这些节点option只有当接收到ELEMENT_EXPANDED事件时才填充。并且在ELEMENT_COLLAPSED事件中清除以便用最小的内存展示树。见sdk/samples/ideas/virtual-tree/ 示例。
46 | 属性
47 |
48 | <option>的expanded
属性 - <option expanded>将会为该元素默认设置:expanded
状态。
49 | 事件
50 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成:
51 |
52 | SELECT_SELECTION_CHANGED 事件, 当修改select中的选择项(在一个option上点击)时产生该事件。该事件为异步事件。
53 | SELECT_SELECTION_CHANGING 事件, 当选择项将要改变时生成该事件。该事件为同步事件。
54 | ELEMENT_EXPANDED 事件, 当节点option展开时会向该option发生该事件。
55 | ELEMENT_COLLAPSED 事件, 当节点option折叠时会向该option发生该事件。
56 | 方法
57 | N/A - 该行为没有引入任何特有的方法。
58 | value
59 | any, 读/写属性。被选择项(option)的值。选择项(option)的值(value)。option的值是它的value属性或它的文本内容(如果未定义value属性时)。
60 | 在脚本中树事件的处理
61 | onControlEvent
事件
62 | var btn = $(select#some);
63 | btn.onControlEvent = function(evt)
64 | {
65 | switch(evt.type) {
66 | case Event.SELECT_SELECTION_CHANGED: /* 当前option被改变 */ break;
67 | case Event.ELEMENT_EXPANDED: /* evt.target 为展开的元素 */ break;
68 | case Event.ELEMENT_COLLAPSED: /* evt.target 为折叠的元素 */ break; }
69 | }
70 |
71 | on()
订阅
72 | var sel = $(select#some);
73 | sel.on("change", function() { ... 事件处理代码 ... });
74 | sel.on("expand", "option", function() { ... 事件处理代码 ... });
75 | sel.on("collapse", "option", function() { ... 事件处理代码 ... });
76 |
77 | decorators.tis 装饰器
78 | include "decorators.tis";
79 | @when Event.ELEMENT_EXPANDED @on "select#some" :: ... 事件处理代码 ...;
80 | @when Event.ELEMENT_COLLAPSED @on "select#some" :: ... 事件处理代码 ...;
81 |
82 |
83 |
--------------------------------------------------------------------------------
/content/behaviors/video.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | 该行为提供视频播放功能。
10 |
11 | 默认情况下,应用了behavior:button行为的元素有:
12 |
14 |
15 | 该行为需要知道的属性:
16 |
17 | src
18 | - string, 视频的url。如果提供了该属性,该行为会在加载完成后立即播放该视频。
19 | sizing
20 | - string, 值为"cover "或"contain "(默认)。框架盒尺寸模式: contain - video的frame总是全部可以看到,cover - frame总是遮盖内容区,frame的一些部分可以被裁剪掉。
21 | 方法
22 | videoIsPlaying
23 | () : true | false 报告播放状态。当前如果视频在播放着返回true 。
24 | videoIsEnded
25 | () : true | false 如果视频播放已经结束,则返回true 。
26 | videoDuration
27 | () : duration (float) 报告视频持续的时间(秒)。如果duration不可用,它返回0。
28 | videoPosition
29 | () : duration (float) 报告当前的播放位置(秒)。
30 | videoPosition
31 | ( time : duration | float ) : duration 设置当前播放位置(秒)。
32 | videoHeight
33 | () : integer (pixels) 返回视频的自然高度。
34 | videoWidth
35 | () : integer (pixels) 返回视频的自然宽度。
36 | videoBox
37 | () : [x,y,width,height] 返回视频相对于元素内容区的矩形(像素)。注意:如果sizing 属性是"cover"时x 、y 可能是负值。
38 | videoLoad
39 | (movieUrl : string) : true | false
40 | 加载视频文件到播放器。该方法不会自动启动播放视频。
41 | videoUnload
42 | () 停止视频播放,并且卸载视频。
43 | videoPlay
44 | ( [position :duration] ) : true | false
45 | 在position 位置或当前位置(如果position未指定)启动视频播放。
46 | videoStop
47 | () 停止播放。
48 | audioVolume
49 | () : float (0.0...1.0)
50 | 报告当前音频轨道的音量。1.0对应于0dB,0.0(静音)对应100dB。
51 | audioVolume
52 | ( vol : float ) 设置当前音频轨道的音量。1.0对应于0dB,0.0(静音)对应100dB。
53 | audioBalance
54 | () : float ( -1.0 ... +1.0 ) 报告当前的立体声平衡。
55 | audioBalance
56 | ( balance : float ) 为当前的立体声平衡设置新值。
57 |
58 | 除了标准事件集(鼠标、按键、聚焦)外,该行为还生成以下事件(这些事件会传递到onControlEvent回调函数中):
59 | VIDEO_INITIALIZED
60 | - 视频加载成功,此时的videoWidth/Height、videoDuration属性是有效的。
61 | VIDEO_STARTED
62 | - 视频刚刚开始,第一帧刚刚渲染完成。
63 | VIDEO_STOPED
64 | - 视频停止播放。
65 |
66 | N/A, 该行为没有实现value值。
67 |
68 |
--------------------------------------------------------------------------------
/content/css/Components_React.js_style.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 类React.js的组件样式
7 |
8 |
9 |
10 |
11 |
类React.js的组件样式
12 |
13 |
14 |
15 |
我正在考虑添加一种类似React.js的@component
特性。
16 |
参考下面这样的结构:
17 |
@component Toggler {
18 |
19 | :root { flow: stack; }
20 |
21 | :root > option:nth-child(1) { ... }
22 | :root > option:nth-child(2) { ... }
23 |
24 | :root[on][off] :
25 |
26 | <option>{ attributes.on }</option>
27 | <option>{ attributes.off }</option>
28 |
29 | :root[on][off][mixed] :
30 |
31 | <option>{ attributes.on }</option>
32 | <option>{ attributes.off }</option>
33 | <option.mixed>{ attributes.mixed }</option>
34 |
35 | // event handler
36 | on :root click(evt) {
37 | ...
38 | }
39 | // event handler on child element
40 | on option mousedown(evt) {
41 | ...
42 | }
43 |
44 | // method
45 | function foo() { ... }
46 |
47 | // property
48 | property bar(v) { ... }
49 |
50 | }
51 |
52 |
@component
本质上和@set
很类似,不过它不仅包含样式声明,还包含可选的组件HTML标记代码,等价于:
53 |
class Toggler:Behavior {
54 |
55 | function attached() {
56 | this.$content(...);
57 | }
58 |
59 | function foo() { ... }
60 | property bar(v) { ... }
61 | }
62 |
因此,如果你将得到这样的标记:
63 |
<html>
64 | <head>
65 | <link rel="components" href="components/">
66 | </head>
67 | <body>
68 | <toggler on="yey" off="ney">
69 | </body>
70 | </html>
71 |
将将看到组件的实例化和DOM的初始化。
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/content/css/css-@mixin-feature.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sciter中CSS的@mixin特性
4 |
9 |
10 |
11 | Sciter中CSS的@mixin特性
12 |
13 |
我正在为Sciter的CSS添加@mixin
功能。
14 |
mixin是一个命名的CSS属性定义集合,这个集合可以被直接应用到CSS规则中。这个特性类似于SASS’s mixins 。
15 |
参考下面的声明:
16 |
@mixin LIKE-BUTTON
17 | {
18 | behavior:button;
19 | background: linear-gradient(top, #3498db, #2980b9);
20 | border-radius: 28dip;
21 | color: #ffffff;
22 | font-size: 20dip;
23 | padding: 10dip 20dip 10dip 20dip;
24 | text-decoration: none;
25 | }
26 |
它声明了一个LIKE-BUTTON属性块,这个属性块可以使用LIKE-BUTTON名称(以@为前缀)被应用到样式中:
27 |
div {
28 | @LIKE-BUTTON;
29 | margin:1em;
30 | }
31 |
32 | a {
33 | @LIKE-BUTTON;
34 | display:inline-block;
35 | }
36 |
37 |
38 |
--------------------------------------------------------------------------------
/content/css/css-extensions.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | h-smile对标准CSS的扩展
12 |
13 |
14 | h-smile对标准CSS的扩展
15 |
16 | @const 规则可以定义一些命名常量,以便在接下来的样式声明中将这些常量作为样式的属性值。 const常量声明示例(CSS+):
17 |
18 | /* 常量的声明: */ @const BASE_COLOR : #00FF00;/* 在样式声明中使用常量: */ #myelement { border: 1px solid @BASE_COLOR ; }
19 |
20 | 声明的代码中,第一行定义了一个BASE_COLOR常量,在第二行中使用该常量作为一个样式属性的值。
21 | @const规则使用下面的语句:
22 |
23 | @const name [ , name1 [ , name2 ... ]] : values ;
24 |
25 | ':'号后面的值列表将会赋值到':'号左边的常量上。
26 | values 是一个CSS可接受的属性值序列。它可以是单个值(如上面的#00FF00),也可以是一个定义复合属性(短格式)的值集合。例如,下面定义了一个常量,它是background属性的一个值集。
27 |
28 | @const MY_BACKGROUND : yelllow repeat url(hatch.png); #myelement { background: @MY_BACKGROUND ; }
29 |
30 | 常量的插入点的标记方法:在'@'字符后边跟着用@const声明的对应常量名称。
31 | @const的作用域:
32 |
33 | @const声明是全局的。常量声明后,在一个文件中是可见的,并且可以在所有后续css文件和文档中声明使用。
34 | @const声明使用先来先服务规则。一旦定义了常量就不能被覆盖。
35 | 多次定义相同的常量不是一个错误,只是只有第一个声明的常量才能被使用。
36 |
37 | @const定义的示例请参考htmlayout和Sciter SDK中的.../css-plus/constants.htm文件。
38 |
39 |
--------------------------------------------------------------------------------
/content/css/css-variables-support.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CSS variables support / sciter
6 |
7 |
8 |
9 | 我正在添加支持CSS变量。对于Sciter,这是一个非常不错的功能,它与CSS Variables Working Draft 中的变量定义相似但语法有点不同:
10 | 变量的声明:
11 | body {
12 | var(foo): #f00; /* 声明一个名为"foo"的变量,并定义了它的默认值 */
13 | color: var(foo,#000); /* 使用这个变量var(变量名, 变量不存在时的默认值) */
14 | }
15 | 变量是可以继承的,所以<body>中的所有子元素都可以使用这个变量:
16 | div {
17 | background-color: var(foo,#00f);
18 | size:200dip;
19 | }
20 | 注意,变量包含两部分内容: 变量的名称 ,已经等变量未定义时的默认值 。
21 | 在运行期,脚本也可可以调用DOM API来获取/设置这些CSS变量:
22 | $(body).style.setVariable("foo", color(0,255,0));
23 | 在脚本中设置后,所有在样式中使用这个变量的元素都会采用新的颜色。
24 |
25 |
26 |
--------------------------------------------------------------------------------
/content/css/expandable-images.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 九宫格图像是定义DOM元素弹性边框盒背景的一种简单而有效的方式。
8 | 下面是一个九宫格图像的示例, 这个图片如下:
9 |
10 | 该图片扩展或作为下面的div元素的背景:
11 |
12 | 九宫格图像是一张位图图像,如png、jpeg 或 gif。Sciter为标准的background-repeat属性扩展了新值,用于声明九宫格图像,。同时可以通过background-position属性来定义原图像中的每一节如何渲染。
13 | 正式的定义:
14 | background-repeat: expand [stretch-top] [stretch-bottom] [stretch-middle] [stretch-left] [stretch-right];
15 | background-position: top right bottom left;
16 |
17 | 其中:
18 |
19 | top
、right
、bottom
、left
是一个数字(图像像素数),将图像分拆成9个区域,它们定义了图像拆分的这9个区域的宽度/高度外边距。这些区域将会被复制、平铺或者拉伸到目标区域上(见下面的说明);
20 | stretch-top
、stretch-bottom
、stretch-middle
、stretch-left
、stretch-right
这几个值用于定义对应区域如何复制到目标部分上。例如,如果没有stretch-top, 则原图像顶部区域将被平铺到目标区域的该部分。而如果定义了stretch-top值,则原图像的顶部区域将被拉伸到目标区域的该部分。
21 | 注意: background-repeat:expand图像将铺满元素的内边距内的所有区域。因此我们可以重用background-position属性来定义图像的每一部分如何渲染。
22 | 平铺示例
23 | 下面是一个示例,它用于说明声明的图片如何扩展到<div>元素的目标区域。CSS定义如下:
24 | div
25 | {
26 | background-image:url(back.png);
27 | background-repeat:expand;
28 | background-position:14 14 14 14; /* 这个图像的所有"边框"部分都是14px宽 */
29 | padding:14px;
30 | height:100px;
31 | }
32 |
33 |
34 | 这个示例使用的文档的所有HTML源代码为:
35 | <html>
36 | <head>
37 | <style>
38 | body { background-color: white white bisque bisque; margin:0; padding:20px; }
39 | div
40 | {
41 | background-image:url(back.png);
42 | background-repeat:expand;
43 | background-position:14 14 14 14;
44 | padding:14px;
45 | height:100px;
46 | }
47 | </style>
48 | </head>
49 | <body>
50 | <div>Hello world!</div>
51 | </body>
52 | </html>
53 |
54 | 拉伸示例
55 | 这里有另一张图像,我们需要使它在水平方向上平铺,而在垂直方向上拉伸。源图像为:
56 |
57 | 该图像的渲染效果示例:
58 |
59 | 上面的效果的所有HTML文档源码为:
60 | <html>
61 | <head>
62 | <style>
63 | body { background-color: white white bisque bisque; margin:0; padding:20px; }
64 | button
65 | {
66 | background-image:url(back-stretch.png);
67 | background-repeat:expand stretch-left stretch-middle stretch-right;
68 | background-position:8 8 8 8;
69 | padding:10px;
70 | }
71 | </style>
72 | </head>
73 | <body>
74 | Buttons with custom shapes:
75 | <button>Small</button>,
76 | <button>Fairly big with<br/>multiline text</button> and
77 | <button>Even bigger<br/>because it has three<br/>lines of text</button>
78 | </body>
79 | </html>
80 |
81 |
82 |
--------------------------------------------------------------------------------
/content/css/images/back-stretch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/back-stretch.png
--------------------------------------------------------------------------------
/content/css/images/back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/back.png
--------------------------------------------------------------------------------
/content/css/images/final-stretch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/final-stretch.png
--------------------------------------------------------------------------------
/content/css/images/final.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/final.png
--------------------------------------------------------------------------------
/content/css/images/legos.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/legos.jpg
--------------------------------------------------------------------------------
/content/css/images/schema.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/css/images/schema.png
--------------------------------------------------------------------------------
/content/css/popup-position.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | popup-position属性
4 |
5 |
6 |
7 | popup-position属性允许显示定义弹出元素在其锚定元素(弹出元素的拥有者)的弹出位置。
8 | popup-position属性接受以下值:
9 |
10 | popup-position: default;
- 默认位置(行为指定)。
11 | popup-position: inherit;
- 从它的父元素继承。
12 | popup-position: <popup-reference-point> <anchor-reference-point>;
- 明确指定弹出位置。
13 | 其中:
14 | <popup-reference-point>
和<anchor-reference-point>
可以使用以下枚举值:
15 |
16 | top-left
17 | top-center
18 | top-right
19 | middle-left
20 | middle-center
21 | middle-right
22 | bottom-left
23 | bottom-center
24 | bottom-right
25 | 示例,下面的声明:
26 | select > popup { popup-position: top-right bottom-right;
27 | }
28 |
29 | 将弹出元素的右上角放置在锚点元素(这是是select元素本身)的右下角。
30 |
31 |
--------------------------------------------------------------------------------
/content/reactor/helloworld.htm:
--------------------------------------------------------------------------------
1 |
2 | 什么是 Reactor
3 | Reactor 只有这三个特性:
4 | 编译器原生支持 SSX . SSX 语法与表达式是 Sciter's Script 中的组成部分. SSX 的概念非常的接近 JSX
5 | 原生的实现了真实 DOM / 虚拟 DOM 的协调. Element.merge(velement)
就是这个 .
6 | 这个 class Reactor.Component
是由 sciter:reactor.tis 实现. 你可以在这看到源代码 here .
7 |
8 |
9 | Reactor 不是什么
10 | Hello World
11 | 最小的 Sciter's Reactor 示例:
12 | $(body).content( <h1>Hello, world!</h1> );
13 | 如您所料,执行此行将生成以下 DOM 结构:
14 |
15 |
16 |
17 | <body>
18 | <h1>Hello, world!</h1>
19 | </body>
20 |
21 | 脚本表达式 <h1>Hello, world!</h1>
是一个 SSX 原语.
22 | 注意:您不需要任何外部预编译器来运行此代码 - SSX 是 Sciter 脚本的一个组成部分,从 sciter4.4.0.0 开始支持。解析、DOM 更新和协调也是原生实现的,不需要任何额外的库。
23 | 这意味着, 就象上面的例子一样, 你在不引用 ReactJS 的时候, 就能使用这些特性.
24 | 例如,JSX 可用于需要填充现有 DOM 的情况, 你可以使用Element.create()
or Element.append()
25 | 并且你可以使用 Element.merge()
来从虚拟 dom 定义中来更新真实 DOM , 你可以使用这个例子用于需要比例和合并二个真实 dom 树的时候.
26 | Sciter::Reactor 与 Facebook::ReactJS
27 | Sciter's Reactor 使用了大体上类似 ReactJS 的语法与想法.
28 | Facebook::ReactJS 是一个 JavaScript 库, Sciter::Reactor 是原生实现了这二个事情 : SSX 与 Element.merge() .
29 |
--------------------------------------------------------------------------------
/content/reactor/lists-keys.htm:
--------------------------------------------------------------------------------
1 | 列表和键
2 | 我们可以构建元素集合并使用花括号将它们包含在 SSX {}
当中.
下面,我们使用 map()
函数循环遍历 numbers 数组. 为每个项目返回一个 <li>
元素. 最后,我们将生成的元素数组分配给 listItems:
3 | const numbers = [1, 2, 3, 4, 5];
4 | const listItems = numbers.map((number) =>
5 | <li>{number}</li>
6 | ); 然后我们将整个 listItems
数组包含在一个 <ul>
元素中, 并将其渲染到 DOM:
$(body).content(<ul>{listItems}</ul>);
7 | 上面的代码, 我们用 Element.content(vnodes)
将有效地用于函数呈现的静态 list.
8 | 但是,如果我们计划使用 Element.merge()
更新 list, 我们需要为 list 元素添加 keys. 在这种情况下 merge()
可以有效地执行 DOM and its virtual representation.
9 | 使用 key 最佳方法是使用于字符串, 该字符串在其 item 中是唯一标识, 大多数情况下 key.:
const todoItems = todos.map((todo) =>
10 | <li key={todo.id} status={todo.status}>
11 | {todo.text}
12 | </li>);
13 | 注意:如果项目的顺序可能发生变化,不建议使用 key 做为索引. 这会对性能产生负面影响, 并可能导致组件状态出现问题.
14 | key 只能在兄弟 item 中唯一 数组中使用的 key 需要在它们的兄弟中应该是唯一的. 但是, 它们不需要是全局唯一的.
15 | map() 嵌入到 SSX 表达式中
16 | SSX 允许在花括号中嵌入任何表达式, 以便我们也可以内联 map()
function NumberList(props) {
17 | const numbers = props.numbers;
18 | return
19 | <ul>
20 | { numbers.map((number) => <li key={number.toString()} />) }
21 | </ul>;
22 | }
23 |
--------------------------------------------------------------------------------
/content/reactor/mounting-point.htm:
--------------------------------------------------------------------------------
1 | <reactor> element as HTML mounting point
2 | 考虑这个 HTML 文档:
3 |
4 | <html>
5 | <head>
6 | <script type="text/tiscript">
7 | var items = ["Veni","Vidi","Vici"];
8 | </script>
9 | </head>
10 | <body>
11 | <reactor(ol)>
12 | {items.map((item) => <li>{item}</li>)}
13 | </reactor>
14 | </body>
15 | </html> 你要注意这 <reactor>
元素在这 . 这个 <reactor> 元素是调用 Reactor's 的 mount 点.
16 | 当这个<reactor>
元素出现在 DOM 中,它作为包进 SSX 的脚本进行运算, 该 html 的最终结果如下:
17 | <html>
18 | <body>
19 | <ol>
20 | <li>Veni</li>
21 | <li>Vidi</li>
22 | <li>Vici</li>
23 | </ol>
24 | </body>
25 | </html>
26 | <reactor> 元素
27 | The <reactor>
元素, 会解释输入的两种 DOM 属性:
28 |
29 | type
- string, 接受以下内容:如果是从 小写字母 然后它被视为 DOM 元素 标签, 例如: div, section, ol, li, etc.
30 | 如果是 大写字母 然后它被视为组件的名字 - Reactor's 的功能或声明的类的代码 . 如果它是 省略 这个内容会被替换成 <reactor>元素它自身的内容.
31 | src
- url. 当 name 定义 Reactor 的组件 (case #2 above). 如果 src 它是提供了的话引擎将尝试从 url 加载的脚本文件中加载组件.
32 |
33 |
34 |
35 | 例如这个 document:
36 | <html>
37 | <head>
38 | <script type="text/tiscript">
39 | var name = "World";
40 | </script>
41 | </head>
42 | <reactor|body >
43 | <h1>Hello {name}</h1>
44 | </reactor>
45 | </html>
46 |
47 | 加载后会变成如下:
48 | <html>
49 | <head>
50 | <script type="text/tiscript">
51 | var name = "World";
52 | </script>
53 | </head>
54 | <body >
55 | <h1>Hello world</h1>
56 | </body >
57 | </html>
58 |
59 |
--------------------------------------------------------------------------------
/content/reactor/preface.htm:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/content/reactor/rendering.htm:
--------------------------------------------------------------------------------
1 | 注意:本文档是按 ReactJS/Rendering-Elements 风格来写的 以高亮的地方是与 ReactJS 的差异.
2 | 渲染元素
3 | Reactor 的虚拟 DOM 元素是由真实 DOM 元素来定义. 在某些时候, 将使用虚拟元素作为原型来创建真实的 DOM 元素.
4 |
5 | const velement = <h1>Hello, world</h1>;
6 | 与物理 DOM 元素不同, Reactor 元素是简单的 tuples 元组 , 并且创建成本低. 专用 Sciter 的 DOM 方法 负责更新 DOM 以匹配此类虚拟元素.
7 | 将元素渲染到 DOM 中
8 | 您的 HTML 文件中有一个<div>
:
9 |
10 | <div id="root"></div>
11 | 让我们称其为 "root" DOM node - 其中的所有内容都将由 Reactor 管理.
12 | 使用 Reactor 的应用程序可以将多个独立的根 DOM 节点作为单个根 DOM 节点 - 无论你需要什么. 并且您可以将 Reactor 管理的元素与通过其他方式管理的元素混合, e.g. scripting behavioral classes.
13 | 要将 Reactor 元素渲染到 root DOM node, 调用 element.merge(velement)
方法:
14 |
15 |
16 | const velement = <div id="root"><h1>Hello, world</h1></div>;
17 | $(div#root).merge(velement);
18 | 上面的内容将在该<h1>
元素内显示"Hello, world"文本.
19 | 更新渲染元素
20 | 要更新已经渲染的元素, 我们只需调用 element.merge(velement)
来再次更新 velement. 这个 Element.merge()
原生函数将通过新的 velement 定义修改现有的 DOM 元素 定义.
21 | 考虑这个滴答时钟示例:
22 | function tick() {
23 | const velement =
24 | <div id="root">
25 | <h1>Hello, world!</h1>
26 | <h2>It is {new Date().toLocaleString(#time)}.</h2>
27 | </div>;
28 | $(div#root).merge(velement);
29 | return true; // to keep timer running
30 | }
31 |
32 | self.timer(1s, tick);
33 | 上面的代码将每秒调用 tick()
函数. 这个 tick 会更新这个元素的 <div>.
34 | 使用 sciter.exe 查看样例 {sdk}/samples/+reactor/doc-samples/rendering/clock.htm .
35 | Element.merge() 只更新必要的内容
36 | 这个 Element.merge()
函数将元素及其子元素与前一个元素进行比较, 并且仅应用使 DOM 达到所需状态所需的 DOM 更新.
37 | 管我们在每个刻度上创建了一个描述整个 UI 树的元素, 但只有内容已更改的文本节点会更新 Element.merge()
.
38 | 因此 Reactor (特别是merge()
方法) 允许在每一个给定的时刻重新定义 UI 的部分节点, 而不是随时间改变所有.
39 |
--------------------------------------------------------------------------------
/content/sciter/Attributes.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 属性(Attributes)对象
7 | 代表DOM 元素 的属性。
8 | 为了访问元素的属性集合,请使用它的attributes 属性:element.attributes。
9 |
10 |
11 |
12 | 属性
13 |
14 | length
15 | integer , 只读。元素的属性数量。
16 |
17 | [index]
18 | string , 读写。 在索引index 位置上的属性。 Index 这里可以是字符串 (属性的名称)也可以是整数 (基于0的属性索引)。
19 |
20 |
21 | 枚举/遍历
22 |
23 | for ... in
24 |
25 | for(var name in element .attributes ) { /* 循环体 */ }
26 | 元素属性的循环执行体。name 遍历是属性的名称。
27 |
28 |
29 | 方法
30 |
31 | name
32 |
33 | (index) returns: string
34 | 返回索引在index位置上的属性名称。Index基于0。
35 |
36 | clear
37 |
38 | () returns: N/A
39 | 清除元素的所有属性。
40 |
41 | remove
42 |
43 | (attr) returns: N/A
44 | 从属性集合中移除attr属性。Attr 参数这里可以是字符串 (属性的名称)也可以是整数 (基于0的属性索引)。
45 |
46 | exists
47 |
48 | (attr) returns: true|false
49 | 在属性集合中如果存在attr则返回true。Attr 参数这里可以是字符串 (属性的名称)也可以是整数 (基于0的属性索引)。
50 |
51 | addClass
52 |
53 | (className1: string [, ... classNameN: string ] )
54 | 为元素的class 属性添加className1..classNameN类名称。
55 |
56 | removeClass
57 |
58 | (className1: string [, ... classNameN: string ] )
59 | 从元素的class 属性中移除className1..classNameN类名称。
60 |
61 | toggleClass
62 |
63 | (className: string [, on: boolean ] )
64 | 添加或移除class属性。如果on 被设置true则是添加class,如果on 被设置false则是移除class。如果on 参数未提供时,没有className则添加,否则移除。
65 |
66 | hasClass
67 |
68 | (className: string ) : boolean
69 | 如果该元素已经定义了className ,则返回true 。
70 |
71 |
--------------------------------------------------------------------------------
/content/sciter/Node.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 节点(Node)对象
7 | 代表非元素DOM节点:文本 或 注释。
8 |
9 | 属性
10 | parent
11 | 只读 - Element , 节点的父元素。如果该节点未连接任何元素则返回null 。
12 | nodeIndex
13 | 只读 - Integer, 该节点在父节点容器中的索引位置。
14 | nextNode
15 | 只读 - Element or Node , 该节点的下一个兄弟节点。如果该节点是最后一个,则返回null 。
16 | priorNode
17 | 只读 - Element or Node , 该节点的上一个兄弟节点。如果该节点是第一个,则返回null 。
18 | text
19 | 读写 - String , 该节点的文本。
20 | isElement
21 | 只读 - 如果该节点是一个元素,则返回true ,否则返回false 。
22 | isText
23 | 只读 - 如果该节点是一个文本节点,则返回true 。
24 | isComment
25 | 只读 - 如果该节点是一个注释,则返回true 。
26 | 方法
27 | createText
28 |
29 | (text: string) : Node
30 | 创建一个文本DOM节点。
31 | createComment
32 |
33 | (text: string) : Node
34 | 创建一个注释DOM节点。
35 | createElement
36 |
37 | (tagname:symbol | string [, attributes: object] [, text:string]) : Elemen t
38 | 创建一个元素节点。等价于new Element(...)
。
39 | toString
40 |
41 | () : string
42 | 返回节点的文本表示形式的字符串。
43 | clone
44 |
45 | () :Node
46 | 返回一个该节点的拷贝。新节点不与DOM连接。
47 | insertNodeBefore
48 |
49 | ( node: Node)
50 | 将node节点插入到DOM中该元素之前。
51 | insertNodeAfter
52 |
53 | ( node: Node)
54 | 将node节点插入到DOM中该元素之后。
55 | detach
56 |
57 | ( ) : Node
58 | 从它的父节点容器中移除该节点。调用该方法后,该节点的parent 将会变成null 。
59 | remove
60 |
61 | ( ) : Element
62 | 从它的父节点容器中移除该节点。调用该方法后,该节点的parent 将会变成null 。
63 | commonParent
64 | ( other: Node ) : Element返回this与other节点的公共父节点。
65 |
66 |
--------------------------------------------------------------------------------
/content/sciter/Request.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | TIScript - Request对象
4 |
5 |
6 |
7 | Request对象
8 | 该对象可用于对请求添加其他处理。注意它是可以"then able"的类似promise的对象,即它也可以使用await
。
9 |
10 | 常量
11 | Request.requestedDataType
属性的返回值
12 | DATA_HTML
13 | - html文档请求;
14 | DATA_IMAGE
15 | - 图片请求;
16 | DATA_STYLE
17 | - css请求;
18 | DATA_CURSOR
19 | - 光标(cursor)请求;
20 | DATA_FONT
21 | - 字体数据请求;
22 | DATA_RAW_DATA
23 | - 任意数据请求, view.request()
产生的请求是这个类型;
24 | 属性
25 | status
26 | - integer , 响应状态 - http响应代码: 200 - OK, 404 - not found, etc.
27 | requestedDataType
28 | - integer , 上面的DATA_***值之一, 请求数据的类型。
29 | response
30 | - string, value, stream or byte array - 请求的响应数据。具体的类型取决于view.request()
方法的output
参数。
31 | responseData
32 | - Bytes (byte array) - 服务端返回的请求数据。
33 | responseMimeType
34 | - string, 服务端响应数据的mime type。
35 | isConsumed
36 | - boolean, 如果请求已被处理(被目标元素)则返回true。
37 | isSucceeded
38 | - boolean, 如果请求已成功处理这返回true。
39 | destination
40 | - 请求数据的Element或View对象。
41 | 方法
42 | fulfill
43 |
44 | ( data : Bytes , mime : string ) : this
45 | 当做从服务端返回的数据来履行请求。
46 | reject
47 |
48 | ( status : integer ) : this
49 | 当做服务端返回数据失败来拒绝请求。
50 | then
51 |
52 | ( onSuccess : function [, onFailure : function] ) : this
53 | 订阅这个请求上的success 、failure 事件。
54 | 其中:
55 |
56 |
57 | function onSuccess(data, status)
- 接收响应数据和状态码;
58 | function onFailure(err)
- 失败时返回一个Error对象实例。
59 |
60 | 两个方法被调用时,this 被设置为该请求对象。
61 |
62 | catch
63 |
64 | ( callback : function ) : this
65 | 订阅failure 的回调函数。
66 |
67 | finally
68 |
69 | ( callback : function ) : this
70 | 订阅completion 事件的回调函数,即不管请求处理成功或失败都会调用它。
71 |
72 |
73 |
--------------------------------------------------------------------------------
/content/sciter/Sciter.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Sciter对象
7 | 代表当前Sciter应用程序的实例。
8 |
9 | 常量
10 | VERSION
11 | Sciter的版本,整数。高位的wrod值时版本号,低位的word是子版本号。
12 | REVISION
13 | Sciter的修订号,整数。高位的wrod值时修订号,低位的word是连续的构建号。
14 | LICENSEE
15 | string, Sciter的组织/个人证书名称。
16 | 方法
17 | this
18 | N/A, 目前不可用。
19 | userName
20 |
21 | () returns: string
22 | 返回字符串 - 这个运行的Sciter实例的操作系统登录用户名。
23 | machineName
24 |
25 | ( [full ]) returns: string
26 | 返回这个运行的Sciter实例的机器名。如果提供了full 参数且为true ,则这个函数返回这个机器的完全限定的网络域名。
27 | launch
28 |
29 | ( filename : string ) returns: true/false
30 | 启动这个机器上另一个应用程序。Filename 是应用程序的文件名,或要打开的文档。
31 |
32 |
--------------------------------------------------------------------------------
/content/sciter/images/scroll.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/sciter/images/scroll.gif
--------------------------------------------------------------------------------
/content/sciter/images/scroll.vsd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/content/sciter/images/scroll.vsd
--------------------------------------------------------------------------------
/content/script/Angle.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | TIScript - Angle(角度)对象
4 |
5 |
6 |
7 | Angle(角度)对象
8 | 表示一个角度值。
9 |
10 | 角度值使用全局的rad (float)
或deg (integer)
函数构建一个角度值。
11 | Angle字面值是数字和角度单位的组合。下面的表达式将为true:
12 | 360deg instanceof Angle;
13 | 360deg == Math.PI * 2 * 1rad;
14 | 360deg == 400grad;
15 | 360deg == 1turn;
16 | 1turn / 2 == 180deg;
17 |
18 | TIScript支持CSS定义的所有单位值:
19 | deg
- 度, 在一个完整圆中有360度;
20 | rad
- 弧度, 在一个完整圆中有2*π弧度;
21 | grad
- 梯度(Gradians)。一个圆共400梯度。90deg = 100grad = 0.25turn ≈ 1.570796326794897rad;
22 | turn
- 转、圈(Turns)。1圈等同于360度 - 一个完整的圆;
23 | 常量
24 | N/A
25 | 属性
26 | degrees
27 | 只读, float , 角度值
28 | radians
29 | 只读, float, 弧度值。
30 | 方法
31 | parse
32 |
33 | (s : string) : angle
34 | 静态方法, 根据CSS规则解析字符串为角度对象。
35 | toFloat
36 |
37 | () : float
38 | 将角度转换为弧度值。
39 | toInteger()
40 |
41 | () : integer
42 | 将角度转换成角度值。
43 | toString()
44 |
45 | () : string
46 | 返回"NNNrad"格式的字符串,其中NNN是一个弧度值。
47 | morph
48 |
49 | ( from : angle, to:angle, ratio: float ) : angle
50 | 根据后面的公式计算平均值: (to - from) * ratio + from
。
51 |
52 |
--------------------------------------------------------------------------------
/content/script/Bytes.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Bytes(字节)对象
7 | Bytes是一个字节数组。
8 |
9 | 常量
10 | N/A
11 | 属性
12 | [index]
13 | - integer , 读写属性。数组中在index 位置的元素。Index基于0开始。
14 | length
15 | - integer , 只读属性。数组中字节的数量。
16 | type
17 | - any , 可用于任何目的。但目前sciter用它来报告接收的或request()方法发送的数据mime-type (字符串)。
18 | name
19 | - any , 可用于任何目的。但目前siter用它来报告接收的或request()方法发送的数据的文件名或url。
20 | 方法
21 | this
22 |
23 | ( numBytes : integer )
24 | Bytes类型对象的构造函数 —— numBytes 为Bytes的长度。
25 | toString
26 |
27 | ( [encoding :string] ) returns: string
28 | 如果encoding未指定或是"base64"时,返回字节数组的base64 编码格式的字符串。否则如果编码是IANA字符集列表http://www.iana.org/assignments/character-sets 支持的一种,则返回对应的编码格式字符串。
29 | 示例: var str = bytes.toString("UTF-8");
返回UTF-8编码的字符串。
30 | fromString
31 |
32 | ( str : string[, encoding :string] ) returns: Bytes
33 | 静态方法, 从str 字符串根据encoding 编码创建一个Bytes对象(字节数组)。
34 | 如果encoding未指定或是"base64"时,则认为是"base64"。否则如果编码是IANA字符集列表http://www.iana.org/assignments/character-sets 支持的一种,则返回对应的编码格式字符串。
35 | 示例:var bytes = Bytes.fromString("Привет, мир!", "utf-8");
返回UTF-8编码的字符串。
36 | md5
37 |
38 | ( ) returns: string
39 | 返回表示该字节数组的MD5的32个字符的字符串。
40 | crc32
41 |
42 | ( ) returns: integer
43 | 返回该字节数组的CRC32技术结果的整数值。
44 |
45 | compare
46 | ( other: Bytes ) returns : integer, -1,0,1
47 | 比较两个Bytes对象的内容是否相等, 返回-1,0或1,其中当两个对象的内容相等时返回0。
48 | save
49 |
50 | ( filename :string ) returns: true|false
51 | 保存字节数组到文件。如果文件已经存在,则覆盖。
52 | load
53 |
54 | ( filename :string ) returns: Bytes
55 | 静态方法。创建一个新的Bytes对象,并将filename文件加载到它,并返回该对象。
56 | compress
57 |
58 | ( ) returns: Bytes
59 | 创建一个新的Bytes对象 - 原始字节数组的压缩版本。
60 | decompress
61 |
62 | ( ) returns: Bytes | null
63 | 创建一个新的Bytes对象, 恢复先前压缩的字节数组。如果数组之前为压缩则返回null 。
64 |
65 |
66 |
--------------------------------------------------------------------------------
/content/script/Error.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Error(错误)对象
7 | 错误对象, 当脚本运行时检测到错误抛出的对象。
8 |
9 | 常量
10 | N/A
11 | 属性
12 | name
13 | - string , 只读, 目前等同于"Error"。
14 | message
15 | - string , 只读, 错误消息。
16 | stackTrace
17 | - string , 只读, 错误的堆栈轨迹。
18 | data
19 | - any , 读写, 可选. 额外的错误数据。比如在view.request()中,error包含{ status: ..., response: ... }
对象。
20 | 方法
21 | N/A
22 |
23 |
--------------------------------------------------------------------------------
/content/script/Float.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Float(浮点)对象
5 |
6 |
7 |
8 | Float(浮点)对象
9 | 浮点值是这个类的"对象"。
10 |
11 |
12 |
13 |
14 | 常量
15 |
16 | MIN
17 | - float , 浮点类型的最小值。
18 |
19 | MAX
20 | - float , 浮点类型的最大值。
21 |
22 |
23 | 方法
24 |
25 | toFloat
26 |
27 | ( ) : float
28 | 简单的返回浮点值。
29 |
30 | toInteger
31 |
32 | ( ) : int
33 | 将浮点值转换成整数。
34 |
35 | toString
36 |
37 | ( )
38 | 返回浮点数的字符串形式。
39 |
40 | toHtmlString
41 |
42 | () : string
43 | 返回转义了html规则的字符串。是toString()方法的别名。
44 |
45 | toUrlString
46 |
47 | () : string
48 | 返回转义了url规则的字符串。是toString()方法的别名。
49 |
50 | valueOf
51 |
52 | ( ) : float
53 | 简单的返回浮点值本身。
54 |
55 | min
56 |
57 | ( ... ) : float
58 | 静态方法 - 返回参数中的最小值。如Float.min(1.0, 2.0, 3.0)将会返回1.0。
59 |
60 | max
61 |
62 | ( ... ) : float
63 | 静态方法 - 返回参数中的最大值。如Float.min(1.0, 2.0, 3.0)将会返回3.0。
64 |
65 | isNaN
66 |
67 | ( ) : true|false
68 | 如果该浮点值无法表示为数字,则返回true。
69 |
70 | isFinite
71 |
72 | ( ) : true|false
73 | 如果该浮点数是一个无穷大数字,则返回true。
74 |
75 | morph
76 |
77 | ( from, to, ratio ) : float
78 | 使用后面的公式计算平均值: (to - from) * ratio + from;
79 |
80 |
--------------------------------------------------------------------------------
/content/script/Function.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | TIScript - Function(函数)对象
5 |
6 |
7 |
8 | Function(函数)对象
9 | 脚本函数对象。
10 |
11 |
12 |
13 |
14 | 属性
15 |
16 | name
17 | 只读, string. 函数名。匿名函数的该属性值为undefined。
18 |
19 | fullName
20 | 只读, string. 函数的全名,包含类名或名称空间名。匿名函数的该属性值为undefined。
21 |
22 | length
23 | 只读, integer. 返回声明的参数总数。
24 |
25 | arguments[index]
26 | 只读, string. 返回索引(基于0)位置的参数名称。
27 |
28 | optionals
29 | 只读, integer. 返回可选参数总数。
30 |
31 | namespace
32 | 只读, Namespace. 函数所属的名称空间。
33 |
34 | 方法
35 |
36 | [this]
37 |
38 | ([arg1 :string [, arg2 :string [, ... argN :string]],] functionBody :string)
39 | 构造器, 编译函数体并创建它的函数对象。arg1... argN是该函数的正式参数名称,每个值必须是对应的有效的JavaScript标识符的字符串。
40 |
41 | call
42 |
43 | ( thisObj: object [, p0:value, ... pN:value] ) : value
44 | 调用设置到thisObj的this 上下文中的该函数。
45 |
46 | apply
47 |
48 | ( thisObj: object [,p0:value, ... pN:value] [, argv:array] ) : value
49 | 调用设置到thisObj的this 上下文中的该函数。调用该函数的参数由p0 ... pN和argv 数组的成员组成。因此实际的调用参数列表为: p0, ..., pN, argv[0], ... argv[N]。
50 |
51 | exists
52 | ( tag : value, [deep = false] ) : true | false
53 | 检查tag 属性是否存在。如果deep == true,则进行深查找——查找函数本身和它的子类链。
54 |
55 | remove
56 | ( tag : value ) : void
57 | 移除函数的tag (又名name)属性。
58 |
59 | propertyAt
60 | ( tag : value ) : value
61 | 根据tag参数检索该对象中的成员/属性。它等价于obj.tag 构造函数。
62 |
63 | seal
64 | ( [strict :true|false] ) : object
65 | 密封。锁定对象的结构——调用该方法后任何对该对象属性的新增或移除操作都将会抛出一个异常。已经存在的属性可以被修改。如果strict 参数为true,则当访问未知属性是将会抛出一个异常。
66 |
67 | isSealed
68 | ( [strict :true|false] ) : true | false | undefined
69 | 如果对象被密封则返回true 。如果strict 为true 则只有seal(true) 时才返回true 。
70 |
71 | freeze
72 | ( [strict :true|false] ) : object
73 | 冻结。锁定对象 - 使该对象不可改变 - 该对象的任何的新增、移除和修改值操作都将会抛出一个异常。返回该对象本身。如果strict 参数为true,则当访问未知属性是将会抛出一个异常。
74 |
75 | isFrozen
76 | ( [strict :true|false] ) : true | false | undefined
77 | 如果对象被冻结则返回true 。如果strict 为true 则只有freeze(true) 时才返回true 。
78 |
79 |
--------------------------------------------------------------------------------
/content/script/Index.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Index(索引)对象
5 |
6 |
7 |
8 | Index(索引)对象
9 | 持久化的storage对象中的Index对象。
10 |
11 |
12 |
13 |
14 | 属性
15 |
16 | length
17 | - integer , 只读属性。index的长度, 该index表示的关联对象的数量。
18 |
19 | asc
20 | - boolean , 只写属性。index中的对象的访问方向。
21 |
22 | [key]
23 | - value , 读写属性。在key 位置的DbIndex的元素。key 必须是和DbIndex 对象相同的类型。
24 | 如果index非唯一,则返回值将是undefined 或一个数组array - 匹配该键的所有项列表。
25 |
26 | [begin..end]
27 | - keys , first和last元素范围指定的键集合。返回DbIndex从start 键到end 键的元素片段。
28 | begin是key的低边界的键值(如果为null, 则没有低边界) 。
29 | end是key的高边界的键值(如果为null, 则没有高边界) 。
30 |
31 |
32 | 方法
33 |
34 | add
35 |
36 | ( key, val [, replace: true|false ] ) : true|false
37 | 将val 对象插入到Index 中,并且将它与key 键值关联。replace参数指定当对象已经存在时是否替换它。
38 |
39 | remove
40 |
41 | ( key [,obj] ) returns: true | false
42 | 从index中根据key 移除obj 对象。如果成功则返回true ,否则返回false 。
43 | 如果Index 是唯一的, 则obj 参数时可选的。
44 |
45 | select
46 |
47 | ( min-key, max-key [, ascent [, start-inclusive [, end-inclusive]]] ) returns: selection object.
48 | 返回Index 中的selection对象。该对象基于 min-key、max-key、ascent或descent顺序、start-inclusive、end-inclusive 条件。默认值为:
49 |
50 | ascent = true
51 | start-inclusive = true
52 | end-inclusive = true
53 | 示例:
54 | var sel = index.select(minVal, maxVal, true);
55 | for( var obj in sel ) { ... }
56 |
57 | clear
58 | ( ) : undefined
59 | 从index对象中移除所有项。
60 |
61 |
--------------------------------------------------------------------------------
/content/script/Integer.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Integer(整数)值
5 |
6 |
7 |
8 | Integer(整数)值
9 | 所有的整数值都是这个类的"对象"。
10 |
11 |
12 |
13 |
14 | 常量
15 |
16 | MIN
17 | - integer , 整数类型的最小值。
18 |
19 | MAX
20 | - integer , 整数类型的最大值。
21 |
22 |
23 | 方法
24 |
25 | toFloat
26 |
27 | ( ) : float
28 | 架构整个转换成浮点数。
29 |
30 | toInteger
31 |
32 | ( ) : int
33 | 简单的返回整数值。
34 |
35 | toString
36 |
37 | ( [radix : int] ) : string
38 | 返回整数的字符串型,radix参数指定进制,取值10(默认)、8、16。
39 |
40 | toHtmlString
41 |
42 | ( [radix : int] ) : string
43 | 返回转义了html规则的字符串。是toString()方法的别名。
44 |
45 | toUrlString
46 |
47 | ( [radix : int] ) : string
48 | 返回转义了url规则的字符串。是toString()方法的别名。
49 |
50 | valueOf
51 |
52 | () : int
53 | 简单的返回整数值本身。
54 |
55 | min
56 |
57 | ( ... ) : int
58 | 静态方法 - 返回参数中的最小值。如Integer.min(1, 2, 3)将会返回1。
59 |
60 | max
61 |
62 | ( ... ) : int
63 | 静态方法 - 返回参数中的最大值。如Integer.min(1, 2, 3)将会返回3。
64 |
65 | limit
66 |
67 | ( min:int, max:int ) : int
68 | 该函数的实现代码如下:
69 | function Integer.limit(min, max)
70 | {
71 | if( this < min ) return min;
72 | if( this > max ) return max;
73 | return this;
74 | }
75 |
76 |
77 |
--------------------------------------------------------------------------------
/content/script/Net.DataSocket.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | TIScript - DataSocket对象
4 |
5 |
6 |
7 | Net.DataSocket对象
8 | DataSocket使用命名管道(windows)或TCP/IP协议Socket在相同机器("localhost"地址)或线连接的两个Sciter进程间进行双向数据交互。DataSocket支持服务端监听(DataSocket.listen()
)和客户端Socket(DataSocket.connect()
)。
9 | DataSocket发送/接收的数据为序列化的二进制格式 - 通过socket.send(data)
发送数据,以及通过socket.on("receive", function(data) {})
在其他端接收数据。所以可能需要额外的"字符串化/解析"处理。
10 |
11 | 属性
12 | 方法
13 | connect
14 |
15 | ( name : string [, port : integer] ) : DataSocket
16 | 客户端DataSocket的创建方法。返回一个新的处于连接状态的socket。如果指定了port 参数,则name 被认为是通过TCP/IP连接时的域名或地址,否则name被认为是命名管道的名称(或局域网socket)。
17 | listen
18 |
19 | ( acceptor : function, name : string [, port : integer] ) : DataSocket
20 | 服务端DataSocket的创建方法。返回一个新的处于监听状态的socket。如果指定了port 参数,则name 被认为是通过TCP/IP连接时的域名或地址。
21 | acceptor 函数在每个新连接请求到达服务端是调用。该函数的签名:
22 | function acceptor( connectionSocket: DataSocket ) : true | false
23 | 其中:connectionSocket 是用于与远程通信的另一个DataSocket示例。
24 | 若要接受和使用这个连接,你必须返回true 。
25 | on
26 |
27 | ( event : string, callback : function ) : this
28 | 将下面的Socket事件之一绑定到callback回调函数:
29 |
30 | "connect" -> function()
, socket连接到主机;
31 | "data" -> function(data:any)
, 已经接收到数据;
32 | "sent" -> function()
, 上一次send()
操作完成;
33 | "error" -> function(err: Error)
, 发生错误, 错误对象会传递给该回调函数;
34 | "close" -> function()
, socket被关闭;
35 | 这些事件名称可以包含".namespace"名称空间。它被用在.off()函数中。
36 | off
37 |
38 | ( event : string | callback : function ) : this
39 | 根据事件名或回调函数来解除事件绑定。
40 | 事件名可以只包含名称空间部分。所以这样的代码socket.off(".namespace")
将会解除所以设置了该名称空间的事件绑定。
41 | send
42 |
43 | ( data : any )
44 | 该方法用于将数据发送到远程端。data可以为任何可序列化的数据类型(对象、数字、字符串、数组等)。
45 | close
46 |
47 | ( )
48 | 关闭socket。
49 |
50 |
--------------------------------------------------------------------------------
/content/script/Net.Socket.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | TIScript - Socket对象
4 |
5 |
6 |
7 | Net.Socket对象
8 | Socket使用命名管道(windows)或TCP/IP协议Socket在相同机器("localhost"地址)或线连接的两个Sciter进程间进行双向数据交互。Socket支持服务端监听(Socket.listen()
)和客户端Socket(Socket.connect()
)。
9 | Socket发送/接收的数据为序列化的二进制格式 - 你可以通过socket.send(data)
发送数据,以及通过socket.on("receive", function(data) {})
在其他端接收数据。
10 |
11 | 属性
12 | active
13 | - boolean , socket状态, true - socket处于可用状态。
14 | address
15 | - string, 远程机器的地址。
16 | 方法
17 | connect
18 |
19 | ( name : string [, port : integer] ) : DataSocket
20 | 客户端DataSocket的创建方法。返回一个新的处于连接状态的socket。如果指定了port 参数,则name 被认为是通过TCP/IP连接时的域名或地址,否则name被认为是命名管道的名称(或局域网socket)。
21 | listen
22 |
23 | ( acceptor : function, name : string [, port : integer] ) : DataSocket
24 | 服务端DataSocket的创建方法。返回一个新的处于监听状态的socket。如果指定了port 参数,则name 被认为是通过TCP/IP连接时的域名或地址。
25 | acceptor 函数在每个新连接请求到达服务端是调用。该函数的签名:
26 | function acceptor( connectionSocket: DataSocket ) : true | false
27 | 其中:connectionSocket 是用于与远程通信的另一个DataSocket示例。
28 | 若要接受和使用这个连接,你必须返回true 。
29 | on
30 |
31 | ( event : string, callback : function ) : this
32 | 将下面的Socket事件之一绑定到callback回调函数:
33 |
34 | "connect" -> function()
, socket连接到主机;
35 | "data" -> function(data:string)
, 已经接收到数据;
36 | "sent" -> function()
, 上一次send()
操作完成;
37 | "error" -> function(err: Error)
, 发生错误, 错误对象会传递给该回调函数;
38 | "close" -> function()
, socket被关闭;
39 | 这些事件名称可以包含".namespace"名称空间。它被用在.off()函数中。
40 | off
41 |
42 | ( event : string | callback : function ) : this
43 | 根据事件名或回调函数来解除事件绑定。
44 | 事件名可以只包含名称空间部分。所以这样的代码socket.off(".namespace")
将会解除所以设置了该名称空间的事件绑定。
45 | once
46 |
47 | ( event : string, callback : function ) : this
48 | 与on()功能相同,但是订阅的回调函数只会执行一次( 回调函数将会在第一次调用只会被移除)。
49 | send
50 |
51 | ( data : any )
52 | 该方法用于将数据发送到远程端。data可以为任何可序列化的数据类型(对象、数字、字符串、数组等)。
53 | close
54 |
55 | ( )
56 | 关闭socket。
57 |
58 |
--------------------------------------------------------------------------------
/content/script/Net.WebSocket.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | TISCript - WebSocket对象
4 |
5 |
6 |
7 | Net.WebSocket对象
8 | 它是WebSocket协议 的基本实现。
9 |
10 | 属性
11 | 方法
12 | connect
13 |
14 | ( url : string [, timeout : duration] ) : WebSocket
15 | WebSocket的静态构造函数。websocket接受的URL结构: "ws://domain/path"。返回一个新的处于INITIAL状态的socket。timeout 是连接的超时时间。当连接超时将产生一个错误。
16 | on
17 |
18 | ( event : string, callback : function ) : this
19 | 绑定callback回调函数到socket事件上:
20 |
21 | "connect" -> function(), socket连接到主机;
22 | "text" -> function(data), 接收到文本数据包,data中包含字符串;
23 | "binary" -> function(data), 接收到二进制数据包,data中包含字节(Bytes)对象;
24 | "error" -> function(errmsg), 发生错误
25 | "close" -> function(), socket关闭;
26 | 这些事件名可以包含".namespace"名称空间部分,它可以用在.off()函数中。
27 | once
28 |
29 | ( event : string, callback : function ) : this
30 | 类似于on(),但是该方法绑定的callback只会执行一次(事件处理器绘制第一层调用后自动移除)。
31 | off
32 |
33 | ( event : string | callback : function ) : this
34 | 根据事件名或回调函数来解除事件绑定。
35 | 事件名可以只包含名称空间部分。所以这样的代码socket.off(".namespace")
将会解除所以设置了该名称空间的事件绑定。
36 | send
37 |
38 | ( data : string | Bytes )
39 | 该方法发送文本或二进制帧消息到WebSocket服务器。
40 | close
41 |
42 | ( )
43 | 发生关闭连接请求道服务端,并且关闭socket。
44 |
45 |
--------------------------------------------------------------------------------
/content/script/Storage.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | Storage(存储)对象
4 |
5 |
6 |
7 | Storage(存储)对象
8 | 代表持久性存储。
9 |
10 |
11 |
12 |
13 | 属性
14 |
15 | root
16 | - object , 读写属性。Storage中的根对象。
17 |
18 | autocommit
19 | - boolean , 只读属性。表示Storage自动提交所有关联对象到存储器中。
20 |
21 |
22 | 方法
23 |
24 | open
25 |
26 | ( file-name [, autocommit] ) returns: storage | null
27 | 静态方法。打开file-name 文件存储对象,并返回该存储对象的实例。
28 | autocommit 指定storage关联的对象是否自动提交到存储器中。默认为true 。
29 |
30 | close
31 |
32 | ()
33 | 关闭底层的存储对象。如果autocommit 为true,则将提交所有数据。
34 |
35 | commit
36 |
37 | ()
38 | 提交所有关联对象到存储器器中。
39 |
40 | createIndex
41 |
42 | ( type [, unique] ) returns: Index | null
43 | 创建一个类型为type的index对象,并返回该Index 对象。Index 是唯一还是可重复的依赖于unique 参数。unique 默认为true 。支持的类型: #integer、#float、#date、#string 。
44 |
45 |
--------------------------------------------------------------------------------
/content/script/System.Process.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | System.Process对象
4 |
5 |
6 |
7 | System.Process对象
8 | 通过使用Process类, 你的程序可以允许另外一个程序作为子进程, 并且可以接收来自该子进程的stdout 和stderr 的输出,以及通过stdin 流向它传递数据。
9 |
10 | 属性
11 | running
12 | - boolean , 进程运行状态, true - 进程正在运行。
13 | 方法
14 | exec
15 |
16 | ( exepath : string [, arg1 : string, arg2 : string, ...] [,#detached ] ) : Process
17 | 静态方法, 创建一个新的子进程代理对象,并根据指定的进程路径和命令行参数(可选)启动进程。
18 | 默认情况下,启动的新进场属于相同的进程组 - 它将会在本进程关闭时结束。但是如果设置了#detached 参数,则子进程4父进程结束。
19 | on
20 |
21 | ( event : string, callback : function ) : this
22 | 订阅以下进程事件的回调函数:
23 |
24 | "stdout" -> function(text:string)
, 子进程打印到stdout 流中的文本;
25 | "stderr" -> function(text:string)
, 子进程打印到stderr 流中的文本;
26 | "terminate" -> function(status: integer)
, 子进程被终止,status是终止的状态码;
27 | 这些事件名称可以包含".namespace"部分,它可以被用在.off()调用中。
28 | off
29 |
30 | ( event : string | callback : function ) : this
31 | 通过事件名或回调函数取消该事件的订阅。
32 | 这些事件名称可以包含名称空间(namespace)部分。因此: socket.off(".namespace")
将取消该名称空间的所有事件处理器。
33 | send
34 |
35 | ( data : string )
36 | 该方法向子进程的stdin流中发送数据。
37 | terminate
38 |
39 | ( )
40 | 尝试终止子进程的运行。
41 |
42 |
--------------------------------------------------------------------------------
/content/script/Task.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | Function object
4 |
5 |
6 |
7 | Task对象
8 | Task对象表示一个Task - 协同例程 - 一个可以在函数执行未完成之前中断并返回一个值的函数。当这个协同例程被再次调用时, 它将继续从上次的中断点处继续执行,且它的执行上下文环境保持不变。
9 | 在Sciter中,有两种类型的协同例程:
10 |
11 | 生成器(Generator) - 使用了yield
语句的普通的函数。
12 | 异步任务(Asynchronous task) - 在函数体中使用了await
语句的普通函数。
13 | Task创建方法
14 | 要创建一个生成器或异步任务,你可以在定义函数体时使用yield 或 await 语句:
15 | 异步任务:
16 | async function getRemoteData(url) { // 异步任务
17 | try {
18 | var data = await self.request(#get, url);
19 | return data;
20 | } catch (e) {
21 | return null;
22 | }
23 | }
24 |
25 | 生成器:
26 | function* listItemsBackward(list) { // 生成器任务
27 | for(var i = list.length - 1; i >= 0; --i)
28 | yield list[i];
29 | }
30 | // 使用生成器:
31 | var list = [0,1,2,3];
32 | for(var item in listItemsBackward(list))
33 | stdout.println(item);
34 |
35 |
36 | Task的调用
37 | 要启动一个生成器或异步任务,你只需将它当做普通函数一样调用即可。它们与普通函数的唯一区别时:这些函数会立即完成并返回,但这不代表这个函数已经指向完成,而且它返回的是一个Task对象。
38 | 返回的这个Task对象内部存储了这个函数,以及它的状态和'未来值' - 即这个值只有当await语句完成(异步任务)或再次调用它的next()方法时才有意义。
39 | 异步任务是一个"thenable"例程
40 | 异步Task对象有一个then()
方法,它和Promise/A+规范一致,所以它可以被当做一个promise。例如,下面函数也是一个异步任务,它并行启动了两个task,并且等待它们的完成:
41 | function getRemoteDataItems()
42 | {
43 | // 等待这两个请求处理完成:
44 | var items = promise.when( getRemoteData("http://example.com/api/v2/item1" ),
45 | getRemoteData("http://example.com/api/v2/item2" ));
46 | stdout.println(items[0],items[1]);
47 | }
48 |
49 | 属性
50 | isAsync
51 | readonly, true 如果这个Task是一个激活的异步任务(等待IO操作的完成)则返回true , 否则这个属性为false 。
52 | isGenerator
53 | readonly, true 如果这个Task是一个激活的(未完成)的生成器这返回true ,否则返回false .
54 | 方法
55 | then
56 |
57 | ( onFulfilled : function [, onRejected : function] ) : this Task
58 | 添加onFulfilled和onRejected回调函数到task的回调列表。在task完成时会调用onFulfilled(result)或onRejected(error)。
59 | then()方法可以被异步任务例程调用
60 | catch
61 |
62 | (
onRejected : function ) : this Task
63 |
添加onRejected回调函数到task回调列表中。onRejected(error)将在task抛出错误时被调用。
64 | catch()方法仅在异步task例程中被调用。
65 | 等价于调用task.then(null, onRejected);
。
66 | finally
67 |
68 | ( onComplete : function ) : this Task
69 | 添加onComplete回调函数到task回调列表中。onComplete(result | error)将在任务完成时被调用。
70 | finally()方法仅在异步task例程中被调用。
71 | 等价于调用task.then(onComplete, onComplete);
。
72 | next
73 |
74 | ( [val:any] ) : value
75 | 调用生成器函数,并且返回函数中yield语句的返回值。
76 | next()方法尽可以被生成器例程调用。
77 |
78 |
--------------------------------------------------------------------------------
/content/script/VM.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | VM 名称空间
11 | 虚拟机(VM)相关方法和属性。
12 | 这个名称空间中的方法在脚本中不总是有效的 - 它们依赖于VM创建时的特征参数。
13 |
14 | 常量
15 | 方法
16 |
17 | getProperty
18 | (obj :any, name :string | symbol): any | undefined
19 | 根据name 获取obj 的属性。
20 | 等同于const name = ... var val = obj.(name);
21 | setProperty
22 | (obj :any, name :string | symbol, val : any): any | undefined
23 | 根据name 设置obj 的属性。
24 | 等同于const name = ... obj.(name) = val;
25 | 属性
26 | unhandledExceptionHandler
27 | r/w, function - 全局未处理异常处理器。 接受一个函数签名为function(err) : true | false
的函数,该函数将会接收到错误(error)对象。 如果该函数返回true ,则异常被认为已经处理了,并且将不会再向stderr输出错误信息。
28 |
29 |
--------------------------------------------------------------------------------
/content/script/language/for-screen.css:
--------------------------------------------------------------------------------
1 |
2 | input#show-defintions
3 | {
4 | value-changed!: $1(body).hide-defintions = self:value ? null # true;
5 | }
6 |
7 | body
8 | {
9 | font-family: verdana, arial, sans-serif;
10 | font-size: 10pt;
11 | }
12 |
13 | tt, code, samp, kbd
14 | {
15 | font-family: monospace;
16 | }
17 |
18 | pre
19 | {
20 | font-family : monospace;
21 | margin : 10px 0;
22 | padding : 4px;
23 | background-color: #f0faff;
24 | border : 1px dotted #ccc;
25 | white-space : pre;
26 | }
27 |
28 | pre code { color:blue; }
29 |
30 | p
31 | {
32 | margin : 10px 0;
33 | }
34 |
35 | blockquote
36 | {
37 | margin : 10px 0 10px 10px;
38 | border-left : 2px solid #ccc;
39 | padding-left : 8px;
40 | }
41 |
42 | dt
43 | {
44 | margin-top: 10px;
45 | margin-bottom: 10px;
46 | }
47 |
48 | dd
49 | {
50 | margin-top: 10px;
51 | margin-left: 10px;
52 | margin-bottom: 20px;
53 | /*background-color: infobackground;
54 | border-left: 1px solid #ccc;*/
55 |
56 | }
57 |
58 | body[hide-defintions] dd
59 | {
60 | display:none;
61 | }
62 | body[hide-defintions] dt
63 | {
64 | margin-top: 0;
65 | margin-bottom: 0;
66 | }
67 |
68 |
--------------------------------------------------------------------------------
/core/'this'-and-'this super'-function-arguments.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 函数中的‘this’和‘this super’参数
5 |
6 |
7 |
8 |
函数中的‘this’和‘this super’参数
9 |
10 |
11 |
JavaScript和TIScript中的每个函数都有一个隐含的this
参数。
12 |
所以当你调用一个对象的方法时,比如 foo.bar(1)
方法, foo
对象会命名为this来作为函数的第一个参数来传递给 bar(param)
函数。
13 |
对于使用过JS, Python, Ruby等语言的人来说,‘this’变量应该是很熟悉的。
14 |
但是当一个内部函数想访问它外部函数的‘this’值时,你该怎么做呢? 在JavaScript中,唯一的办法是定义一个变量,并且将外部函数的 ‘this’赋值给它: var that = this;
。
15 |
为了处理这种情况,我在TIScript中引入了“super this”概念, 所以在任何一个函数中,都有以下几个隐含变量:
16 |
17 | this
– 标准的this变量;
18 | this super
– 外部函数的标准this变量;
19 | this super super
– 外部函数的外部函数的this变量;
20 | 以此类推。
21 |
22 |
下面的示例,将在标准输出上输出“6”:
23 |
24 | class Test {
25 | function this(data) {
26 | // 构造器
27 | this.data = data;
28 | // 实例字段
29 | }
30 |
31 | function Outer(arg1) {
32 | // this - 隐藏参数, 局部变量
33 | // arg1 - 参数, 局部变量
34 | function Inner(arg2) {
35 | // this - 隐藏参数, 局部变量
36 | // arg2 - 参数, 局部变量
37 | // arg1 - 外部变量 - 外部参数
38 | // this super - 外部变量 - 外部的'this'参数
39 | return (this super).data // 1
40 | + arg1 // 2
41 | + arg2 // 3
42 | }
43 | return Inner;
44 | }
45 | }
46 |
47 | var test = new Test(1);
48 | var innerFunc = test.Outer(2);
49 | stdout.println( innerFunc(3) );
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/core/Caret-positions-in-HTML.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | HTML中的插入位置
6 |
7 |
8 |
9 |
10 |
HTML中的插入位置
11 |
12 |
13 |
14 |
该文章在Sciter2以上的behavior:richtext行为中有效。
15 | behavior:richtext行为时Sciter中<richtext>
元素和Web浏览器中的<div contenteditable>
的背后行为。
16 |
Sciter1中的behavior:richtext
使用“flat”DOM模型: div:element, paragraph:element, 这个默写与Windows中的RichTextBox类似。
17 | 不过在Sciter2中,新的behavior:richtext
行为使用标准的DOM模型,它的HTML内容为: element:node, text:node, comment:node。
18 | 这个变化导致我需要重新思考插入位置的概念。
19 |
考虑下面的标记代码:
20 |
<p>12<b>34</b><i>56</i></p>
21 |
22 |
它的渲染结果如下:
23 |
1234 56
24 |
问题来了: 在这个段落中有多少个插入位置?
25 |
所有已知的内如可编辑实现都会给出这里有7个插入位置: 1前, 1和2之间, … 7后。所以他们都遵循了如Word或其他的所见即所得编辑工具的规范。
26 |
现在,考虑下这个任务, 将"AB"文本插入到段落中‘4’和‘5’之间,这时结果可能有以下几种:
27 |
28 | <b>
内部: 1234AB 56, 12<b>34AB</b><i>56</i>
;
29 | <i>
内部: 1234 AB56 12<b>34</b><i>AB56</i><p>
;
30 | <b>
和<i>
之间: 1234 AB56 12<b>34</b>AB<i>56</i>
;
31 |
32 |
问题正如我们所见: 一个(视觉)插入位置实际上最起码有3个(物理)DOM插入位置。
33 |
这是所见即所得编辑器实现的典型问题。在flat模型中,文本只是一个"样式化字符"的序列,所以这个问题不是一个主要问题。不过在HTML的所见即所得编辑器中,这个问题必须要想办法解决。
34 |
在Sciter1中,我使用了"有方向"的插入位置 – 物理插入位置取决于当前光标到达该插入位置的方向:
35 |
36 | 当你从右侧移动光标到当前位置时: <b>3|4|</b><i>5|6|</i>
37 | 当你从左侧移动光标到当前位置时<b>|3|4</b><i>|5|6</i>
38 |
39 |
这种处理方式覆盖了上面的问题#1和#2,但是问题#3依然没有覆盖。所以还需要想想办法。
40 |
其实这个问题不仅仅是字符内部和跨文本才会出现,下面的这种情况也类似:
41 |
<ul>
42 | <li>一</li>
43 | <li>二</li>
44 | </ul>
45 | <pre>一些代码</pre>
46 |
47 |
这种情况下,如果你需要在列表的文本和<pre>块之间插入段落,你会怎么做:
48 |
<ul>
49 | <li>一</li>
50 | <li>二</li>
51 | </ul>
52 | <p>一些文本</p>
53 | <pre>一些代码</pre>
54 |
55 |
你可以在你的浏览器中试一下:
56 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/core/DOM-Inspector-how-remove-border-from-input.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | DOM检视器(Inspector), 如果移除输入元素的边框
6 |
7 |
8 |
9 |
10 |
DOM检视器(Inspector), 如果移除输入元素的边框
11 |
12 |
13 |
14 |
经常有新的用户问我“怎么移除输入元素的边框” 。
15 | 也有问“下拉选择按钮” 、“日历单元格” 、“上下文菜单” 的“边框”相关问题的。
16 |
在这篇文章中,我想解释解决这类问题的同样方法,而不是回答“定义以下……”等语句。
17 |
Sciter中的输入元素要么是一个纯DOM元素,要么是多个纯DOM元素组成的复合元素。
18 |
输入元素(不支持输入元素)可以从Sciter内部的“master.css”样式表中获取它们的“原始”样式模型。要查找某个组成元素的样式,可以在Sciter.exe中启动DOM检视器,然后在该元素的图标上点击。
19 |
要使某元素高亮显示,只需在该元素上按住CTRL+SHIFT按键的同时点击鼠标,或者在检视器窗口中从DOM树中选择该元素:
20 |
21 |
检视器可以显示应用到该元素上的样式规则,已经它的最终(使用)样式。
22 |
正如你所看到的,<input>元素是没有边框的,而是通过
23 | background-image: url(theme:edit-normal); background-repeat:stretch;
背景图像拉伸铺满元素区域来实现边框效果。
24 |
theme:....
是一种虚拟图像 – 它们的渲染委托给了宿主操作系统的UI主题服务。因此<input>元素的边框是由宿主操作系统绘制的。
25 |
最后,这里给出“怎么移除输入元素的边框”的答案。
26 |
要抑制边框和任何背景的绘制,可以声明以下内容:
27 |
28 | input#my {
29 | border: none; /* 移除任何边框 */
30 | background: none; /* 移除任何(默认)背景 */
31 | }
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/core/Drag-and-Drop.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sciter中的内建的拖拽操作(Drag&Drop)
5 |
6 |
7 |
8 |
Sciter中的内建的拖拽操作(Drag&Drop)
9 |
10 |
据我所知,有两种不同的拖拽(drag-n-drop)机制:
11 |
12 | 全局拖拽 将对象从桌面上的一个窗口/程序拖拽到另一个窗口/程序上。在大多数情况下,除了额外的视觉效果,这个操作非常接近剪切板的'剪切-粘贴'操作。
13 | 窗口局部拖拽 将对象在一个窗口/表单上拖拽。例如一些购物车 的实现。
14 |
15 |
我已经为Sciter添加支持了后一种拖拽操作 – DOM元素的局部拖拽。详细内容见这里 。
16 |
请考虑下的这个任务:
17 |
下面的两个select元素:
18 |
<select id="source" size="5">
19 | <option>一<</option>
20 | <option>二<</option>
21 | <option>三<</option>
22 | </select>
23 | <select id="destination" size="5"></select>
24 |
如果我们要让它们支持将<option>元素从#source中拖拽到#destination,对于htmlayout 或the Sciter (都是基于h-smile core),可以写下以下代码:
25 |
26 | select#source > option
27 | {
28 | dragging: only-move; /* 这里我们只能移动option元素 */
29 | }
30 | select#destination
31 | {
32 | accept-drag: selector( select#source > option );
33 | /* 我们只接受select#source中的option元素 */
34 | drop: append;
35 | /* option的顺序不是相关联的,新元素总是添加到最后 */
36 | }
37 |
38 |
这样就可以讲option元素从第一个<select>中拖拽到第二个。
39 |
但是一个好的UI设计的主要原则是什么 – “discoverability”? 当拖拽时应该有一个视觉线索: 用户什么时候以及哪里可以进行拖拽。下面的伪类将会帮助我们处理这种情况:
40 |
41 | option:moving /* 正在移动(拖拽)的option */
42 | {
43 | background:blue; color:white;
44 | opacity:0.5;
45 | }
46 |
47 | select:drop-target /* 当前激活的拖拽目标元素 */
48 | {
49 | background: yellow;
50 | /* 在拖拽(D&D)操作开始后,所有可用的拖拽目标元素将会高亮显示成黄色 */
51 | }
52 |
53 | select:drag-over /* 拖拽项当前悬停的拖拽目标元素*/
54 | {
55 | outline: 1px solid green;
56 | /* 在当前鼠标位置的拖拽目标元素显示绿色的轮廓
57 | 被拖拽元素可以放置在这个目标元素上 */
58 | }
59 |
60 |
61 |
以上是在我们的程序中添加拖拽功能所要做的所有事情。
62 |
哦, 还有一条: 如果需要进行双向拖拽,那我们要怎么做 – 从#destination拖拽到#source? 方法是一样的:
63 |
64 |
65 | select#destination > option
66 | {
67 | dragging: only-move;
68 | }
69 |
70 | select#source
71 | {
72 | accept-drag: selector( select#destination > option );
73 | drop: append;
74 | }
75 |
76 |
还有一小块内容: 若将声明了drop:recycle
的元素作为拖拽目标,则放置在它声明的元素都将会被删除掉。
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/core/Formation.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | MVC or not MVC? The Formation Engine for jQuery
6 |
7 |
8 | MVC 或 非MVC? jQuery的Formation引擎
9 |
10 |
现在,有很多JavaScript框架提供了数据绑定工具(如Knockout、AngularJS等)。
11 |
它们基于一种MVC概念: 你有一些数据(M)(结构、模型), 视图(V)展示html中的数据,在模型和视图间还有一些名为控制器(C)的代码来控制它们间的交互。
12 |
基于上面所说的概念设计的那些框架确实是挺成功/方便的,不过,对我来说它们又是太侵入性了。在一些视图/页面上使用MVC是可以理解的,但是在一些其他的解决方案里MVC看起来太丑陋了。
13 |
不管怎样,这里给出了另一种可选方案…
14 |
我们不是将数据结构和它的视图分离,而是创建一个新的东西,它既是数据模型也是它的视图。
15 |
我将这个东西名称成Formation。Formation本质上是一个DOM元素的树形容器,这个容器可以复制数据的结构 (你也可以称它为模型)。Formation的值是JSON数据结构。
16 |
考虑这个示例
17 |
这里你可以看到input和子项的集合(顶部)。
18 | 在右下脚,你可以看到<section#inputs>创建的Formation树。
19 |
左边,你可以看到Formation的动态数据(可编辑的textarea)。这个这些数据会将它们反应到对应的DOM元素的状态上。同样,修改这些DOM元素也会反应到这些动态数据上。
20 |
Formation的实现主要做了两件事情:
21 |
22 | 1. 创建formation树;
23 | 2. 初始化自定义DOM元素(定义在HTML源码中)。
24 |
25 |
formations支持两组自定义元素的关键字:
26 |
当formation看到自定义DOM元素(Tag标签中包含‘-‘的任何DOM元素),它尝试从jQuery插件的注册表中找到该元素的初始化器(著名的$.fn集合),如果找到了则调用它。你可以检查js/jquery.list-input.js - 这是一个正常的jQuery插件,该插件匹配名称为“INPUT-LIST”的自定义元素。
27 |
为了创建/获取一些容器的formation,你可以调用:
28 |
29 | global [window.] formation( domel_or_$_wrapper )
函数, 或
30 | $(selector).formation()
插件。
31 |
32 |
你可以将创建的formation存储到一些变量中,并且通过它来访问DOM元素,这是一个非常有效的手段:
33 |
var inputs = $("section#inputs").formation();
34 | $(inputs.firstName).on("change", function(){...});
35 |
36 |
直接访问formation的成员比通过jQuery选择器访问它们的速度更快,因为formation的成员直接是该元素的一个引用。
37 |
你可以从这里 下载完整示例来演示看看。
38 |
Formation的未来计划: 实现所谓的repeatable formations, 这时,如果你有下面的标记代码:
39 |
40 |
<ul repeatable name="stockItems">
41 | <li><output name="name"> <output name="price" type="price"></li>
42 | </ul>
43 |
44 |
则你可以通过下面的数据来反馈它(通过formation):
45 |
[
46 | {name:"Apple", price: 1.05 },
47 | {name:"Orange", price: 0.52 }
48 | ]
49 |
50 |
它将会在ul列表中生成两个<li>元素。
51 |
有另一种不鼓励的想法:将有class开关的作为一个Formation元素,请看下面的class声明:
52 |
<div class="{someSwitch:collapsed|expanded}" >...</div>
53 |
54 |
将会是对应的formation有一个名称为“someSwitch”元素,该元素的值可以被设置false/true或0/1来改变class为<div class=”collapsed”>或<div class=”expanded”>。
55 |
更新: 请看jQuery论坛的相关讨论: forum.jquery.com/topic/mvc-or-not-mvc-the-formation-engine
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/core/Generators-and-yield.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sciter脚本中的Generator与yield
4 |
5 |
6 | Sciter脚本中的Generator与yield
7 |
8 |
9 |
在Sciter中,任何函数体内包含yield
关键字的函数都可以认为是一个生成器(generator)函数。
10 |
生成器的主要目标是产生一系列的值 – 每次调用生成器返回它的下一个值。
11 | 每当生成器执行到yield <表达式>
时,生成器就返回下一个值。
12 |
考虑下面这个生成器函数:
13 |
function ordinals() {
14 | yield "first";
15 | yield "second";
16 | yield "third";
17 | }
18 |
使用下面的代码来执行这个函数:
19 |
for(var ordinal in ordinals())
20 | stdout.println(ordinal);
21 |
22 |
这个循环体将会被执行三次,并且在生成器的每次调用中,yield将依次返回它的值。
23 | 这时,你会看到下面的输出内容:
24 |
> first
25 | > second
26 | > third
27 |
28 |
(生成器中的)yield
和(异步任务中的)await
同一种机制(协同式多线程 )的不同体现。
29 |
30 |
31 |
--------------------------------------------------------------------------------
/core/IAccessible and UI automation testing.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | IAccessible和UI自动测试
4 |
5 |
9 |
10 |
11 | IAccessible和UI自动测试
12 | Sciter3实现了与传统浏览器兼容的IAccessible接口,所以基于IAccessible的UI自动化工具对Sciter也是有效的。
13 | 为了简化UI测试脚本,进行了下面这些扩展:
14 |
15 | HRESULT IAccessible::get_accChild(VARIANT varChild, IDispatch **ppdispChild);
16 | varChild 参数可以通过VARIANT(VT_BSTR,str)
接受字符串。这个字符串被解释层一个选择器,如果找到了匹配的元素,则ppdispChild
参数将返回该元素的IAccessible的封装对象。这个方法等价于脚本中的Element.select(selector)方法。
17 | HRESULT IAccessible::get_accValue(VARIANT varChild, BSTR *pszValue);
18 | 如果varChild
参数时一个负数值(VT_I4),则它被解释成一个属性的索引,这个方法返回对应属性的值。-1-第一个属性、-2-第二个属性等等。如果varChild
参数是一个字符串(VT_BSTR),则它被解释成一个属性的名称,该方法返回对应属性的值。
19 | HRESULT IAccessible::get_accName(VARIANT varChild, BSTR *pszValue);
20 | 如果varChild
参数时一个负数值(VT_I4),则它被解释成一个属性的索引,这个方法返回对应属性的名称。-1-第一个属性、-2-第二个属性等等。
21 | HRESULT IAccessible::get_accState( VARIANT varChild, VARIANT *pvarState);
22 | 如果varChild
参数时-1(VT_I4),则该方法返回元素上定义的属性数量,值为VARIANT(VT_I4,nAttributes)
。
23 | 标准参数值和其他IAccessible方法如何工作请阅读定义的IAccessible文档。
24 |
25 |
26 |
--------------------------------------------------------------------------------
/core/Localization.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | 本地化(i18n)处理
4 |
5 |
6 | 1. 静态本地化:使用SGML实体
7 | “静态”的意思是你提前知道你的UI语言,并且在运行期不会发生改变。
8 | 假设你有下面这样的文档:
9 | <html>
10 | <head>
11 | <include src="lang:words.htm"/>
12 | </head>
13 | <body>
14 | <p>&hello; &world; !</p>
15 | </body>
16 | </html>
17 | 并且还有两个entity表文件, words-en.htm :
18 | <!ENTITY hello "Hello">
19 | <!ENTITY world "World">
20 | 和 words-zh.htm :
21 | <!ENTITY hello "你好">
22 | <!ENTITY world "世界">
23 | 那么当加载这个主HTML文档时,你将在SCN_LOAD_DATA中接收到“lang:words.htm”的URL请求(见上面的<include>
中的声明)。
24 | 对于这个请求的响应,你可以根据你的应用程序的需要觉得是返回“words-en.htm”或“words-zh.htm”的内容。
25 | 2. 静态本地化:使用内嵌方式
26 | 假设你有下面这样的文档:
27 | <html>
28 | <body>
29 | <p>
30 | <include src="lang:fragment:hello-world">Hello World</include>
31 | </p>
32 | </body>
33 | </html>
34 |
35 | 它使用<include>
来请求HTML片段。正常情况下在这里你将只会看到“Hello World”。不过当你的
36 | 应用程序一旦处理SCN_LOAD_DATA / “lang:fragment:hello-world” 请求, 则你的响应内容将会自动替换<include>...</include>
中的内容。
37 | 3. 动态本地化:使用CSS
38 | “动态”的意思是可以动态加载UI的翻译内容 – 即运行期可切换语言。
39 | 假设你有下面这样的文档:
40 | <html lang="en">
41 | <head>
42 | <style>
43 | @import url(lang.css);
44 | </style>
45 | </head>
46 | <body>
47 | <p>
48 | <span class="hello-world">Hello World</span>
49 | </p>
50 | </body>
51 | </html>
52 | 以及下面这样的lang.css内容
53 | span.hello-world:lang(en) { content:"Hello World"; }
54 | ...
55 | span.hello-world:lang(zh) { content:"你好,世界"; }
56 | ...
57 | 那么当你切换<html lang=...>
中lang属性的值时(在加载时或运行期),你将看到span.hello-world
中的内容会自动切换不同的语言。
58 | 4. 动态本地化:使用脚本
59 | dk/samples/+lang/目录中提供了一种脚本切换语言的脚本实现。 它使用了CSS aspect特性 – 为特定的DOM元素声明和绑定脚本代码。
60 | 除了支持简单的文本翻译和替换,它还支持语言智能排版和多元化(pluralization)。
61 | 5. 预处理方式
62 | 原则上,你也可以混合使用上面说的所有方法。
63 | 同时, 在某些情况下,你也可以考虑使用某种本地代码或脚本的预处理器。
64 | 比如,像下面这样的文档:
65 | <html>
66 | <body>
67 | <p>%HELLO% %WORLD% !</p>
68 | </body>
69 | </html>
70 | 这是一张很简单的预处理方式:通过本地代码在将内容提交给Sciter引擎之前,查找所有类似%HELLO%
这样的字符串,并替换它。
71 | 在脚本中,你可以使用内置的预处理特性,比如像下面这样的代码:
72 | <html>
73 | <body>
74 | <p><% =words.hello %> <% =words.world %> !</p>
75 | </body>
76 | </html>
77 | 预处理方式有一个共同的问题: 当需要替换html内容时,你需要替换整个html内容。而如果你使用实体(上面讲的第一种方式)时,你只需要下面这样的代码即可:
78 | el.html = "&hello; &world";
79 |
80 | 总之
81 | 使用哪种方式取决于你的选择。第一种和第二种方式是最有效的,通常它们可以一起使用。
82 | 因为动态填充和切换语言这种场景并不是很普遍,即使遇到这种情况也可以通过特定的函数来处理。
83 |
84 |
--------------------------------------------------------------------------------
/core/Object-match-feature.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sciter 3.2.0.3新增的对象匹配特性
5 |
6 |
7 |
8 |
Sciter 3.2.0.3新增的对象匹配特性
9 |
10 |
在Sciter 3.2.0.3中,我为内建的like
操作符和switch/like
语句添加了所谓的'对象匹配'特性。
11 |
设想我们有一个类似下面的对象/数据列表:
12 |
var shoppingCartData = [
13 | { product:"苹果", price: 0.95, calories:52 },
14 | { product:"橘子", price: 0.75, calories:47 },
15 | { product:"牙刷", price: 1.75 },
16 | "deleted",
17 | { product:"Pear", price: 1.25, calories:57 },
18 | { product:"肥皂", price: 2.75 },
19 | ];
20 |
21 |
我们要将其中的事务于其他物品分离开,若使用新的switch/like特性,语句如下:
22 |
for( var item in shoppingCartData )
23 | switch(item)
24 | {
25 | like { price: Float, calories: Integer } :
26 | // 一个食物项
27 | ...
28 | break;
29 | like { price: Float } :
30 | // 不是食物项
31 | ...
32 | break;
33 | case "deleted" :
34 | // 被删除项,跳过它
35 | break;
36 | default:
37 | // 未知项,这是一个彩蛋?
38 | break;
39 | }
40 |
41 |
42 |
为like
添加的模式匹配表达式:
43 |
if( item like { product: String, price: Float } )
44 | stdout.println( item, "is a pricey product" );
45 |
46 |
希望这个新特性会为你们的工作带来便利。
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/core/Sciter-3.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Sciter 3
6 |
7 |
8 |
9 |
10 |
11 |
Sciter 3
12 |
13 |
14 |
15 |
16 |
17 |
18 |
Sciter 3 已经正式发布
19 |
20 |
参见日志文件 。
21 |
22 |
23 |
24 | 在Windows Vista/7上,使用Direct2D绘图
25 |
26 | 在Windows XP上,使用GDI+绘图
27 |
28 |
29 |
30 |
Windows XP上的已知问题: GDI+的线性和辐射渐变不同于Direct2D,它没有“open gradients”的概念,稍后我会尝试修复它。
31 |
32 |
你应该想到,GDI+渲染的效率不能与Direct2D相比,所以应该尽量避免大范围使用动画。下面的两种媒体规则允许定义不同的绘制模式:
33 |
34 |
35 | @media graphics-layer == 1 {
36 | /* GDI+ 规则 尽量少用动画 */
37 | }
38 | @media graphics-layer == 2 {
39 | /* Direct2D WARP 模式 (软件加速)
40 | */
41 | }
42 | @media graphics-layer >= 3 {
43 | /* Direct2D 硬件加速模式,最大性能 */
44 | }
45 |
46 |
47 |
当然,大多少情况下,下面两个规则也是足够的:
48 |
49 |
50 | @media graphics-layer == 1 {
51 | /* GDI+ 规则 尽量少用动画 */
52 | }
53 | @media graphics-layer > 1 {
54 | /* Direct2D, 高性能模式 */
55 | }
56 |
57 |
58 |
在脚本中,你可以通过读取view.backend
(:integer)属性来检查gfx绘制模式。
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/core/Sciter-HTML-parsing-flavour.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Sciter中HTML的属性短格式写法
6 |
7 |
8 |
9 |
10 |
Sciter中HTML的属性短格式写法
11 |
12 |
13 |
14 |
Sciter v.3中的HTML解析器支持属性短格式写法,比较下面两种等同的声明格式:
15 |
紧凑型:
16 |
17 | <input|currency(itemPrice) value=1000>
18 |
19 |
标准型:
20 |
21 | <input type="currency" name="itemPrice" value=1000>
22 |
23 |
正如你所看到的,第一种格式更简短,且可读性更好(当然是主观上啦)。
24 |
这里是所有支持的属性短格式写法列表:
25 |
26 | #name
– id , 属性名称以‘#’字符开始,将解析为 id=”name”
27 | .name
– class , 等同于class="name"
。元素可以有多个“点属性”,它们组合成一个class属性。所以,<div.container.collapsed>等同于: <div class=”container collapsed”>。
28 | |name
– type , 属性名称以‘|’字符开始,将解析为 type="name"
29 | (someName)
– name , 属性名称以‘(‘和‘)’字符闭合,将解析为 name="someName"
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/core/Sciter-UI-basic-principles.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sciter UI的基本设计原则。调用UI背后的工作线程中的代码。
5 |
6 |
7 |
8 |
Sciter UI的基本设计原则。调用UI背后的工作线程中的代码。
9 |
10 |
11 |
我在SDK中添加了新的示例: /sdk/demos/ui-framework。
12 | 这个示例演示了“Sciter UI及它的应用架构” 文章中描述的设计原则。
13 |
14 |
这个示例演示了怎么定义一个本地函数(view.execTask() -> window::exec_task()),以及如何从工作线程中调用UI方法(通过回调)。
15 |
我已经在这篇文章 中解释了如何在工作线程中调用UI,不过在这个示例里,我使用了一种稍微不同的机制。
16 |
gui_exec函数看起来类似这样的:
17 |
// 这个函数被工作线程调用,用于执行GUI线程中gui_block
18 | inline void gui_exec( std::function<void()> gui_block )
19 | {
20 | sciter::sync::event evt;
21 | PostThreadMessage(gGUIThreadId, WM_EXEC, WPARAM(&evt),LPARAM(&gui_block));
22 | evt.wait(); // 暂停工作线程,直到GUI线程执行完毕gui_block。
23 | }
24 |
25 |
它将消息post到GUI线程的消息队列中,WM_EXEC消息的接收者是是Windows的WH_GETMESSAGE的hook函数:
26 |
// message hook to handle WM_EXEC in GUI thread
27 | static LRESULT CALLBACK gui_exec_hook_GetMsgProc(int code, WPARAM wParam, LPARAM lParam )
28 | {
29 | MSG* pmsg = reinterpret_cast<MSG*>(lParam);
30 | if(pmsg->message == WM_EXEC)
31 | {
32 | sciter::sync::event* pe = reinterpret_cast<sciter::sync::event*>(pmsg->wParam);
33 | gui_block* pf = reinterpret_cast<gui_block*>(pmsg->lParam);
34 | (*pf)(); // execute the block in this GUI thread
35 | pe->signal(); // signal that we've done with it
36 | // this will resume execution of worker thread.
37 | }
38 | return CallNextHookEx(0,code, wParam,lParam);
39 | }
40 |
Using hooks allows this mechanism to work reliably even when application is running modal dialog loops.
41 |
42 |
43 |
--------------------------------------------------------------------------------
/core/Sciter-and-DirectX.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Sciter 与 DirectX
6 |
7 |
8 |
9 |
Sciter 与 DirectX
10 |
11 |
12 |
我在Sciter 3.3.1.4增加了将HTML/CSS直接渲染到DirectX窗口的能力。
13 |
基本概念:
14 |
15 | Sciter engine is attached to the window where DirectX renders its 3D scene. WndProc uses SciterProcND delegation in Mixin integration mode . Therefore Sciter sees all UI messages coming to the window and reacts on them. Instance is created by SciterCreateOnDirectXWindow
API function.
16 | Application calls SciterRenderOnDirectXWindow
API function to render content when it is appropriate. With the function following rendering modes are supported:
17 |
18 | Document is rendered on background of 3D scene;
19 | Document is rendered in front of 3D scene (on top of it). In this case document should have transparent background and transparent element through which 3D scene can be seen;
20 | Document may contain so called layers – dedicated DOM elements (<section>s, <div>s) representing background and foreground UI layers with 3D scene rendered in between. The screen cast above represents such type of rendering. Below is an illustration of such layers:
21 |
22 |
23 |
24 |
25 |
Sciter’s DirectX API also contains SciterRenderOnDirectXTexture
API function. It is used to render HTML/CSS content on DirectX 2D textures.
26 |
If your setup requires DOM layers then it makes sense to consider adding native behavior to DOM element on front layer that will establish view on 3D scene. Such a behavior will catch mouse and keyboard events and reroute them to view/model manipulations.
27 |
Scripts can also be used to manipulate 3D view/model variables. Check {sciter-sdk}/demos.win/sciter-directx/ demo project – it demonstrates all this.
28 |
29 |
--------------------------------------------------------------------------------
/core/Sciter-on-multihead-system.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Sciter运行在不同监视器DPI设置的Windows 8.1系统的多屏系统上
6 |
7 |
8 |
9 |
10 |
Sciter运行在不同监视器DPI设置的Windows 8.1系统的多屏系统上
11 |
12 |
13 |
高分辨率的显示器终于来了。也许在不久的未来,你会添加一个台式机或笔记本。如果是这样的话,你就会有多个不同显示器,它们有着不同的分辨率。一个是标准的96 dpi,另一个是也许是250 dpi。
14 |
现在, Windows(v 8.1 及以上) 运行设置不同的监视器有不同的DPI设置 。
15 |
如果你的台式机共享多个显示器,你将有可能将某个应用程序窗口从一个屏幕移动到另一个屏幕。但是如果这两个屏幕拥有不同的DIP设置,则你的应用程序在两个屏幕间移动时需要支持动态DPI改变。
16 |
Sciter引擎从V3.0.2.0版本开始已经支持这种动态DIP设置了。在sdk/samples/basics/test-system-font-and-dip.htm这里可以看到这个示例,当将该Sciter示例窗口在不同DPI监视器间移动时,你将看到:
17 |
18 |
为了使你的HTML/CSS UI能漂亮地演示这个特性,你需要在你的设计中使用逻辑长度单位: dip (设备独立像素, 1/96 每英尺), pt, mm, in, cm等等。注意,在Sciter中,1px是一个物理单位 – 它总是指一个物理像素。在某些情况中(例如,边框宽度),你如果将尺寸/大小依然设置为物理像素,这有可能会产生一个异常。当你需要动态调整窗口尺寸时,你需要布局动态调整,使用弹力单位总是最好的选择。
19 |
注意,上面的动画中,Sciter加载的文档有三个方框: 100px, 100dip and 100dip。最后一个方框的边框也定义为dip – 当窗口移动到左边的监视器(使用125%缩放比例),这些具有变成了不同的大小。所以后面两个也自动适应了的窗口尺寸。
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/core/Sciter-video-support.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 现在,Sciter支持<video>了
6 |
7 |
8 |
9 |
10 |
现在,Sciter支持<video>了
11 |
12 |
13 |
14 |
已经为Sciter添加了基本的<video>支持。
15 |
<video>元素(实际上是behavior:video)作为一个无窗口的普通DOM元素,可以在它上做动画、变换,已经将其他DOM元素在它之上渲染。
16 |
下面是Sciter中播放视频(标准的30 fps)的一个截图,并且这个视频在semi-transparent背景上做了动画和变换。
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/core/TIScript-syntax-compatible-with-CSS.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 使TIScript语法兼容CSS
6 |
7 |
8 |
9 |
10 |
使TIScript语法兼容CSS
11 |
12 |
13 |
14 |
一次又一次地当我需要在脚本中定义一些CSS时,我感觉到我自己不是很舒服的。 – CSS和JavaScript/TIScript使用不同的语法。
15 |
考虑下JavaScript中的这样的代码:
16 |
17 | function switchState()
18 | {
19 | element.style.backgroundColor = "rgb(126,0,0)";
20 | element.style.transform = "rotate(45deg) translate(10px,10px)";
21 | }
22 |
23 |
这样的代码不是很美观,而且解析起来也不是很有效。
24 |
而且,如果你想从样式中获取当前的旋转角度, 然后对它增加一些值,然后再回写它,则你需要先解析这个样式值中的CSS规则,计算后又转换成字符串设置回去。
25 |
我已经研究过许多JS框架是如何与CSS协同工作 – 在它们的代码里大部分是在解析CSS代码。
26 |
然而浏览器已经解析过CSS,并且已经创建好了内部数据结构用于展示CSS值。 这样的代码以及在这里了,为什么我们不复用它们?
27 |
处理这个问题的方法之一是将CSS内部数据使用所谓的CSSOM 模型暴露出来。但是这是需要很多工作量,而且结果依然不是很简洁。
28 |
理想的方式应该是这样的:
29 |
30 | function switchState()
31 | {
32 | element.style.set {
33 | background-color: rgb(126,0,0),
34 | transform: rotate(45deg) translate(10px,10px)
35 | }
36 | }
37 |
38 |
而且原则上,JS语法可以扩展支持这样的创建方式,而且不会与已存在的代码冲突:
39 |
40 | 允许在对象的名称中使用-符号,比如background-color
。
41 | 允许数值可以有类似45deg
、10px
这样的单位。这需要在JS中添加新的数据类型,不过这对他们来说是得心应手的。
42 | 为语言添加所谓的"标签元组"。在CSS中,rotate(45deg)
不是一个函数调用,而是一个元组(有名称的数据结构)。在TIScript中它可以写成[rotate:45deg]
– 一个包含‘rotate’标签的元素元组。
43 | 使空白符成为一个有效的列表分隔符,最起码在对象声明中, 所以下面的代码:
44 |
45 | { transform: rotate(45deg) translate(10px,10px) }
46 |
47 | 将等价于:
48 |
49 | { transform:[rotate(45deg), translate(10px,10px)] }
50 |
51 | 这样写是不是非常棒?
52 |
53 |
实际上,CSS语法(有时候看起来可能非常乱)确实是使用两种类型的列表和一个tuple<2> (优先顺序):
54 |
55 | 逗号分隔的列表: background: url(1.png),url(2.png);
56 | 空白符分隔的类别: background: no-repeat url(1.png);
57 | 对-元组: font: 12pt 10pt/14pt "arial";
58 |
59 |
不过,这些都是下一阶段要做的事,目前我将尝试为值添加单位,以及空白符分隔的列表...
60 |
61 |
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/core/Theory-of-URL.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 为开发者介绍下URL的“原理”
5 |
6 |
7 |
8 |
为开发者介绍下URL的“原理”
9 |
10 |
11 |
现在,我们使用过很多URL, 但是并不是所有人都明白URL到底是什么。
12 |
在这篇文章里,我将尝试解释它们的结构,以及Sciter/HTMLayout怎么处理它们的。
13 | 请注意这是一张非正式解释,我这里讲的“URL”,实际上更正确的名称应该是“URI”。
14 |
URL由5个主要部分组成:
15 |
16 | <模式/协议> : [//] <资源唯一标识> [ ? <查询> ] [ # <片段/书签> ]
17 |
18 |
其中:
19 |
20 | 模式/协议
– 原则是是一个名称token – URL的协议名称。 如: “file:”, “http:”等。
21 | //
部分 – 如果有的话,它的含义是接下来的 “资源唯一标识”部分采用层次化的命名约定,并且以‘/’作为分隔符。
22 | 资源唯一标识
– 如果它之前有‘//’,则它是由‘/’分隔的路径名,否则它是一个“平”名称。
23 | 查询
部分原则上只对“动态客户端/服务端”场景有意义。 它是客户端为服务端提供的资源的一些参数说明。
24 | 片段/书签
– 是一个名称,或者是资源中某一个位置或部分的ID。
25 |
26 |
考虑下这种场景,当你在3个不同的位置上有一些相同的test-file.html文件:
27 |
28 | file:///c:/test-folder/test-file.htm
29 | http://example.com/test-folder/test-file.htm
30 | res:test-file.htm
31 |
32 |
我们假设这个文档中包含一个有一个相对路径的图片:
33 |
34 | <html>
35 | <img src="image.png">
36 | </html>
37 |
38 |
在加载这个文档时,Sciter将会按照以下步骤来处理“image.png”这个名称的路径:
39 |
40 | file:///c:/test-folder/image.png – 作为基URL的一个分层。
41 | http://example.com/test-folder/image.png – 同上。
42 | res:image.png – 这里仅继承基URL的资源协议。
43 |
44 |
原则上,你的Sciter应用程序可以定义你自己的URL协议。你只需要觉得它是分层的还是“平”的。
45 |
例如,如果你调用SciterLoadHtml(html, "app://module/main.htm");
,则文档中的所有相对链接
46 | 将会把app://module/
当做基地址。所以在你的SCN_LOAD_DATA处理事件中,你将会收到: “app://module/images/img1.png”, “app://module/styles.css” 等等。
47 |
但是,如果你计划将你的所有文件都放到你的应用程序的资源文件中时,你应该使用一种类似 “res:”的“平”协议。
48 |
最后需要注意的是: 如果你在SciterLoadHtml和SciterLoadFile中使用了层次URL,则这些URL必须是绝对定位,否则Sciter将不知道怎么处理它们。
49 |
50 |
51 |
--------------------------------------------------------------------------------
/core/Use-of-CSS-constants-in-script.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 在脚本中使用CSS常量
5 |
6 |
7 |
8 |
在脚本中使用CSS常量
9 |
10 |
11 |
在Sciter中,你可以使用@const来定义CSS常量,比如:
12 |
13 | <style>
14 | @const TEST_STR:"test";
15 | @const TEST_COLOR: rgb(128,0,0);
16 | @const TEST_NUMBER: 128;
17 | </style>
18 |
19 |
这些常量不仅可以在CSS中使用(比如@TEST_COLOR),也可以在脚本中使用:
20 |
21 | var test_str = self.style.constant("TEST_STR");
22 |
23 |
如果你觉得self.style.constant
太繁琐,你可以为它定义一个"字符串器"函数:
24 |
25 | function $const( name ) { return self.style.constant(name) || ""; }
26 |
27 |
这样你就可以这样使用了:
28 |
29 | var t1 = $const(TEST_STR); // 字符串, "test"
30 | var t2 = $const(TEST_COLOR); // 颜色类型, color(128,0,0)
31 | var t3 = $const(TEST_NUMBER); // 整数, 128
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/core/behavior-prototype-aspect.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Behavior与CSS中的prototype/aspect属性
6 |
7 |
8 |
9 |
10 |
Behavior与CSS中的prototype/aspect属性
11 |
12 |
13 |
14 |
从一开始,Sciter就支持将一个声明的脚本类附加到DOM元素上。
15 |
如果你想使你的文档中的所有div.some-widget元素都拥有一些特别的行为(子类化), 你需要:
16 |
1. 在脚本中声明
17 |
class SomeWidget : Behavior {
18 | function attached() { ... } // 该方法中的'this'为子类化的DOM元素
19 | function detached() { ... }
20 | // ... SomeWidget特有的方法在这里指定
21 | }
22 |
2. 在CSS中声明
23 |
div.some-widget { behavior:SomeWidget; }
24 | /* 或者,如果SomeWidget的声明在其他文件中: */
25 | div.some-widget { SomeWidget url(some-widget.tis); }
26 |
在上面的声明中,所有的有class=”some-widget”的div都将被附加了SomeWidget类。这个机制我已经在8年前讲过了。
27 |
这个机制是很可靠的,也是非常方便的。
28 |
behaviors/prototypes的唯一问题是 – 在给定时刻,一个DOM元素只能有一个脚本类。JavaScript和TIScript都不支持多层继承。
29 |
设想一下,在脚本中,你有多个函数要为某些DOM元素指定一些特定的功能。
30 | 或者说,每个这样的函数添加到被调用的DOM元素自己的aspect (部分功能)。类似下面:
31 |
function addClickHandlerFor(element) {
32 | // 通过html中的"click"元素的属性添加onClick处理器
33 | element.on("click", function() {
34 | var attrClick = element.attributes["click"];
35 | element.eval(attrClick); // 对表达式进行求值
36 | });
37 | }
38 |
你可以有一个这样的函数集来配置不同的元素/行为的aspect。
39 |
上面的流程是原则上的,不过你可能需要为你需要这样配置的元素显示的调用这些函数,同时不用忘了为动态创建的内容调用它们。
40 |
考虑上面的这些情况,我为Sciter引入了特有的CSS属性——‘aspect’。
41 |
The aspect
CSS property
42 |
它的声明为
43 |
44 | aspect: "函数名" [ url(of-function-implementation-file) ];
45 |
46 |
其中,"函数名"
是一个“aspect”函数的全名,指为DOM元素配置/装载额外功能的函数。 其中的url()
是定义该函数的文件名。
47 |
aspect处理原则:
48 |
“aspect”函数时一个普通的tiscript脚本函数。
49 |
50 | 其中的this
变量指向满足CSS规则的DOM元素。
51 | 在DOM元素的生命周期内只会执行一次。
52 |
53 |
同时, aspect属性使用非标准的继承性 – 如果元素有多个CSS匹配规则中都定义了aspect,则该元素所使用的aspect是所有这些规则定义的aspect列表。因此,如果你有下面的规则 (来自Plus引擎的示例):
54 |
[click] { aspect:"Plus.Click"; }
55 | [dblclick] { aspect:"Plus.DblClick"; }
56 |
57 |
同时,元素在html标志中的定义如下:
58 |
<b id="clickable" click="..." dblclick="...">text</b>
59 |
它将拥有两个调用函数 – Plus.Click()
和 Plus.DblClick()
。等同于下面的CSS定义:
60 |
#clickable { aspect:"Plus.Click" "Plus.DblClick"; }
61 |
62 |
这个aspect机制在Sciter SDK中的Plus ( /samples/+plus/ ) 和 Lang ( /samples/+lang/ )引擎中已经在使用了。
63 | Plus提供了类似AngularJS的声明式数据绑定功能。Lang提供了对i18n的支持。
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/core/ccs-map.html:
--------------------------------------------------------------------------------
1 | CSS 属性
2 |
3 | 字体和段落属性
4 |
5 |
6 | font-family
7 |
8 | 值为以逗号分隔的列表值,列表中每项为以下值之一:
9 |
10 |
11 | family-name
12 | 系统中已安装的任何可用的字体家族名。比如: Times, Helvetica, Zapf-Chancery, Western, 或 Courier。
13 |
14 | generic-name
15 | 对应字体家族中的任何值: serif, sans-serif, cursive, fantasy, 或 monospace。
16 |
17 |
18 | 示例:
19 |
20 | body {
21 | font-family: "Gill Sans Extrabold", Helvetica, sans-serif;
22 | }
23 |
24 |
25 |
26 |
27 | font-size
28 |
29 | 字体的大小, 可以指定以下值之一:
30 |
31 |
32 | named-font-size
33 | 一系列预定义的字体尺寸关键字集合。缩放根据用户的字体设置选项。
34 | 可能的值有: xx-small , x-small , small , medium , large , x-large , xx-large ;
35 |
36 | relative-size
37 | 一系列代表相对于父对象字体尺寸的关键字集合。
38 | 可能的值有: larger , smaller ;
39 |
40 | length
41 | 长度单位 值;
42 |
43 | percentage
44 | 一个整数, 后面跟着一个百分号(%)。值代表父对象字体尺寸的百分比;
45 |
46 |
47 | 示例:
48 |
49 | /* <length> values */
50 | font-size: 12px;
51 | font-size: 0.8em;
52 |
53 | /* <percentage> values */
54 | font-size: 80%;
55 |
56 |
57 |
58 | 长度单位
59 |
60 | 一个浮点数, 后面跟着一个绝对单位(cm, mm, in, pt, pc, px) 或相对单位 (em, ex)。关于支持的长度单位的更多信息, 参见CSS长度单位。
61 |
--------------------------------------------------------------------------------
/core/collapsed-and-expanded-state.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Sciter中的“collapsed”和“expanded”状态
7 |
8 |
9 |
10 | Sciter中的“collapsed”和“expanded”状态
11 |
12 |
collapsed(折叠)/expanded(展开)概念在UI中使用的是非常广泛的, 所以我解决的将他们添加到Sciter的内核中。
13 |
所以在脚本中可以读写这两个通用的UI状态标识:
14 |
element.state.collapsed = true /*or false*/;
15 | element.state.expanded = true /*or false*/;
16 |
这两状态是相互关联的 – 元素可以是collapsed或expanded状态, 但不可能同时处于这两种状态,即当element.state.expanded = true;
时,则element.state.collapsed
将被设置为false, 反之亦然。默认情况下,元素的这两种状态都为false – 非collapsed也非expanded。
17 |
在CSS中,有两个伪类反应这两种状态:
18 |
element:collapsed { ... }
19 | element:expanded { ... }
20 |
在不同的场景中,collapsed和expanded状态表示不同的含义。在某些场景中,折叠的元素意味着元素是隐藏/不可见的,它的CSS定义如下:
21 |
element:collapsed { visibility:none; }
22 |
而在另外一些场景中, 比如有标题区和内容区的section, 折叠状态意味着“隐藏内容区,但总是显示标题区”
23 |
<section.collapsible>
24 | <header>标题</header>
25 | <div>
26 | ... 内容 ...
27 | </div>
28 | </section>
29 |
在这种场景中,CSS可能包含这样的visibility规则:
30 |
section.collapsible:collapsed > div { visibility:none; }
31 |
所以当section处于折叠状态时,它的内容div是完全隐藏的。并且它可能在标题区定义了可见的折叠状态, 比如 +/-图标等。
32 |
在脚本中,你可以很容易触发它的expands/collapse的状态:
33 |
self.on("click", "section.collapsible > header", function(evt) {
34 | // 在标题区上点击
35 | var section = this.parent;
36 | // 切换collapsed状态:
37 | section.state.collapsed = !section.state.collapsed;
38 | });
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/core/construction-mean-TIScript.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | TIScript中的“::”构造器的含义是什么?
6 |
7 |
8 |
9 |
10 |
TIScript中的“::”构造器的含义是什么?
11 |
12 |
13 |
14 |
在一个邮件中曾提到这个问题…
15 |
它是TIScript中声明匿名函数的格式 之一,称为单语句lambda(希腊字母的第11个字)函数 :
16 |
':' [参数-列表] ':' <语句>;
17 |
比如说,我们有这样的JavaScript代码:
18 |
var counter = 0;
19 | var inc = function() { counter++; }
20 |
当我们每次调用inc()
, 计数器counter就会加1。
21 |
在TIScript中除了这种写法,可有一种声明匿名函数的轻量级语法:
22 |
var counter = 0;
23 | var inc = :: counter++;
24 |
其中,第一个“:
”等同于JS声明中的“function(
”,而第二个“:
”等同于JS声明中的“)
”。
25 |
当然,你也可以在TIScript中使用JS的标准方式来声明匿名函数, 我只是认为有时更短的格式使用更方便。像这里:
26 |
var accounts = [...]; // 账户列表
27 | accounts.sort( :a,b: a.balance - b.balance );
28 |
声明的这种写法是不是比下面这种写法更简洁:
29 |
accounts.sort( function(a,b){ return a.balance - b.balance });
30 |
Ruby也有一种类似的轻量级声明方式:
31 |
[1,2,3,4,5].each {|i| print "#{i} "}
32 |
对应的JS如下:
33 |
[1,2,3,4,5].each(function(i){ println("#",i);});
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/core/csss!-calc-function.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | CSSS!中的calc()函数
5 |
6 |
7 |
8 | CSSS!中的calc()函数
9 | calc(<表达式>) 函数可以用在接受长度值的任何位置。括号中的表达式会计算为em 长度单位。在h-smile中calc()中的表达式将会被CSSS!求值引擎解释,它可以使用CSSS!特性的一个限制子集。在表达式中你可以访问DOM属性和元素的状态,请使用下面的语句:
10 |
11 | self.attribute
- 访问元素的DOM属性。
12 | self:state-flag
- 访问DOM元素的运行期状态标志: hover、active、focus等。
13 | 其中,self
是调用calc()
函数的元素引用。
14 | 可以在calc()函数中使用的DOM元素的函数(方法)
15 | 下面是为calc()
函数中的CSSS!定义的方法集:
16 |
17 | [element.]children()
- integer, 返回元素的子元素数量。
18 | [element.]child(n:integer)
- DOM元素, 返回在n 位置的子元素。n 是一个范围在1..children()
间的正数。
19 | [element.]next()
- DOM元素, 返回当前元素的下一个兄弟元素。
20 | [element.]previous()
- DOM元素, 返回当前元素的上一个兄弟元素。
21 | [element.]parent()
- DOM元素, 返回当前元素的父元素。
22 | 选择器方法:
23 |
24 | element.$( selector )
- 返回满足选择的元素集合。这个返回只会检索element的子元素。selector中的:root
伪类匹配element元素。示例: self.$(:root > li):expanded = true
将仅会为self的直接li 子元素设置expanded状态。
25 | element.$1( selector )
- 同上,区别是仅返回一个满足选择器的元素。
26 | element.$p( selector )
- 返回匹配selector的element元素的父元素集。selector中的:root是全局的DOM根元素。
27 | element.$1p( selector )
- 返回匹配selector的最近父元素。selector中的:root是全局的DOM根元素。
28 | [element.]text-width("string")
- 返回当前样式下的element元素的string字符串的像素宽度。
29 | [element.]min-intrinsic-width()
, [element.]max-intrinsic-width()
- 元素的内在宽度。
30 | [element.]min-intrinsic-height()
, [element.]max-intrinsic-height()
- 元素的内在高度。
31 | [element.]system-scrollbar-width(),[element.]system-scrollbar-height()
- 系统中垂直/水平滚动条的宽度/高度。
32 | [element.]system-border-width()
- 系统形状的输入元素的边框宽度。
33 | [element.]system-small-icon-width(),[element.]system-small-icon-height()
- 宿主系统使用的小图标尺寸。
34 | [element.]foreground-image-width(),[element.]foreground-image-height()
- 为element元素定义的前景图像(如果存在)的物理尺寸。
35 | [element.]background-image-width(),[element.]background-image-height()
- 为element元素定义的背景图像(如果存在)的物理尺寸。
36 |
37 |
--------------------------------------------------------------------------------
/core/event_handler_assignment.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 事件处理器的赋值
6 |
7 |
8 |
9 |
10 |
事件处理器的赋值
11 |
12 |
13 |
Sciter支持jQuery风格的事件处理器赋值方式:
14 |
element.on("event", "selector", function(evt) {...});
15 |
这种方式大部分情况下已经足够了,不过因为某些元素,我觉得它“不够美观” 所以我正在想它的替代方法。
16 |
目前,有一个比较灵活的选项/主意,类似下面这样:
17 |
// subscribe function for "click" event on element
18 | element << event click (evt) {...};
19 |
上面的语句等同于
20 |
element.on("click", function (evt) {...});
21 |
以及它的完整格式(带选择器):
22 |
// subscribe function for "click" event on <button id=first> element
23 | self << event click $(button#first) (evt) {...};
24 |
目前主要的挑战是JS syntax/grammar…
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/core/frame-content-style.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | frame content-style
7 |
8 |
9 |
10 |
11 |
12 |
13 | <frame content-style="content.css">
14 |
15 |
16 |
17 |
Sciter中,<frame>元素可以定义content-style
属性。
18 |
19 | content-style
属性定义src属性中的URL指定的文档的顶层样式表:
20 |
21 |
<frame src="some-child.htm" content-style="content.css" />
22 |
23 | 如果这个some-child.htm文档的末尾定义了<link rel="stylesheet" type="text/css" href="content.css">
,则content.css文档将会附加到some-child.htm样式表的末尾:
24 |
25 |
<html>
26 | <head>
27 | <style>
28 | ... 本地样式 ...
29 | </style>
30 | </head>
31 | <body>
32 | ... 本地内容 ...
33 | </body>
34 | <link rel="stylesheet" type="text/css" href="content.css" />
35 | </html>
36 |
37 |
38 |
39 | 所以当宿主文档想:
40 |
41 |
42 |
43 | 自定义渲染frame中的子文档时
44 |
45 |
46 | 为子文档注入一些脚本行为时
47 |
48 |
49 |
50 | 它可以指定自己的content.css文件,而无需修改那些子文档。
51 |
52 |
53 | Sciter SDK 内建的文档浏览器就是一个content-style属性的使用示例:
54 |
55 |
56 |
57 | {sciter-sdk]/doc/main.htm
58 |
59 | 定义的内容frame为:
60 |
61 |
<frame #content src="content/preface.htm" content-style="styles/content.css"/>
62 |
63 | 因此,每个加载到frame中的子文档都会应用
64 | {sciter-sdk}/doc/styles/content.css
65 | 样式到它的内容区域。
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/core/images/css-sprites.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/css-sprites.png
--------------------------------------------------------------------------------
/core/images/dom-inspector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/dom-inspector.png
--------------------------------------------------------------------------------
/core/images/external-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/external-menu.png
--------------------------------------------------------------------------------
/core/images/flat-window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/flat-window.png
--------------------------------------------------------------------------------
/core/images/formation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/formation.png
--------------------------------------------------------------------------------
/core/images/frame-extended.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/frame-extended.png
--------------------------------------------------------------------------------
/core/images/icon_smile.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/icon_smile.gif
--------------------------------------------------------------------------------
/core/images/images.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/images.jpg
--------------------------------------------------------------------------------
/core/images/plus-part-0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/plus-part-0.png
--------------------------------------------------------------------------------
/core/images/schema.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/schema.png
--------------------------------------------------------------------------------
/core/images/sciter-directx-schema.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/sciter-directx-schema.jpg
--------------------------------------------------------------------------------
/core/images/sciter-video.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/sciter-video.jpg
--------------------------------------------------------------------------------
/core/images/sciter.w81.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/sciter.w81.gif
--------------------------------------------------------------------------------
/core/images/standard-window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/standard-window.png
--------------------------------------------------------------------------------
/core/images/transparent-window.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/transparent-window.png
--------------------------------------------------------------------------------
/core/images/window-frame-extended-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/window-frame-extended-2.png
--------------------------------------------------------------------------------
/core/images/window-layered.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/window-layered.png
--------------------------------------------------------------------------------
/core/images/wth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/wth.png
--------------------------------------------------------------------------------
/core/images/yield-sign-640x425.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/core/images/yield-sign-640x425.jpg
--------------------------------------------------------------------------------
/core/js-dart-tis_files/shBrushJScript.js:
--------------------------------------------------------------------------------
1 | /**
2 | * SyntaxHighlighter
3 | * http://alexgorbatchev.com/SyntaxHighlighter
4 | *
5 | * SyntaxHighlighter is donationware. If you are using it, please donate.
6 | * http://alexgorbatchev.com/SyntaxHighlighter/donate.html
7 | *
8 | * @version
9 | * 3.0.83 (July 02 2010)
10 | *
11 | * @copyright
12 | * Copyright (C) 2004-2010 Alex Gorbatchev.
13 | *
14 | * @license
15 | * Dual licensed under the MIT and GPL licenses.
16 | */
17 | ;(function()
18 | {
19 | // CommonJS
20 | typeof(require) != 'undefined' ? SyntaxHighlighter = require('shCore').SyntaxHighlighter : null;
21 |
22 | function Brush()
23 | {
24 | var keywords = 'break case catch continue ' +
25 | 'default delete do else false ' +
26 | 'for function if in instanceof ' +
27 | 'new null return super switch ' +
28 | 'this throw true try typeof var while with finally class namespace'
29 | ;
30 |
31 | var r = SyntaxHighlighter.regexLib;
32 |
33 | this.regexList = [
34 | { regex: r.multiLineDoubleQuotedString, css: 'string' }, // double quoted strings
35 | { regex: r.multiLineSingleQuotedString, css: 'string' }, // single quoted strings
36 | { regex: r.singleLineCComments, css: 'comments' }, // one line comments
37 | { regex: r.multiLineCComments, css: 'comments' }, // multiline comments
38 | { regex: /\s*#.*/gm, css: 'preprocessor' }, // preprocessor tags like #region and #endregion
39 | { regex: new RegExp(this.getKeywords(keywords), 'gm'), css: 'keyword' } // keywords
40 | ];
41 |
42 | this.forHtmlScript(r.scriptScriptTags);
43 | };
44 |
45 | Brush.prototype = new SyntaxHighlighter.Highlighter();
46 | Brush.aliases = ['js', 'jscript', 'javascript'];
47 |
48 | SyntaxHighlighter.brushes.JScript = Brush;
49 |
50 | // CommonJS
51 | typeof(exports) != 'undefined' ? exports.Brush = Brush : null;
52 | })();
53 |
--------------------------------------------------------------------------------
/core/new-TIScript-features.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Sciter 2.0.2.0 发布了TIScript的一些新特性
6 |
7 |
8 |
9 |
10 |
11 |
Sciter 2.0.2.0 发布了TIScript的一些新特性
12 |
13 |
14 |
15 |
16 |
17 |
18 |
2.0.2.0添加的特性之一是支持在类中声明成员变量。
19 |
20 |
通过使用this var name = value
构造器,你可以定义成员(实例)变量:
21 |
22 |
这段代码:
23 |
24 |
class Foo {
25 | this var one = 1, // 成员变量
26 | two = 2; // 成员变量
27 |
28 | function sum() { return this.one + this.two; }
29 | }
30 |
31 | var foo = new Foo();
32 | stdout << foo.sum() << "\n";
33 |
34 |
35 |
即使该类没有定义构造器,上面这段代码也会输出‘3’。
36 | 每个Foo类的实例都会拥有this.one
和this.two
变量,并且拥有它们的初始值。
37 |
38 |
如果有其他类继承了这个Foo类,它也将拥有父类声明的成员变量。
39 |
40 |
这段代码:
41 |
42 |
class Bar: Foo {
43 | this var three = 3; // 成员变量
44 |
45 | function sum() { return this.three + super.sum(); }
46 | }
47 |
48 | var bar = new Bar();
49 | stdout << bar.sum() << "\n";
50 |
51 |
52 |
将会输出‘6’。bar 实例将会拥有this.one、this.two、this.three成员变量。
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/core/pager-template-format.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | 打印页面(Pager)模板格式
4 |
5 |
6 |
7 | 打印页面(Pager)模板是一个普通的HTML文档,它必须包含一个元素 - <pageframe>。其他元素都是可选的。
8 | 下面是和behavior:pager相关的所有元素列表:
9 |
10 | <pageframe>
- 被打印文档的容器。<pageframe>
的内容盒用于呈现文档的被打印部分。
11 | id="document-url"
的元素 - 可选, 将会包含被打印文档的URL;
12 | id="document-title"
的元素- 可选, 将会包含被打印文档的<title>元素中的文本;
13 | id="page-no"
的元素 - 可选, 将会包含当前页号;
14 | id="total-pages"
的元素- 可选, 将会包含文档的总页数。
15 | 模板文档中<html>元素的属性:
16 |
17 | page-no=N
- 在pageframe中渲染的页面的页号;
18 | page-parity="odd" | "even"
- 页面的奇偶标志.
19 | 上面的这些属性可以应用在模板文档中设置CSS样式,如下面的CSS规则:
20 | html[page-parity=odd] footer { text-align:left; }
21 | html[page-parity=even] footer { text-align:right; }
22 |
23 | 将会使模板中<footer>
元素在奇偶页面有不同的对齐方式。
24 |
25 |
--------------------------------------------------------------------------------
/core/path-images-doc.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 在Sciter中内嵌矩阵图像(路径)
8 | 这个path是一个url,它使用自定义的path:{commands}
协议,它可以在<path d="{commands}" />
中直接使用SVG的path命令 )。
9 | 因此任何已存在的SVG WYSIWYG编辑工具和SVG图片都可以直接使用 - 仅需从SVG中复制d
属性的内容到CSS或HTML中(比如<img>
或<picture>
的src属性)即可。
10 | Sciter支持支持全部的"d 命令": MmLlHhVvCcSsQqTtAaZz.
11 | 示例, 请看下面的样式:
12 | div {
13 | background-image: url( path:M0,0 L50,100 L100,0z );
14 | background-size: 100% 100%;
15 | background-repeat: no-repeat;
16 | fill: red;
17 | stroke: blue;
18 | }
19 |
20 | 将会在元素的背景的(0,0), (50,100) and (100,0)位置上显示一个三角形。
21 | 可被用于绘图的CSS属性
22 | 为了可以绘制路径,Sciter未它添加了以下属性支持:
23 |
24 | stroke : <color>
25 | stroke-width : <length>
26 | stroke-linecap : butt | round | square
27 | stroke-linejoin : miter | round | bevel
28 | storke-dasharray : <length>*
29 | storke-dashoffset : <length>
30 | fill : <color>
31 | 这些属性与SVG中的含义相同。
32 | 可扩展的iv-图像
33 | 我们有时需要一些可扩展的矢量图像,它们可以根据给定的尺寸自动调整大小。
34 | 为了支持这样的图像,d-命令做了以下扩展:
35 | 右/下 锚点坐标
36 | 大写的d-命令( MLHVCSQTA )可以接受绝对坐标值,现在它可以使用负坐标值了(包括负零)。
37 | 这时,负坐标意味着它们是图像矩形相对于右下角的偏移值。因此:
38 | background-image: url( path:M0,0 L-0,-0 );
39 | stroke: blue; stroke-width: 3px;
40 |
41 | 将会在元素背景区域绘制一条从左上角到右下角的宽度为3px的斜线。
42 | 比例坐标
43 | 你也可以根据图像的渲染位置的比例定义坐标。比例坐标值是一个后面跟着'*'好的0.0 ... 1.0直接的数字。比如:
44 | background-image: url( path:M0,0 L1*,1* );
45 | stroke: red; stroke-width: 3px;
46 |
47 | 也将会在元素背景区域绘制一条从左上角到右下角的宽度为3px的斜线。
48 | 比例坐标也可以是负值 - 将图像的右下角作为锚点进行渲染。
49 |
50 |
--------------------------------------------------------------------------------
/core/sciter_for_AngularJS_practitioners.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | AngularJS使用者的Sciter指南:指令(Directive)
5 |
6 |
7 |
8 | AngularJS使用者的Sciter指南:指令(Directive)
9 | AngularJS
10 | 指令(Directive)
11 | 来自AngularJS文档 :
12 | 在高层次上, 指令是DOM元素上的一个标记(比如一个属性、元素名、注释或CSS类), 它指示AngularJS的HTML编译器($compile)以在该DOM元素上添加特定的行为(比如事件监听器), 或改变DOM元素和它的子元素。
13 | 下面是一个典型的AngularJS指令的实现:
14 | app.directive('myCustomer', function() {
15 | return {
16 | template: 'Name: {{name}} Address: {{address}}', // 内容
17 | scope: { name:"", address:"" }, // 内部数据模型
18 | link: function(scope, elem, attrs) { // 初始化
19 | elem.bind('click', function() { ... });
20 | elem.bind('dblclick', function() { ... });
21 | }
22 | };
23 | });
24 | 它的含义是:每个<my-customer>
元素都将拥有
25 |
26 | Name: ... Address: ...
内容;
27 | click 和 dblclick 事件处理器。
28 |
29 | Sciter
30 | 行为(Behavior)
31 | 在Sciter中,声明从代码到元素的绑定是通过CSS中的prototype
属性来完成的:
32 | my-customer {
33 | prototype: MyCustomer url(my-customer.tis);
34 | display: block;
35 | ...
36 | }
37 | 有了上面的声明后,在HTML文本中的所有<my-customer>
元素都将渲染成块元素,并且将MyCustomer 类绑定到元素上。这个类将从my-customer.tis 文件中加载(如果它尚未加载的话):
38 | class MyCustomer : Element
39 | {
40 | function attached() // 当元素绑定到这个类时被调用 - 相当于Angular中的"link"
41 | {
42 | // 内容初始化:
43 | this.$content(Name: <output.name/> Address: <output.address/>);
44 | }
45 | // 事件处理器:
46 | event click { ... /* 这里的'this'指绑定的dom元素 */ }
47 | event dblclick { ... }
48 | }
49 | 因为行为是通过CSS赋值的,所以你可以使用任意的CSS选择器来将类绑定到DOM元素上。
50 | 切面(Aspect)
51 | 另一种绑定代码到元素上的方式是使用所谓的切面(aspect). 切面(Aspect)在这里是一个脚本函数,它在CSS选择器第一次匹配到元素时被执行:
52 | [collapsible] { aspect: Collapsible url(my-aspects.tis); }
53 | [collapsible]:collapsed > :last-child { display:none; } // 当折叠后,最后一个子元素将不可见
54 | 其中,Collapsible 是一个普通的函数,它处理元素的点击事件以及触发:collapsed
状态标志的切换:
55 | function Collapsible() {
56 | this << event click {
57 | if( this.state.collapsed ) this.state.expanded = true;
58 | else this.state.collapsed = true;
59 | }
60 | }
61 | 有了上面的声明后,我们可以定义可折叠的元素:
62 | <div collapsible>
63 | click here to see content
64 | <p>Content</p>
65 | </div>
66 | 这样你就可以在你的代码中可以有多个可折叠节,而你仅需要在它之上添加“collapsible”属性即可。
67 |
68 |
--------------------------------------------------------------------------------
/core/sciter_script_hidden_treasures.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Sciter脚本隐藏特性
5 |
6 |
7 | Sciter脚本隐藏特性
8 | 在脚本中,有一个otherwise
关键字,它用在循环语句中,比如:
9 | var emptyArr = [];
10 | for(var el in emptyArr)
11 | stdout.println(el);
12 | otherwise
13 | stdout.println("nothing seen, array is empty!");
14 | 上面的代码执行后将输出:nothing seen, array is empty!
。
15 | 当循环体未执行时,循环语句(块)之后的otherwise
语句将被执行。
16 |
17 |
--------------------------------------------------------------------------------
/core/standalone_Sciter_executable.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | scapp.exe – 一个Sciter单文件可执行程序
7 |
8 |
9 |
10 |
11 |
scapp.exe – 一个Sciter单文件可执行程序
12 |
13 |
14 |
SDK中添加了一个scapp.exe。
15 |
这个ScApp是一个静态链接了Sciter,不依赖额外模块的可执行程序。
16 |
scapp.exe可以不指定参数运行,也可以指定一个扩展名为.htm
、.tis
、.scapp
的文件名参数:
17 |
> scapp.exe
18 |
或
19 |
> scapp.exe tetris.scapp
20 |
如果启动时未指定参数,则它会尝试在当前目录下寻找main.htm
、main.tis
或main.scapp
文件。
21 |
如果指定了.htm[l]文件,则将创建Sciter窗口,并加载这个htm[l]文件。
22 |
.scapp文件是一个在根目录下包含/main.tis的zip文件。这个main.tis文件中需要有创建窗口和调用Sciter.run();
的代码 – GUI消息泵循环:
23 |
// create first window, it may call Sciter.requestQuit(0) to exit from the loop below
24 | var window = View.window { ... };
25 | // run message pump loop of the application
26 | return Sciter.run();
27 |
28 |
本质上,它和tiscript.exe使用同样的方式运行脚本。
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/core/task-await-feature.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | TIScript中的task/await特性
5 |
6 |
7 | TIScript中的task/await特性
8 |
9 |
现在我正在给TIScript添加await特性。
10 |
Await是一种类似JavaScript语言中的“回调/诺言”式代码的解决方案,考虑下面这样的代码:
11 |
12 |
上面的代码如果使用Await的话,可以简化成:
13 |
function setupUsersMottoTask(userName)
14 | {
15 | try {
16 | var user = await request(#get, "http://example.com/user/" + userName);
17 | var userMotto = await request(#get, "http://example.com/user/" + userName + "/avatar");
18 | self.$(#user > .motto).text = userMotto;
19 | } catch (e) {
20 | self.$(#user > .motto).text = "motto unavailable";
21 | }
22 | }
23 | setupUsersMottoTask("monster" ); // runs asynchronously as it is a Task function.
24 |
如果没有await
,则上面的代码就会变成上面那样的梯形调用方式。
25 |
基本上,await
使异步代码线性化成正常顺序的代码执行。
26 |
在Sciter的脚本中,任何内部使用了`await`的换上都会自动声明成一个task函数。调用这样的函数将会立即启动一个task并且立即返回。这个函数返回一个诺言(promise),所以它的调用也可以用在其他的await中。
27 |
28 |
29 |
--------------------------------------------------------------------------------
/core/upcomming-changes-in-4.1.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 即将来临的Sciter 4.1.*.*的变化
7 |
8 |
9 | 即将来临的Sciter 4.1.*.*的变化
10 |
11 |
我正在使用libuv 库来重构现在的异步I/O代码,这将包括修改现有功能以及添加新功能。
12 |
Net (new)名称空间
13 |
它包含:
14 |
15 |
16 | Net.Socket – 异步原始(raw)TCP socket和管道。管道在Windows上指命名管道 ,在其他平台叫local sockets。Socket用于发送字符串和二进制数据。
17 |
18 | Net.DataSocket – 异步原始TCP socket和管道,用于发送结构化数据 – JSON++数据子集。
19 |
20 | Net.WebSocket – 异步WebSockets
21 |
22 |
System (extended)名称空间
23 |
新增的函数:
24 |
25 |
26 | System.watch(path: string): FileMonitor – 文件和目录的变化监视器。
27 |
28 | System.dir(path: string, callback: Function) – 它本质上是scandir() 的封装。
29 |
30 | System.unlink(path: string): Thenable – 异步unlink() , 即移除文件。
31 |
32 | System.rmdir(path: string): Thenable – 异步rmdir() , 即移除目录。
33 |
34 | System.mkdir(path: string [, mode]): Thenable – 异步mkdir() , 即创建目录。
35 |
36 | System.rename(oldpath: string, newpath: string): Thenable – 异步rename() , 即重命名或移动文件(目录)。
37 |
38 | System.copyFile(oldpath: string, newpath: string [, #overwrite]) : Thenable – 异步文件复制。
39 |
40 | System.stat(path: string): Thenable – 异步stat() 调用。
41 |
42 | System.utime(path: string, atime: Date, mtime: Date): Thenable – 异步utime() 调用。
43 |
44 | System.chmod(path: string, mode: integer): Thenable – 异步chmod() 调用。
45 |
变更的函数:
46 |
47 |
48 | System.Process.exec(path [, arguments: Array]): System.Process – 异步执行进程, 可以接收来自它的stdout /stderr 的输出,并且发送文本到它的stdin 。
49 |
移除的函数:
50 |
51 |
52 | Stream.openSocket() 被移除,由Net.Socket替代。
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/core/visibility-none-article.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 在基于HTML/CSS的UI中,我们经常需要在运行期隐藏/显示一些元素。
8 | 最普遍的可能(也是最差的)的解决方法是以编程方式设置CSS属性display:none
。
9 | 这个方法乍一看好像非常简单,但实际上它只解决了一半的问题——隐藏元素——从视图树上移除这个元素。但是,当你需要显示之前隐藏的元素时,你又该怎么做呢? 设置它为display:block
不是一个正确的方法。在HTML中不是所有的元素都是display:block模型。 <img>、<input>//<select>、<textarea>等是display:inline-block
模型。 <table>和它的所有子元素都是特殊的display:table**** 模型。设置它们为display:block
将会导致出现非常奇怪的结果。
10 | 因此,为了在运行期使用display:none
,你需要知道这个元素的display原始值,这不是很方便且不易维护。设想当你的web设计器打算通过声明display: table-cell
来摆放一些元素时,如果你是通过 display: none <-> block开关来控制元素的隐藏/显示时,这时你会遇到问题。
11 | 例如,为了克服这样的问题,jQuery通过将display值存储在一个名为"olddisplay"的属性方式实现了它的hide()
方法(参见: http://robflaherty.github.io/jquery-annotated-source/docs/13-effects.html#section-6 ),当你需要重新显示这个元素时,jQuery从这个属性恢复display值。因某些很明显的原因,这个方法也不是很理想。
12 | 更好的办法
13 | 更好的办法是使用"hidden"属性。所以当你需要隐藏元素时,不是设置CSS属性element.style.display,而是为元素添加DOM属性"hidden",当需要显示元素时,移除"hidden"属性。为了使这个属性有效,你只需在你的样式表中添加一个简单的规则:
14 | [hidden] { display:none !important; }
15 |
16 | 如果某些元素需要默认隐藏,你需要在你的标记代码中添加hidden属性,如:
17 | <button id="ok-button" hidden>OK</button>
18 |
19 | 在Sciter中,你可以为所有的DOM元素定义一些虚拟的属性, 如"shown":
20 | /* 要保证下面的代码有效,CSS中必须有[hidden] { display:none } 规则 */
21 | property Element.shown(v)
22 | {
23 | get return this.style#display != "none";
24 | set this.attributes["hidden"] = v ? undefined : true;
25 | }
26 |
27 | 并且这样使用它:
28 | var someEl = ... someEl.shown = true; // 显示 someEl.shown = false; // 隐藏
29 |
30 | 这个解决办法有个不明显的缺点:
31 |
32 | 你需要在你的CSS中添加特殊的[hidden] { display:none; }
规则;
33 | 在所有场景,当你需要显示/隐藏元素时,你需要使用特殊的"shown"属性或显示地移除元素的"hidden"属性。
34 | visibility:none
35 | 从Sciter 3.1.0.15版本开始,你可以在你的CSS中使用visibility:none;
来排除某个元素的渲染。它与display:none;
有相同的效果。
36 | visibility属性可以使你不用使用dsiplay属性,安全地设置"none"和"visible"值来达到显示/隐藏元素的效果。
37 | 因此, Sciter中,visibility 属性可以接受以下值:
38 |
39 | none - 元素从显示树中移除,等同于display:none,Sciter特有值;
40 | hidden - 元素在显示树中,占据空间,但是不显示;
41 | collapse - 元素在显示树中,占据空间,但是它的高度和宽度会堆叠成0。如在flow:horizontal容器中,visibility:collapse的子元素将会占据垂直空间,但显示宽度将设置为0。在Sciter中,这个值对所有元素都有效,但是在标准CSS中,它只对表格(table)的行(tr)元素有效。
42 | visible - 默认值, 元素正常的显示。
43 | 下面是上面定义的脚本属性shown的修改版本:
44 | property Element.shown(v)
45 | {
46 | get return this.isVisible;
47 | set this.style#visibility = v ? "visible" : "none";
48 | }
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/core/window-frame=extended.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Adding window-frame=”extended” / sciter
7 |
8 |
9 |
10 | 我为Sciter添加支持了<html window-frame=”extended”>特性,用于想在窗口标题区域添加工具条:
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/flex-flow/flex-layout.css:
--------------------------------------------------------------------------------
1 | html
2 | {
3 | font: 10pt verdana, arial, sans-serif;
4 | background: gray;
5 | }
6 |
7 | body
8 | {
9 | width:700px;
10 | margin:10px auto;
11 | background: white;
12 | padding:1em;
13 | }
14 |
15 | td
16 | {
17 | font: 10pt verdana, arial, sans-serif;
18 | }
19 |
20 | tt, code, samp, kbd
21 | {
22 | font-family: monospace;
23 | }
24 |
25 | pre
26 | {
27 | font-family : monospace;
28 | display : block;
29 | display : table-cell;
30 | margin : 10px 0;
31 | padding : 4px;
32 | background-color: ghostwhite;
33 | border : 1px dotted #ccc;
34 | }
35 |
36 | pre code { color:blue; }
37 |
38 | p
39 | {
40 | margin : 10px 0;
41 | }
42 |
43 | blockquote
44 | {
45 | margin : 10px 0 10px 10px;
46 | border-left : 2px solid #ccc;
47 | padding-left : 8px;
48 | }
49 |
--------------------------------------------------------------------------------
/flex-flow/images/flex-springs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/flex-springs.png
--------------------------------------------------------------------------------
/flex-flow/images/relative-flexes.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/relative-flexes.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-horizontal-bottom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-horizontal-bottom.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-horizontal-fill.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-horizontal-fill.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-horizontal-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-horizontal-flow.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-inline-block-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-inline-block-1.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-inline-block-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-inline-block-2.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-position-fixed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-position-fixed.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-template.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-vertical-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-vertical-flow.png
--------------------------------------------------------------------------------
/flex-flow/images/sample-vertical.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/flex-flow/images/sample-vertical.png
--------------------------------------------------------------------------------
/main.htm:
--------------------------------------------------------------------------------
1 |
2 |
3 | Sciter 帮助
4 |
8 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 | help-index.htm not found!
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
--------------------------------------------------------------------------------
/other/CSS3圆角样式(border-radius).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/CSS3圆角样式(border-radius).doc
--------------------------------------------------------------------------------
/other/CSSS!脚本入门.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/CSSS!脚本入门.doc
--------------------------------------------------------------------------------
/other/CSS属性background-position ,foreground-position用法.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/CSS属性background-position ,foreground-position用法.doc
--------------------------------------------------------------------------------
/other/CSS背景颜色半透明、渐变效果.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/CSS背景颜色半透明、渐变效果.doc
--------------------------------------------------------------------------------
/other/CSS选择器语法详解.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/CSS选择器语法详解.doc
--------------------------------------------------------------------------------
/other/Data URL用法.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Data URL用法.doc
--------------------------------------------------------------------------------
/other/HTMLayout 使用 popup 弹出节点.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTMLayout 使用 popup 弹出节点.doc
--------------------------------------------------------------------------------
/other/HTMLayout九宫格助手.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTMLayout九宫格助手.exe
--------------------------------------------------------------------------------
/other/HTMLayout事件捕获与冒泡过程.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTMLayout事件捕获与冒泡过程.doc
--------------------------------------------------------------------------------
/other/HTMLayout界面贴图技术.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTMLayout界面贴图技术.doc
--------------------------------------------------------------------------------
/other/HTMLayout非标准HTML标记include、widget、popup.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTMLayout非标准HTML标记include、widget、popup.doc
--------------------------------------------------------------------------------
/other/HTML常用标签说明.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/HTML常用标签说明.doc
--------------------------------------------------------------------------------
/other/MSAA/MS Active Accessibility 接口技术编程尝试.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/MSAA/MS Active Accessibility 接口技术编程尝试.doc
--------------------------------------------------------------------------------
/other/MSAA/MSAA简介.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/MSAA/MSAA简介.doc
--------------------------------------------------------------------------------
/other/MSAA/Microsoft Active Accessibility体系结构.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/MSAA/Microsoft Active Accessibility体系结构.doc
--------------------------------------------------------------------------------
/other/MX3的皮肤引擎(HTMLayout)特性.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/MX3的皮肤引擎(HTMLayout)特性.doc
--------------------------------------------------------------------------------
/other/Sciter中的INPUT、WIDGET以及其他自定义元素.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Sciter中的INPUT、WIDGET以及其他自定义元素.doc
--------------------------------------------------------------------------------
/other/Sciter是什么.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Sciter是什么.doc
--------------------------------------------------------------------------------
/other/Sciter的10年之路.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Sciter的10年之路.doc
--------------------------------------------------------------------------------
/other/Sciter简介.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Sciter简介.doc
--------------------------------------------------------------------------------
/other/Sciter绑定事件.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Sciter绑定事件.doc
--------------------------------------------------------------------------------
/other/Stock URL用法.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/Stock URL用法.doc
--------------------------------------------------------------------------------
/other/UI编程的思考.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/UI编程的思考.doc
--------------------------------------------------------------------------------
/other/什么是原型(Prototype).doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/什么是原型(Prototype).doc
--------------------------------------------------------------------------------
/other/从实现的角度看闭包.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/从实现的角度看闭包.doc
--------------------------------------------------------------------------------
/other/如何在工作线程中执行GUI线程的代码.doc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/other/如何在工作线程中执行GUI线程的代码.doc
--------------------------------------------------------------------------------
/sciter3.ppt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/sciter3.ppt
--------------------------------------------------------------------------------
/sciter4d/behaviors/RouteManager.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/sciter4d/behaviors/RouteManager.txt
--------------------------------------------------------------------------------
/sciter4d/behaviors/draggable.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/sciter4d/behaviors/draggable.txt
--------------------------------------------------------------------------------
/sciter4d/behaviors/menutab.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/sciter4d/behaviors/menutab.txt
--------------------------------------------------------------------------------
/sciter4d/behaviors/windowCommand.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/sciter4d/behaviors/windowCommand.txt
--------------------------------------------------------------------------------
/scripts/indexer.tis:
--------------------------------------------------------------------------------
1 |
2 | function SetupIndexer()
3 | {
4 | var storage = null;
5 |
6 | function buildIndex() {
7 |
8 | var indexRoot = $(#index);
9 |
10 | var docList = indexRoot.$$(a[href][target=content]).map(:el: el.attributes["href"]);
11 |
12 | for( var doc in docList )
13 | stdout.println(doc);
14 |
15 | }
16 |
17 | function getStorage()
18 | {
19 | if( storage )
20 | return storage;
21 | var dbpath = self.url("index.db");
22 | var storage = Storage.open(dbpath);
23 | if( !storage.root ) {
24 | storage.root = {
25 | keywords: storage.createIndex(#string,false);
26 | }; // brand new, initialize schema.
27 | buildIndex();
28 | }
29 | return storage;
30 | }
31 |
32 | //buildIndex();
33 |
34 | }
35 |
36 | SetupIndexer();
--------------------------------------------------------------------------------
/scripts/toc.tis:
--------------------------------------------------------------------------------
1 | var last_tree;
2 |
3 | function makeToc( content, list )
4 | {
5 | //stdout.$n(toc!);
6 | function makeTree()
7 | {
8 | var tree = [];
9 | var sect = null;
10 | function sc(el)
11 | {
12 | //stdout.$n(tag {el.tag});
13 | if(el.tag == "h2") { if(sect) tree.push(sect); sect = {caption: el.text, target: el, items:[] }; }
14 | else if(sect) { sect.items.push({ caption: el.text, target: el }); }
15 | }
16 | //stdout.$n(content.select);
17 | content.select(sc, "h2, td:first-child em, dt");
18 | if(sect) tree.push(sect);
19 | return tree;
20 | }
21 |
22 | function onItemClick()
23 | {
24 | this.target.attributes#highlighted = true;
25 | this.target.scrollToView(true);
26 | }
27 |
28 | function showTree(tree)
29 | {
30 | last_tree = tree;
31 |
32 | list.clear();
33 | for(var sect in tree)
34 | {
35 | if( !sect.items ) continue;
36 | var s = new Element("ul"); list.insert(s);
37 | var cap = new Element("caption", sect.caption); s.insert(cap); cap.target = sect.target; cap.onClick = onItemClick;
38 | sect.items.sort( :i1,i2: i1.caption < i2.caption? -1:1 );
39 | for(var item in sect.items)
40 | {
41 | var li = new Element("li", item.caption );
42 | s.insert(li);
43 | li.target = item.target;
44 | li.onClick = onItemClick;
45 | }
46 | }
47 | }
48 | showTree(makeTree());
49 |
50 | /* function saveTree()
51 | {
52 | var sect_id;
53 | for(var sect in last_tree)
54 | {
55 | if( !sect.items ) continue;
56 | //var s = new Element("ul"); list.insert(s);
57 | //var cap = new Element("caption", sect.caption); s.insert(cap); cap.target = sect.target; cap.onClick = onItemClick;
58 | //sect.items.sort( :i1,i2: i1.caption < i2.caption? -1:1 );
59 |
60 | sect_id = sect.caption;
61 |
62 | for(var item in sect.items)
63 | {
64 | var id = sect_id + "-" + item.caption;
65 | var cn;
66 | if(var content = item.target.next)
67 | cn = content.html;
68 | stdout.println(id,cn);
69 | }
70 | }
71 | }
72 | saveTree(last_tree);*/
73 | }
74 |
75 | function goTocSection(section)
76 | {
77 | for(var sect in last_tree)
78 | {
79 | if( !sect.items ) continue;
80 |
81 | for(var obj_subsect in sect.items)
82 | {
83 | if(obj_subsect.caption==section)
84 | {
85 | obj_subsect.target.attributes#highlighted = true;
86 | obj_subsect.target.scrollToView(true);
87 | return;
88 | }
89 | }
90 | }
91 | }
--------------------------------------------------------------------------------
/snapshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gxlmyacc/sciter-doc-zh/4e4fa2fd9012918d49cf94bc8d2e535d94f648e1/snapshot.png
--------------------------------------------------------------------------------
/styles/autozoom.tis:
--------------------------------------------------------------------------------
1 | function AutoScrollX() {
2 |
3 | function showOver() {
4 | var (left,top,right,bottom) = this.scroll(#rect);
5 | this.attributes.toggleClass("over-left", left > 0);
6 | this.attributes.toggleClass("over-right", right > 0);
7 | }
8 |
9 | this.on("mousemove", function(evt) {
10 | var (left,top,right,bottom) = this.scroll(#rect);
11 | var width = this.scroll(#width);
12 | var over = left + right;
13 | if(over > 0 ) { // overflows
14 | var w3 = width / 3;
15 | var scrollx;
16 | if( evt.x < w3 ) scrollx = 0;
17 | else if( evt.x > 2* w3 ) scrollx = over;
18 | else scrollx = (evt.x - w3).toFloat() / width * over * 3;
19 | this.scrollTo(scrollx.toInteger(),0,true);
20 | }
21 | showOver.call(this);
22 | });
23 |
24 | this.on("mouseleave", :: this.scrollTo(0,0,true) );
25 |
26 | this.on("animationend", showOver);
27 | this.onSize = showOver;
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/styles/content.css:
--------------------------------------------------------------------------------
1 | html {
2 | behavior:sticky-scroll; /* keep position of viewed element */
3 | overflow:scroll-indicator;
4 | //text-selection-caret-color: transparent;
5 | background:#fff;
6 | color:#000;
7 | }
8 |
9 | body
10 | {
11 | font:10pt verdana;
12 | font-rendering-mode:classic;
13 | behavior: htmlarea; /* to make it selectable */
14 | cursor:text;
15 | }
16 |
17 | pre
18 | {
19 | aspect: AutoScrollX url(autozoom.tis);
20 | background-color:#F5FFFA;
21 | border:1px dashed gray;
22 | padding:4px;
23 | margin:4px;
24 | overflow-x:hidden-scroll;
25 | }
26 |
27 |
28 | pre.over-left {
29 | background:#F5FFFA linear-gradient(to right, rgba(128,128,128,0.8) 0%, rgba(255,255,255,0.0) 5%, rgba(255,255,255,0.0) 100% );
30 | }
31 |
32 | pre.over-right {
33 | background:#F5FFFA linear-gradient(to left, rgba(128,128,128,0.8) 0%, rgba(255,255,255,0.0) 5%, rgba(255,255,255,0.0) 100% );
34 | }
35 |
36 | pre.over-right.over-left {
37 | background:#F5FFFA linear-gradient(to right, rgba(128,128,128,0.8) 0%, rgba(255,255,255,0.0) 5%, rgba(255,255,255,0.0) 95%, rgba(128,128,128,0.8) 100% );
38 | }
39 |
40 |
41 | body > table { border-spacing:0; }
42 | body > table tr > td {
43 | padding:4px;
44 | border-top:1px solid #dedede;
45 | vertical-align:top; }
46 |
47 | body > table tr > td:first-child:not([colspan]) { text-align: right; white-space:nowrap; border-right:1px solid #dedede; }
48 |
49 | body > dl:not(.flat) { flow:row(dt, dd); width:100%; }
50 | body > dl:not(.flat) > dt { text-align: right; font-weight:bold; margin:0; margin-top:2em; padding-right: 0.3em;
51 | width:max-content; max-width:50%;white-space:nowrap; overflow-x:hidden; text-overflow:ellipsis; }
52 | body > dl:not(.flat) > dd { border-left:1px solid #dedede; margin:0; margin-top:2em; padding-left: 0.3em; width:*; }
53 |
54 |
55 | [highlighted]
56 | {
57 | prototype: HighlightIt url(autozoom.tis);
58 | background-color: orange;
59 | transition: background-color linear 0s;
60 |
61 | //background-color: red;
62 | //color: white;
63 | //assigned!: self.start-timer(1000); /* red blink */
64 | //timer!: self.highlighted = null, return cancel;
65 | }
66 |
67 | @import url(lib_search.css);
68 |
--------------------------------------------------------------------------------
/styles/lib_search.css:
--------------------------------------------------------------------------------
1 | ::mark(hilite) { background-color: #FFFF00; }
2 | ::mark(hiactual) { background-color: #FF9632; }
3 |
4 | #search-box
5 | {
6 | position: fixed;
7 | right: 40px;
8 | height: 24px;
9 | background-color: white;
10 | border-radius: 3px;
11 | padding: 9px;
12 | border: solid 1px gray;
13 | flow: horizontal;
14 | vertical-align: middle;
15 |
16 | bottom: 1px;
17 | transition: bottom(linear, 200ms);
18 | }
19 | #search-box > .search-input { height: 18px; margin-right: 3px; }
20 | #search-box > .search-input[reddish] { background: #ff6666; color: white; }
21 | #search-box:disabled { bottom: -50px; }
22 |
23 | #search-box > .btn-seek-prev { font-family:webdings; font-size: 14px; border: 1px solid white; }
24 | #search-box > .btn-seek-next { font-family:webdings; font-size: 14px; border: 1px solid white;}
25 | #search-box > .btn-close { font-family:webdings; font-size: 14px; border: 1px solid white; border-radius: 3px;}
26 | #search-box > .btn-seek-prev:hover { border-color: #3298FE; background-color: #E8F3FE; }
27 | #search-box > .btn-seek-next:hover { border-color: #3298FE; background-color: #E8F3FE; }
28 | #search-box > .btn-close:hover { background-color: #D24545; color: white; }
29 | #search-box > .btn-close:active { background-color: #A72C2C; color: white; }
--------------------------------------------------------------------------------
/the.scapp:
--------------------------------------------------------------------------------
1 | // Sciter Application Manifest
2 | {
3 | name :"scidoc",
4 | definition :"Sciter Help System",
5 | version :1,
6 | revision :0,
7 | icon :"icon.png",
8 | author :"Andrew Fedoniouk"
9 | }
--------------------------------------------------------------------------------
/webdoc.css:
--------------------------------------------------------------------------------
1 |
2 | /*dl { position: relative; }
3 |
4 | dl > dt {
5 | text-align:right;
6 | font-weight:bold;
7 | position:absolute;
8 | left:0;
9 | width:11.5em;
10 | overflow-x:hidden;
11 | }
12 | dl > dd {
13 | margin-left: 12em;
14 | margin-bottom: 0.5em;
15 | }*/
16 |
17 | dl { font-size:10pt;
18 | font-family:Verdana,Helvetica,sans-serif; }
19 |
20 | dl:before,
21 | dl:after {
22 | display: table;
23 | content: "";
24 | line-height: 0;
25 | }
26 | dl > dt {
27 | float: left;
28 | width: 11.5em;
29 | clear: left;
30 | text-align: right;
31 | overflow: hidden;
32 | text-overflow: ellipsis;
33 | white-space: nowrap;
34 | font-weight:bold;
35 | }
36 | dl > dd {
37 | margin-left: 12em;
38 | margin-bottom: 1em;
39 | }
40 |
--------------------------------------------------------------------------------