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

添加3,481字节 、​ 2020年12月30日 (三) 05:02
使用页面/文本对比查看器快速编辑
→‎全站CSS
标签移动版网页编辑 移动版编辑
(使用页面/文本对比查看器快速编辑)
| wgAction || index.php的action参数<ref>[[mw:Manual:Parameters_to_index.php/zh|完整参数列表]]</ref> || 相比于桌面版,手机版由于添加了[[Special:历史]]而少了“history”这个可能值
|-
| wgArticleId || 内容页面编号,不存在时值为0,可以用于判断是否是内容页面且页面是否已建立 || 需要注意查看[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]时值为0
|-
| wgCanonicalSpecialPageName || 标准化的特殊页面名,也可被wgPageName取代,主要用于不同MediaWiki站点间的代码通用,非必需 || 可用,而且多了“History”和"MobileDiff"等可能的取值<ref>[[mw:Extension:MobileFrontend/zh|移动前端的扩展说明]]</ref>
| wgCategories || 当前阅读的历史版本所属的分类,不含名字空间,下划线显示为空格,且总是包含隐藏分类。繁简规则一般遵从实际分类页面,但似乎偶有例外 || 除非已执行[[mediawiki:gadget-MobileCategories.js|MobileCategories小工具]],否则不可用。另外桌面版的空值为<code>[]</code>,手机版的空值为<code lang="js">null</code>,注意可能的bug
|-
| wgCurRevisionId || 页面最新的版本编号,不存在时值为0 || 在[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面不可用
|-
| wgIsArticle || 是否是内容页面(包含由某个页面的Wikitext源代码解析生成的HTML,可能是历史页面和差异下方的历史页面) || 由于[[special:移动版差异|差异{{int:diff}}]]页面不可同时显示历史页面,此时不可用
|-
| wgIsRedirect || 最新版本是否是重定向页面 || 在[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面不可用
|-
| wgIsProbablyEditable || 是否可能可以编辑 || 在[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面不可用
|-
| wgNamespaceNumber || 名字空间编号 || 在[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面会显示为-1
|-
| wgPageContentModel || 页面内容模型,特殊页面为“wikitext” || 由于[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]是特殊页面,会错误地显示为“wikitext”
|-
| wgPageName || 页面名称,空格显示为下划线 || 在[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面不可用
|-
| wgRedirectFrom || 跳转自重定向时为对应的重定向页,空格显示为下划线 || 可用
|-
| '''wgRelevantPageName''' || 关联的页面名称,空格显示为下划线 || 可以用于[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面,此时效果与桌面版一致
|-
| '''wgRelevantArticleId''' || 关联的内容页面编号,不存在时值为0 || 可以用于[[special:历史|历史]]和[[special:移动版差异|差异{{int:diff}}]]页面,此时效果与桌面版一致
|-
| wgRelevantUserName || 关联的用户名 || [[special:用户贡献|贡献{{int:contributions}}]]页面不可用
|-
| '''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 || 当前用户的编辑次数 || 可用
|}
;mw.hook()
:这个方法是LLWiki建立异步JS框架的重要一环。常用以下两个方法:
:*<code>mw.hook(hook).fire(data)</code>: 用于唤起一个Hook事件,其中data为传递给事件处理程序的可选参数。
:*<code>mw.hook(hook).add(handler)</code>: 用于处理一个Hook事件,handler为该事件处理函数,参数传递自<code>mw.hook().fire()</code>方法。
:这个方法应与jQuery的event delegation和各Promise对象结合使用,以在恰当的时机执行恰当的函数。以下列举LLWiki常用的Hook事件。
{| class="wikitable"
! Hook名称 !! 说明
|-
! colspan=2 | MediaWiki预定义的Hook
|-
| postEdit || 一次非空编辑提交成功,一般发生在自动重载页面后,可以搭配<code lang="js">mw.config.get( 'wgPostEdit' )</code>。需要注意各类编辑小工具提交编辑后的页面重载均未适配这个事件
|-
| structuredChangeFilters.ui.initialized || [[special:recentchanges|{{int:recentchanges}}]]、[[special:recentchangeslinked|{{int:recentchangeslinked}}]]和[[special:watchlist|{{int:watchlist}}]]页面的过滤器加载完成,一般至多发生一次
|-
| wikipage.categories || 页面下方的<code lang="css">div#catlinks</code>加载完成。特殊页面或没有添加任何分类时也能触发,因为此时<code lang="css">#catlinks</code>仍然存在只是隐藏起来
|-
| wikipage.collapsibleContent || 某个或某组<code>mw-collapsible</code>类的元素添加折叠JS完成
|-
| wikipage.content || 最常用的Hook,表示页面内容(一般即<code lang="css">div#mw-content-text</code>)加载完成,几乎无处不在,与<code>$.ready</code>最大的区别在于这个事件可能多次触发
|-
| wikipage.diff || 差异(一般即<code lang="css">table.diff</code>)加载完成
|-
| wikipage.editform || 编辑区加载完成,需要注意此时[[mw:extension:wikiEditor/zh|WikiEditor]]的工具栏可能尚未加载完成
|-
| codeEditor.configure || 切换至[[mw:extension:codeEditor/zh|CodeEditor]]
|-
! colspan=2 | LLWiki定义的Hook
|-
| code.prettify || 代码高亮完成
|-
| codemirror.config || CodeMirror扩展的设置下载完成
|-
| hotcat.ready || HotCat小工具加载完成
|-
| local.comments || 签名时间替换为本地时区
|-
| mobile.menu || 手机版的左侧主菜单加载完成
|-
| transclusion.preview || 用于预览潜入页面的编辑区加载完成
|-
| wikiplus.dialog || 打开Wikiplus小工具的对话框
|}
;mw.loader
;mw.notify()
====jquery====
jquery是任何页面都会预加载的两个环境模块之一,尤其在DOM操作和Ajax请求方面功能强大,非常推荐在JS编程之前预先熟悉[https://api.jquery.com/ API文档]。考虑到mw.loader已经集成了不少的常用Ajax方法,这里主要推荐熟练掌握DOM相关的内容,包括[https://api.jquery.com/category/events/ 事件]、[https://api.jquery.com/category/manipulation/ DOM操作]、[https://api.jquery.com/category/selectors/ 选择器]和[https://api.jquery.com/category/traversing/ 遍历]。特别需要提醒的是滥用htmlString有造成XSS的风险,因此请尽量使用如<code lang="js"><nowiki>$('<p>', {html: $('<a>', {text: '文字', href: 'https://llwiki.org'})})</nowiki></code>或<code lang="js"><nowiki>$('<p>').append( $('<a>').text('文字').attr('href', 'https://llwiki.org') )</nowiki></code>等语法进行规避。
 
因未被mw.loader包含而可能用到的Ajax方法主要为<code>$.getJSON()</code>,需要注意在MW的默认设置下调用jQuery的Ajax方法必须手动设置<code lang="js">{cache: true}</code>。
 
另外jQuery也提供了一些[https://api.jquery.com/category/utilities/ 工具方法],可以用于缓解ResourceLoader的JS模块不允许使用ES6语法的问题,或是方便键值对相关的语句的书写,或是方便连锁。比如用<code>$.extend()</code>方法代替<code>...</code>算符、用<code>$.each(obj, (key, val) => {})</code>方法代替<code lang="js">for (const key in obj) {}</code>等。
 
应用jQuery时可能出现的一些常见错误列举如下:
*混淆<code>.attr()</code>方法和<code>.prop()</code>方法。
*混淆jQuery对象的<code>.data()</code>方法和HTML元素的<code>.dataset</code>属性。
*使用<code>.toggle()</code>、<code>.fadeToggle()</code>等方法时不慎破坏较复杂的CSS布局。
*错误使用<code>.remove()</code>、<code>.clone()</code>等方法造成丢失数据和事件处理程序。
*混淆<code>event.target</code>、<code>event.currentTarget</code>、<code>event.delegateTarget</code>和<code lang="js">this</code>关键字。
*混淆<code>$.when()</code>方法和<code lang="js">Promise.all()</code>方法的参数格式和回调函数。
====mediawiki.api====
====mediawiki.util====
16,874

个编辑