“LLWiki:管理员技术手册”的版本间差异

添加13,966字节 、​ 2023年3月17日 (五) 13:29
// 使用Wikiplus小工具快速编辑
(使用页面/文本对比查看器快速编辑)
(// 使用Wikiplus小工具快速编辑)
标签移动版网页编辑 移动版编辑
 
(未显示2个用户的21个中间版本)
这里所涉及的JS页面包含[[mediawiki:common.js|common.js]]、[[mediawiki:mobile.js|mobile.js]]和各[[:category:JavaScript小工具|JS小工具]],有时由于功能的相似性也会涉及用户JS([[special:mypage/common.js|common.js]]、[[special:mypage/vector.js|vector.js]]和[[special:mypage/minerva.js|minerva.js]])。LLWiki暂时没有建立针对不同用户组的专门JS页面。
===ResourceLoader和JS模块===
[[mediawiki:common.js|common.js]]、[[mediawiki:mobile.js|mobile.js]]、[[special:mypage/common.js|用户JS]]和[[MediaWiki:Gadgets-definition]]页面定义的小工具等JS页面会作为ResourceLoader的模块加载,这些JS将在语法检查和压缩后由load.php打包下载,且可以作为mw.loader.getState()方法、mw.loader.using()方法的参数。
作为ResourceLoader的模块加载时,不可使用ES6语法。这里的语法指关键字、算符等,不包括对象原型方法,例如Object.fromEntries()方法仍可照常使用。下表列出一些常见的JS模块不可使用的语法及其替代。
 
作为ResourceLoader的模块加载时,不可使用ES6语法。这里的语法指关键字、算符等,不包括对象原型方法,例如<code lang="js">Object.fromEntries()</code>方法或<code lang="js">new Map()</code>构造器仍可照常使用。下表列出一些常见的JS模块不可使用的语法及其替代。
{| class="wikitable"
! ES6以上语法 !! 替代
|-
| <code>=> output</code> || <code lang="js">function() { return output; }</code>
|-
| <pre class="hljs javascript">class NewClass extends Parent {
| <code lang="js">let</code> || <code lang="js">var</code>
constructor(params) { super(params); }
}</pre> || <pre class="hljs javascript">function NewClass(params) { NewClass.super.call(this, params); }
OO.inheritClass(NewClass, Parent);</pre>
|-
| <code lang="js">function(param = default){key}</code> || <code lang="js"><nowiki>function() {key: param = param || default; key}</nowiki></code>
|-
| <pre class="hljs javascript">`firstline
| <code lang="js">{a} = {a: 0, b: 1};</code><ref name="jshint">该语法不被CodeEditor的[[#JSHint|JSHint]]支持,不利于代码除错,因此即使不作为ResourceLoader的模块也不推荐使用。</ref> || <code lang="js">obj = {a: 0, b: 1}; a = obj.a;</code>
secondline`</pre> || <pre class="hljs javascript">'firstline\n' + 'secondline'</pre>
|-
| <code>[...iterator, element]lang="js">`string${variable}`</code> || <code lang="js">iterator.concat('string' element+ )variable</code>
|-
| <code>[variable] lang="js">{...object, key: value}array;</code><ref name="jshint" /> || <code lang="js">$.extend(object, {key:variable = value})array[0];</code>
|-
| <code lang="js">{key: variable} = {key: value};</code> || <code lang="js">variable = {key: value}['key'];</code>
|-
| <code lang="js">function(params = defaults)</code> || <code lang="js"><nowiki>function() { params = params || defaults; }</nowiki></code>
|-
| <code>[...iterator]</code> || <code lang="js">Array.from( iterator )</code>
|-
| <code>array2 = [...array1];</code> || <code>array2 = array1.slice();</code>
|-
| <code>[...array1, ...array2]</code> || <code>array1.concat( array2 )</code>
|-
| <code>[element, ...rest] = array;</code> || <code lang="js">element = array[0], rest = array.slice(1);</code>
|-
| <code lang="js">let</code><ref><code lang="js">const</code>可用。</ref> || <code lang="js">var</code>
|-
| <code>2**3</code><ref name="jshint">ES7以上语法虽然在不作为ResourceLoader的模块时允许使用,但因为CodeEditor安装的[[#JSHint|JSHint]]版本不支持语法分析,可能会造成代码除错时的困难。</ref> || <code lang="js">Math.pow(2, 3)</code>
|-
| <code lang="js">async function()</code><ref name="jshint" /> || <code lang="js">function() { return new Promise(resolve, reject); }</code>
|-
| <code lang="js">try { variable = await func(); } catch {}</code><ref name="jshint" /> || <code lang="js">func().then(function(result) { variable = result; }, function() {});</code>
|-
| <code>obj1 = {...obj2};</code><ref name="jshint" /> || <code lang="js">obj1 = $.extend(true, {}, obj2);</code>
|-
| <code>{...object1, ...object2}</code><ref name="jshint" /> || <code lang="js">$.extend(object1, object2)</code>或<code lang="js">Object.assign(object1, object2)</code><ref>注意$.extend()方法与另两者并不完全一致,但更推荐使用$.extend()。</ref>
|}
 
| skin || 皮肤 || 桌面版为“vector”,手机版为“minerva”,这也是区分桌面版和手机版的主要依据
|-
| wgFormattedNamespaces || 储存了所有空间本地化译名的数组,不过目前除了“模块”都是英文 || 可用
|-
| wgNamespaceIds || 储存了所有可接受的中英文空间名称对应的编号,注意英文名称中的空格都显示为下划线 || 可用
|-
| wgScript || <code>/mediawiki/index.php</code>,在LLWiki也可简化为<code>/zh</code>,主要用于不同MediaWiki站点间的代码通用,非必需且不推荐使用 || 可用
| wgCanonicalSpecialPageName || 标准化的特殊页面名,也可被wgPageName取代,主要用于不同MediaWiki站点间的代码通用,非必需 || 可用,而且多了“History”和"MobileDiff"等可能的取值<ref>[[mw:Extension:MobileFrontend/zh|移动前端的扩展说明]]</ref>
|-
| wgCategories || 当前阅读的历史版本所属的分类,不含空间,下划线显示为空格,且总是包含隐藏分类。繁简规则一般遵从实际分类页面,但似乎偶有例外 || 除非已执行[[mediawiki:gadget-MobileCategories.js|MobileCategories小工具]],否则不仅LLWiki可用。另外桌面版的空值为<code>[]</code>,手机版的空值为<code lang="js">null</code>,注意可能的bug
|-
| wgCurRevisionId || 页面最新的版本编号,不存在时值为0 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
| wgIsProbablyEditable || 是否可能可以编辑 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgNamespaceNumber || 空间编号 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面会显示为-1
|-
| wgPageContentModel || 页面内容模型,特殊页面为“wikitext” || 由于[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]是特殊页面,会错误地显示为“wikitext”
| '''wgRelevantPageIsProbablyEditable''' || 关联的页面是否可能可以编辑 || 可以用于[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面,此时效果与桌面版一致
|-
| wgRestrictionEdit || 编辑保护,不存在的页面(含受保护的标题)或特殊页面为<code lang="js">null</code>,存在的内容页面受全保护时为<code lang="js">["sysop"]</code>,受半保护时为<code lang="js">["autoconfirmed"]</code>,未保护为<code>[]</code>;不包含空间保护和级联保护 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用,另外未保护的内容页面为<code lang="js">["*"]</code>
|-
| wgRestrictionMove || 移动保护,不存在的页面或特殊页面为<code lang="js">null</code>,存在的内容页面受全保护时为<code lang="js">["sysop"]</code>,受半保护时为<code lang="js">["autoconfirmed"]</code>,未保护为<code>[]</code>;不包含空间保护和级联保护 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgRevisionId || 当前显示的页面版本的编号,不存在时值为0。注意和index.php的oldid参数可能不同 || 由于[[special:移动版差异|{{int:diff}}]]页面不可同时显示历史页面,此时不可用
|-
| wgTitle || 不含空间的页面名称,下划线显示为空格 || 在[[special:历史|历史]]和[[special:移动版差异|{{int:diff}}]]页面不可用
|-
| wgUserEditCount || 当前用户的编辑次数 || 可用
|-
| local.comments || 签名时间替换为本地时区
|-
| mobile.menu || 手机版的左侧主菜单加载完成
|-
| to.bottom || 添加滚动至底部的按钮
|-
| transclusion.preview || 用于预览入页面的编辑区加载完成
|-
| wikiplus.dialog || 打开Wikiplus小工具的对话框
;mw.now()
:这个方法理论上和Date.now()差不多,但实际测试表明和Date.now()的取值不同,因此请勿混合使用。非必需,基本可以完全被Date.now()替换。
;mw.messages
:用于改善代码结构,在代码开头使用mw.messages.set()方法结合[[#LLWiki添加的全局变量和方法|wgULS()和wgUCS()]]设置自定义消息的繁简名称,然后使用mw.msg()方法即可调用。使用这一方法时,还能以<code>$1</code>的形式设置待定参数,或使用部分解析器函数。
 
====jquery====
 
====mediawiki.util====
mediawiki.util提供了很多非常方便的方法,可以用于满足形形色色的需要。这个模块会在加载很多其他模块时加载,如mediawiki.api、mediawiki.Title和mediawiki.Uri等
*mw.util.addCSS(),相比mw.loader.addStyleTag()方法,因为返回值是一个StyleSheet对象而更便于后续动态操作。
*mw.util.addPortletLink(),实际上并不如直接使用jQuery自由度更大,但这个方法可能会出现在一些从其他维基导入的小工具里,不推荐使用。
 
====mediawiki.Title====
彻底解决关于页面名称或文件名称的各种烦恼,包括大小写、空格/下划线、空间别名等等。通常用法为先使用<code lang="js">const title = new mw.Title(str);</code>的语法构建一个mw.Title对象。与mw.util的很多方法以及<code lang="js">new mw.Uri()</code>不同,<code lang="js">new mw.Title(str)</code>不会以当前页面作为默认参数。因为未统一大小写、空格/下划线等,请勿直接访问title.title属性,而是根据需要使用下列方法。
 
*title.getExtension(),获取文件名的扩展名。
*title.getName(),获取文件名,不含扩展名,首字母大写,空格替换为下划线。
*title.getNameText(),获取文件名,不含扩展名,首字母大写,下划线替换为空格。
*title.getNamespaceId(),获取空间,能识别一切别名。也可以直接使用title.namespace属性访问。
*title.getNamespacePrefix(),获取标准空间前缀,含<code>:</code>。
*title.toString(),获取完整页面名称,空间使用标准前缀,不含<code>#</code>,空格替换为下划线。
*title.toText(),相比title.toString()方法,下划线替换为空格。
*<code>title.getRelativeText(nsid)</code>,相比title.toText()方法,会空间编号匹配时移除空间前缀。
*title.getSubjectPage(),生成讨论页对应的主页面的mw.Title对象。
*title.getTalkPage(),生成对应的讨论页的mw.Title对象。
*title.getUrl(),生成地址,可以添加JS对象格式的php参数。注意在LLWiki,mw.util.getUrl()方法和mw.Uri对象均可以获得脚本路径为<code lang="js">'/zh'</code>的短地址,而title.getUrl()方法只能获得脚本路径为<code lang="js">'/mediawiki/index.php'</code>的长地址,因此并不推荐使用这一方法
*title.isTalkPage(),是否是讨论页。
 
此外,mediawiki.Title还有一些静态方法用于生成mw.Title对象。
*<code>mw.Title.makeTitle(nsid, title)</code>,给定空间编号和标题生成对象。不存在的空间会报错。仅当空间为0时,会根据标题生成正确的空间。
*<code>mw.Title.newFromFileName(filename)</code>,给定文件名生成对象。
*<code>mw.Title.newFromImg(node)</code>,给定<code lang="html"><img></code>节点或对应的jQuery对象生成mw.Title对象。
*<code>mw.Title.newFromText(title, nsid)</code>,相比mw.Title.makeTitle()方法,错误的空间编号也不会报错,且当标题含空间前缀时总是覆盖第二个空间参数。
 
====mediawiki.storage====
 
====jquery.client====
用於查詢用戶設備和瀏覽器的相關信息,相比直接使用navigator,這個模塊使用起來更加簡便和友好。这个模块会在加载mediawiki.util时加载
*<code lang="js">const profile = $.client.profile();</code>,以對象的形式輸出設備和瀏覽器信息。
*profile.platform,可識別的設備類型:ipad、iphone:iphone、linux、mac、win。
*profile.name,可識別的瀏覽器類型:android、chrome(包括手機chrome、edge、opera等)、chrios(iOS上的chrome,實際使用safari)iphone、edge(舊版edge)、firefox(包括手機firefox)、fxios(iOS上的firefox,實際使用safari)、opera(舊版opera)、safari(包括手機safari)safari等。
*prefileprofile.layout,可識別的引擎類型:edge、gecko、khtmlkonquerorprestoopera、trident、webkit。
 
====jquery.color====
 
====oojs-ui-core====
对于各种用于用户交互的HTML元素,如&lt;button&gt;、&lt;select&gt;、&lt;input&gt;等,不同浏览器往往会默认添加不同的样式。为了统一这些表单元素的外观,MediaWiki的界面UI大多基于OOUI设计,oojs-ui-core则包含了OOUI的最基本元素。这些元素往往借助&lt;div&gt;等基本HTML元素和CSS/JavaScript模拟出表单元素的效果。下表列出oojs-ui-core中供直接使用的对象实例:
 
{| class="wikitable"
! 对象实例 !! 说明
|-
| ActionFieldLayout || 包含一个输入元素、一个按钮和一个可选的帮助信息
|-
| ButtonGroupWidget || 可包含一组ButtonWidget
|-
| ButtonInputWidget || 用于FormLayout的按钮
|-
| ButtonWidget || 最基础的按钮
|-
| CheckboxInputWidget || 复选框,最好置于设置为<code lang="js">{align: 'inline'}</code>的各种layout内
|-
| CheckboxMultiSelectInputWidget || 用于FormLayout的真正意义上的“复选框”
|-
| CheckboxMultiSelectWidget || 真正意义上的“复选框”
|-
| ComboBoxInputWidget || 既可键盘输入,又可选择选项
|-
| DecoratedOptionWidget || 用于SelectWidget的带图标的选项
|-
| DropdownInputWidget || 用于FormLayout的下拉选单
|-
| DropdownWidget || 下拉选单
|-
| FieldLayout || 包含一个输入元素和标签或帮助信息
|-
| FieldSetLayout || FieldLayout的组合
|-
| FormLayout || 用于构建表单
|-
| HorizontalLayout || 行内样式的layout
|-
| HtmlSnippet || 用于插入htmlString
|-
| IconWidget || 图标
|-
| IndicatorWidget || 另一种小图标
|-
| LabelWidget || 标签
|-
| MultilineTextInputWidget || 相当于textarea
|-
| NumberInputWidget || 带增减按钮的输入仅限数字的文本框,由min/max/step/required设置代替validate设置
|-
| PanelLayout || 占据整个父容器的layout
|-
| PopupButtonWidget || PopupWidget的开关
|-
| PopupWidget || 相当于tooltip
|-
| ProgressBarWidget || 进度条
|-
| RadioInputWidget || 一个单独的单选框,一般下不应使用
|-
| RadioSelectInputWidget || 用于FormLayout的单选框
|-
| RadioSelectWidget || 单选框
|-
| SearchInputWidget || 搜索框
|-
| SelectFileInputWidget || 上传本地文件,不可拖拽
|-
| TextInputWidget || 文本框
|}
 
====oojs-ui-windows====
oojs-ui-windows在oojs-ui-core的基础上补充了各类对话框及相关元素。下表列出了oojs-ui-windows添加供直接使用的对象实例:
{| class="wikitable"
! 对象实例 !! 说明
|-
| ActionWidget || 用于对话框的按钮
|-
| Dialog || 最基础的对话框,所有对话框均必须使用WindowManager打开,且大部分无法直接使用
|-
| MessageDialog || 消息对话框,唯一一种可直接使用的自定义对话框
|-
| ProcessDialog || 进程对话框,无法直接使用
|-
| WindowManager || 用来打开各种对话框
|-
| OO.ui.alert() || 相当于window.alert(),但手机版的CSS设计有缺陷,请使用mw.notify()方法替代
|-
| OO.ui.confirm() || 相当于window.confirm(),但返回的是Promise对象
|-
| OO.ui.prompt() || 相当于window.prompt(),但返回的是Promise对象
|}
 
====oojs-ui-widgets====
oojs-ui-widgets在oojs-ui-core的基础上补充了一些更复杂的元素。下表列出了oojs-ui-widgets添加供直接使用的对象实例:
{| class="wikitable"
! 对象实例 !! 说明
|-
| BookletLayout || 左侧分页布局
|-
| ButtonMenuSelectWidget || 点击按钮展开下拉选单
|-
| ButtonSelectWidget || 使用按钮的单选框
|-
| IndexLayout || 分页
|-
| MenuLayout || 同时包含了菜单和内容
|-
| MenuTagMultiselectWidget || 使用菜单进行多选
|-
| PopupTagMultiselectWidget || 使用气泡输入的多选
|-
| SelectFileWidget || 选择文件
|-
| StackLayout || 堆叠布局
|-
| TagMultiselectWidget || 使用文本输入生成标签多选,是MenuTagMultiselectWidget和PopupTagMultiselectWidget的基础类型
|-
| ToggleButtonWidget || 使用按钮开关
|-
| ToggleSwitchWidget || 开关
|}
 
====mediawiki.widgets====
 
===LLWiki添加的全局變量和方法===
;<code lang="js">window.wgULS(hans, [hant])</code>和<code lang="js">window.wgUCS(hans, [hant])</code><ref name="site-lib">需要加載[[mediawiki:gadget-site-lib.js|site-lib.js]]</ref>
:用于处理繁简文字信息,wgULS()用于界面语言,wgUCS()用于内容语言。为方便维护,在大量使用繁简转换的页面,请将所有繁简文字以mw.messages.set()方法的形式至于代码开头,然后在使用时以mw.msg()方法调用即可。
 
;mw.gadgets
:这个对象储存了所有小工具的设置。
 
;mw.request
:这个对象储存了一个mw.standardQuery()方法返回的Promise对象,即获取当前版本全文Wikitext的API请求。
 
;mw.sections
:这个数组的每一项对应一个mw.sectionQuery()方法返回的Promise对象,即获取对应段落Wikitext的API请求。
 
;mw.widget
:这个对象储存了小部件的执行情况,防止Ajax预览造成小部件重复执行。
 
;mw.settingsDialog<ref>需要加载[[mediawiki:gadget-SettingsDialog.js|SettingsDialog.js]]</ref>
;mw.windowManager
:这个对象是一个SettingsDialog类,用于小工具设置的图形界面。这个类提供了多种方法,包括:获取小工具名称(getName)、获取小工具对象(getObject)、获取小工具标签页(getPanel)、添加小工具(addTab)、生成设置对象(generateOptions)、将设置保存到localStorage(saveOptions)、还原设置(clearOptions)和导出设置(export)。用法复杂,详见[[mediawiki:gadget-SettingsDialog.js|代码页]]。
 
;<code>mw.pagenamee([title])</code><ref name="site-lib" />
:这个方法用于获取转义后的当前页面名称。需要mediawiki.util。
 
;<code>mw.addMobileLinks(link)</code><ref name="site-lib" />
:这个方法生成手机版菜单需要的列表构成的数组,可以随后加入DOM中。link为对象或对象数组,每一项包含链接地址href(可选)、FontAwesome图标icon(默认为[https://fontawesome.com/icons/arrow-circle-right 圆圈包裹的一个向右箭头])、文字信息text(需要手动设置繁简转换,优先级低于msg)或mw.messages的键值msg和<code>&lt;li&gt;</code>元素属性attr(可选)。
 
;<code>mw.isModule(name, [flag])</code><ref name="site-lib" />
:这个方法用于检测一个模块是否正在或已经加载。name为模块名或小工具名;flag为真时自动在小工具名name前添加前缀<code lang="js">'ext.gadget.'</code>。
 
;<code>mw.apiFailure(reason, topic)</code><ref name="site-lib" />
:这个方法用于输出一个API请求失败的气泡通知。reason为API返回的错误信息,一般来自状态为reject的API请求;topic为简短的文字说明,需要手动设置繁简转换。
 
;<code>mw.timedQuery(api, params, topic)</code><ref name="site-lib" />
:这个方法用于提交一个可自定义的API请求,并记录用时,失败时应用mw.apiFailure()方法生成气泡通知并抛出错误。api为一个mw.Api对象;params即API参数,默认已填入<code lang="js">{action: 'query', formatversion: 2}</code>,可以覆盖;topic为简短文字描述,需要手动设置繁简转换。需要mediawiki.api。
 
;<code>mw.timedParse(api, params, topic)</code><ref name="site-lib" />
:Ajax使用POST而非GET,因此适合预览大段Wikitext。params的默认设置为<code lang="js">{action: 'parse', prop: 'text', title: mw.config.get( 'wgPageName' ), disablelimitreport: 1, disableeditsection: 1, pst: 1, formatversion: 2}</code>,可以覆盖。填入page、pageid或oldid参数时请勿使用此方法,应当选用包含<code lang="js">{action: 'parse'}</code>参数的mw.timedQuery()。topic同样需要手动设置繁简转换。需要mediawiki.api。
 
;<code>mw.standardQuery(api)</code><ref name="site-lib" />
:使用mw.timedQuery()方法提交一个API请求以获取当前版本的全文Wikitext并保存至mw.request。需要mediawiki.api。
 
;<code>mw.sectionQuery(api, section, [force])</code><ref name="site-lib" />
:使用mw.timedQuery()方法提交一个API请求以获取段落Wikitext并保存至mw.sections。section为段落编号,默认为序言;为降低错误编辑历史版本的风险,想要获取历史版本的段落Wikitext时,必须手动添加为真的force参数。需要mediawiki.api。
 
;<code>mw.safeEdit(api, curRevid, params, [flag])</code><ref name="site-lib" />
:检查有无编辑冲突后提交编辑。api为mw.Api对象;curRevid为当前最新版本的编号,默认为<code lang="js">mw.config.get( 'wgCurRevisionId' )</code>;parmas为API参数,默认为<code lang="js">{action: 'edit'}</code>,可以覆盖,但原则上请勿使用这一方法执行其他操作;flag参数对应是否开启自动备份小工具,这会改变检测到编辑冲突时的错误通知。检测到编辑冲突抛出错误<code lang="js">'editConflict'</code>,API请求失败抛出错误<code lang="js">'editFailure'</code>或<code lang="js">'revisionQueryFailure'</code>。需要mediawiki.api。
 
;<code>mw.safeRedirect(api, title, target, [summary])</code><ref name="site-lib" />
:检查繁简转换后的页面是否已经存在后创建新重定向。api为mw.Api对象;title为重定向页标题;target为重定向目标页标题,默认为当前页面;summary为可选摘要。页面已存在时抛出<code lang="js">'pageExists'</code>,API请求失败时抛出<code lang="js">'createFailure'</code>或<code lang="js">'queryFailure'</code>。需要mediawiki.api。
 
;<code>mw.confirm(text, [flags])</code><ref name="site-lib" />
:借助OO.ui.confirm()方法生成一个确认对话框。text为确认提示,可以是字符串或jQuery;flags为确认键的样式数组,可选元素包括<code lang="js">'primary'</code>、<code lang="js">'progressive'</code>和<code lang="js">'destructive'</code>,其中<code lang="js">'primary'</code>不能单独生效。返回值为一个状态为resolve的Promise对象,值为真表示确认。需要oojs-ui-windows。
 
;<code>mw.prompt(text, [flags], [config])</code><ref name="site-lib" />
:借助OO.ui.prompt()方法生成一个prompt对话框。text为文字提示,可以是字符串或jQuery;flags为确认键的样式数组,可选元素包括<code lang="js">'primary'</code>、<code lang="js">'progressive'</code>和<code lang="js">'destructive'</code>,其中<code lang="js">'primary'</code>不能单独生效;config为可选的文本框设置。返回值为一个状态为resolve的Promise对象,值为<code lang="js">null</code>表示取消。需要oojs-ui-windows。
 
;<code>mw.dialog(dialog, actions, $message, [$title])</code><ref name="site-lib" />
:借助OO.ui.MessageDialog对象生成一个更复杂的对话框。dialog为预先准备的OO.ui.MessageDialog对象;actions为OO.ui.ActionWidget对象构成的数组;$message为提示信息,相比mw.confirm()方法的进步之处在于可以使用jQuery或htmlString;$title为对话框标题。返回值为点击按钮时的Promise对象。需要oojs-ui-windows。
 
;<code>mw.confirmtipsy(text$container, flags[target], [params], [$content])</code><ref name="site-lib" />
:借助OO.ui.PopupWidget对象生成一个手机版也有效的tooltip。$container为外部容器的jQuery对象(不能是body);target为目标元素的选择器;params为建立OO.ui.PopupWidget对象时的参数,默认为<code lang="js">{padded: true, width: null, classes: ['mw-tipsy']}</code>,可以覆盖;$content为自定义的tooltip内容,默认为title或data-title属性。需要oojs-ui-core。
 
;<code>mw.dialogmenu(dialogoptions, actions, message[config], [titleunselectable])</code><ref name="site-lib" />
:借助于OO.ui.MenuSelectWidget生成一个浮动菜单。options为选项数组,每一项包含文本text(需要手动设置繁简转换)、FontAwesome图标icon(可选)、数据data(可选)、链接href(可选)和点击事件click(可选);config为菜单设置,默认为<code lang="js">{classes: ['site-menu'], hideWhenOutOfView: false}</code>,可以覆盖;unselectable为真时,菜单不会保留之前最后一次的选择记录。这个UI方法的用法较为复杂,详见[[mediawiki:gadget-site-lib.js#L311|代码页]]。
 
;<code>mw.tipsyconvertTimezone($containerthen, target, [params]timezone)</code><ref name="site-lib" />
:改变moment对象的时区。then为待处理的moment对象,默认为现在;timezone为时区的IANA名称或数值表示的UTC偏移量,需要提前检查合法性,默认为本地时区。注意这个方法的返回值不是一个真实存在的时间点,只能用于输出而不能用于进一步运算。需要moment。
 
;mw.resizeLyrics()<ref>需要加載[[user:bhsd/widget/lyrics.js|Widget:Lyrics]]</ref>
:重新计算<code lang="css">.Lyrics_box</code>的大小,并调整原文和译文的排列方式。
 
===JSHint===
CodeEditor使用JSHint标注可能存在的语法问题。LLWiki通常會在大部分JS页面添加JSHint设置<code lang="js>"use>/* strict";global mw */</code>的基础上添加<code lang="js">/*global mwjshint jquery: true, $bitwise: true, OOcurly: true, wgULSlatedef: 'nofunc', nonew: true, singleGroups: true, unused: true */</code>或类似语句注明全局变量。<ref>[https://jshint.com/docs/options/ 新版JSHint的设置列表],注意JSHint并不会对大多数JS模块不允许使用可能存在ES6语法(除對象的解構和async版本差异。</await等语法外)作出警告(详见[[#ResourceLoader和ref>。但在小部件页面,为了提示小部件JS加载在模块]]),因此请勿过度依赖这一功能来除错。mediawiki和jquery之前,<code lang="js
>/* global mw */</code>和<code lang="js">/* jshint jquery: true */</code>被替换为<code lang="js">/* jshint varstmt: true */</code>。注意JSHint并不会对大多数JS模块不允许使用的ES6语法作出警告(详见[[#ResourceLoader和JS模块]]),因此请勿过度依赖这一功能来除错。另外CodeEditor安装的JSHint版本较老,无法识别ES7以上的语法,因此在代码中使用ES7语法可能会造成除错时的困难。
 
===注意事项===
}
</pre>
这里重点说明一下第二和第四条规则造成的影响。第二条规则使得表格的外层边框、行边框和单元格边框合并,可能造成一系列关于边框的CSS规则出现不符合预期的表现,尤其是<code>&lt;table&gt;</code>的<code>cellspacing</code>属性会无法生效。因此一般建议避免使用<code>cellspacing</code>这一HTML属性,改为使用CSS中的<code>border-spacing</code>。另外,在需要<code>border-spacing</code>或<code>border-radius</code>等样式时,请同时指定<code langclass="csshljs">border-collapse: separate;</code>以使手机版生效。
 
第四条规则的本意是在窄屏上<code>&lt;table&gt;</code>元素不会将页面撑得过宽,但这同时会造成外层的<code>&lt;table&gt;</code>和内层的<code>&lt;tbody&gt;</code>分离。特别是如果外层<code>&lt;table&gt;</code>规定了边框或背景色时,很容易看出样式的错误。为此一般需要主动指定<code langclass="csshljs">display: table;</code>以修复这一问题,LLWiki有很多预定义的表格CSS类也都添加了这一规则<ref name="site-styles">[[mediawiki:gadget-site-styles.css|全站CSS]]</ref>。但这样修改的话又会重新面临过宽的表格将整个页面撑大的问题。LLWiki现定义了<code>table-wrapper</code>类<ref name="site-styles" />,用于套在宽表格外:<code lang="html"><nowiki><div class="table-wrapper"></nowiki></code>,这个外层容器会在窄屏上通过<code langclass="csshljs">overflow-x: auto;</code>限制里面的表格宽度。
====图片====
====皮肤界面====
16,874

个编辑