Skip to content

🔌 客户端 API 列表

WARNING

假设你已了解 📖 实现方案 章节内容,如果你刚刚接手开发,那这不是你最佳的观光点。

API 命名空间

所有 API 约定均使用 DSBridge-Android/DSBridge-IOS 作为调用函数和响应的功能。

在当前实现,没有定义 API 资源的情况下,不使用命名空间功能,将 API 添加到 DWebView 实例时,命名空间参数为 null

Android
java
dwebView.addJavascriptObject(new H5Api(), null);
iOS
object-c
[dwebview addJavascriptObject:[[H5Api alloc] init] namespace:nil];

为提高代码语义化,H5Api 类中实现的函数名 以具名行为的方式命名。

如业务 content 业务名称约定为 getContent; 响应/处理方法以 on 为前缀,如分享按钮 onShare

钩子/生命周期

onWebViewCreated

onWebViewCreated 生命周期,网页代码开始运行,响应网页,以便网页运行后续续业务。

示例

java
@JavascriptInterface
public void onWebViewCreated(Object msg, CompletionHandler<Boolean> handler) {
    handler.complete(true);
}

onWebViewSuccess

暂定在 onWebViewCreated 后调用,该周期暂无对应的逻辑。由网页告知客户端。

java
@JavascriptInterface
public void onWebViewSuccess(Object msg, CompletionHandler<Boolean> handler) {
    handler.complete(true);
}

onWebViewError

网页代码运行错误,调起客户端错误页面

java
@JavascriptInterface
public void onWebViewError(Object msg, CompletionHandler<Boolean> handler) {
    handler.complete(true);
}

notifyWebViewUpdated

notifyWebViewUpdated 生命周期,有配置或数据更新时,通知网页。调用 callHandler 函数,传入 updateObj JSONObject 参数。

如改变字体大小,实际上是修改 config 中的 fontSize,那么客户端调用该函数,并传入 { "name": "config" }

网页接收到回调后主动调取 onConfig ,获取最新的配置,并更新 UI。

参数

updateObj
json
{
  "name": "user",
  "author_id" : 1,// author_id 是 internal_user_id v8.1.7 订阅功能
}
name类型备注
configString全局应用配置
contentString文章内容更新,常用于用户登录后更新文章内容
userString用户信息
videoPauseString视频暂停播放,包含视频 ID
audioPlayString音频开始播放,额外参数是 index: 0,代表页面中的第几个音频
audioPauseString音频暂停播放,额外参数是 index: 0,代表页面中的第几个音频
commentString评论数据有更新,可调用 getComments API 获取当前页评论
rewardString打赏数据有更新
nextContentString下一讲、下一篇内容有更新
scrollToCommentString页面滚动到评论区
pkString观点PK 模块有更新
voteString投票模块有更新
subAuthorString订阅作者成功
unSubAuthorString取消订阅作者成功
followTopicString关注话题成功
unFollowTopicString取消关注话题成功
likeString点赞评论成功,额外参数是 comment_id: 1234
unlikeString取消点赞评论成功,额外参数是 comment_id: 1234
cleanAllAudioStatusString修改文中所有音频状态为暂停
showForumRelationString普通文章显示话题讨论
diary-likeString日记点赞,成功事件,额外参数是 comment_id: 1234
courseFavoriteString单课收藏,成功事件
unCourseFavoriteString单课取消收藏,成功事件
markSuccessString成功添加划线,额外参数是id type sources
markDeleteString成功删除划线,额外参数是id type sources
noteCancelString取消写笔记(创建新笔记),额外参数是id type text sources
noteSuccessString成功保存、修改笔记,额外参数是id type note text updated_at sources
noteDeleteString成功删除笔记 ,额外参数是id type sources
addNoteFromLineString划线基础上添加了笔记,将划线转为笔记,,额外参数是id type note updated_at sources
markCreateFailString创建划线失败,额外参数是id type sources
noteCreateFailString创建笔记失败 ,额外参数是id type sources
markDeleteFailString删除划线失败 ,额外参数是id type sources
noteDeleteFailString删除笔记失败 ,额外参数是id type sources
notefromLineFailString创建划线笔记失败 ,额外参数是id type sources
switchAudioString音频课程切换了不同的主播/音频时触发的事件

返回值

返回值典型值类型备注
retValuetrue falseBooleanretValue 表示 updated 的响应结果

示例

java
JSONObject updateObj = new JSONObject();
try {
    updateObj.put("name", "config");
} catch (JSONException e) {
    e.printStackTrace();
}

dWebView.callHandler("notifyWebViewUpdated", new Object[]{ updateObj }, new OnReturnValue<Boolean>() {
    @Override
    public void onValue(Boolean retValue) {
        showToast(retValue);
    }
});

事件

notifyEvent

event 事件,在 UI 或者网络耗时操作时候调用,通知网页

参数

eventName
eventName类型备注
imageViewerOpenedString打开图片查看器
imageViewerClosedString关闭图片查看器
shareTimelineSuccessString成功分享朋友圈
shareWechatSuccessString成功分享微信好友
shareWeiboSuccessString成功分享微博
shareQQSuccessString成功分享QQ
commentOpenedString打开评论页
commentClosedString关闭评论页
rewardSuccessString打赏成功
videoPauseString视频暂停播放
videoPlayString视频开始播放
videoFullScreenString视频全屏显示
videoExitFullScreenString视频退出全屏显示
videoClosedString关闭视频浮窗

示例

java
String eventName = "ImageViewerOpen";

dWebView.callHandler("notifyEvent", new Object[]{ eventName }, new OnReturnValue<Boolean>() {
    @Override
    public void onValue(Boolean retValue) {
        showToast(retValue);
    }
});

onWebViewClick

网页点击事件,传达至客户端

参数

clickName
clickName类型备注
topAdString顶通广告
bottomAdString文章尾部广告
commentString查看更多评论
focusCommentInputString点击发表评论按钮,聚焦写评论输入框
rewardString文章打赏按钮
rewardListString打赏列表
loginString点击登录
vipString点击“立即开通”“成为会员”按钮
nextContentString【课程详情】点击课程详情“下一讲”,无下一讲则返回目录
playListString【课程详情】点击视频课程播放列表,弹出播放列表
clickString页面内容点击时调用
letterString点击投稿爆料时调用
vote-changeString点击投票多选/单选时调用
afterRelationAdStringST-3 广告位点击
paymentVipBtnString正文内容,点击开通会员按钮
paymentVipLinkString正文内容,点击 成为南周会员文字(下划线
paymentLoginString正文内容,点击立即登录按钮
paymentBannerString正文内容,点击南周会员权益图片
paymentMediaLoginString【鸿蒙版本】点击视频文章和正文音视频内容,调用立即登录弹窗
paymentMediaVipOnlyString【鸿蒙版本】点击视频文章和正文音视频内容,调用提示“本文仅会员可看”弹窗,去开通会员
paymentMediaVipString【鸿蒙版本】点击视频文章和正文音视频内容,调用提示“免费阅读上限”弹窗,去开通会员
onWebViewClickPayment.jpg

onWebViewClickPaymentMedia.jpg

示例

java
@JavascriptInterface
public void onWebViewClick(Object clickName, CompletionHandler<Boolean> handler) {

    if(clickName === "topAd")
    {
        //do something
    }

    handler.complete(true);
}

通用业务方法

onToast

短提示

onToast.jpg

参数

onToastObject
参数典型值类型备注
text请选择正文区域String短提示文字内容
time2000 Number短提示显示时间,毫秒

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onToast(Object onToastObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onToastObject;

    ToastUtils.makeShortText(
        H5ArticleDetailActivity.this,
        jsonObject.optString("text"),
        jsonObject.optInt("time")
    );

    handler.complete(true);
}

onCopyText

复制文本内容到粘贴板

onCopyText.jpg

参数

onCopyTextString

类型 String

典型值 意味着社会主义在……

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onCopyText(Object onCopyTextString,CompletionHandler<Boolean> handler) {

    ClipData clipData = ClipData.newPlainText("text", (String)onCopyTextString);
    handler.complete(true);
}

话题业务方法

onHotComment/onLatestComment

获取文章、话题的最热和最新评论,异步接口

参数

onCommentsObject
json
{
    "content_id": 1235,
    "link_id" : 2,
    "page"    : 1,
    "limit"   : 10,
}
参数典型值类型备注
content_id2Number文章的 id
link_id2Number文章的 link_id
page1Number分页数
limit10Number每页条数

返回值

返回值典型值类型备注
jsonstairs_commentsJSONArray数据结构

onMoreReplyComments

加载更多的该条回复评论,异步接口

参数

onMoreReplyCommentsObject
json
{
    "comment_id": 1235,
    "page"    : 1,
}
参数典型值类型备注
comment_id2Number获取更多该条评论的 id
page1Number分页数

返回值

返回值典型值类型备注
jsonmore_commentsJSONArray数据结构

onFollowTopic/onUnFollowTopic

点击话题页面中的关注话题按钮,取消关注

参数

onFollowTopicParams
参数典型值类型备注
onFollowTopicParams{ content_id: 12345 }JSON

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
    public void onFollowTopic(Object onFollowTopicParams, CompletionHandler<Boolean> handler) {
    JSONObject followTopic = (JSONObject) onFollowTopicParams;

    int content_id          = followTopic.getInt("content_id");
    handler.complete(true);
}

课程业务方法

onCourseItemMonthBtnClick

点击周期购课程页面中的 “去购买”按钮,弹出当前课程月份选择页面

feature-period-course-buy-old.pngfeature-period-course-buy-old-pop.png

参数

onAudioChapterString

类型 String

典型值 2025-04 为当前单课所属的月份

onAudioChapter

用于获取音频课程中当前展示的音频章节数据

feature-audio-chapter

参数

返回值

返回值典型值类型备注
JSONArrayJSONArrayJSONArray
json
[
  {
    "id": 329,
    "time_spot": 0,
    "desc": "DeepSeek 是谁",
    "media_tencent_id": "2075"
  },
  {
    "id": 330,
    "time_spot": 200,
    "desc": "但模型的技术原理:人工智能网络,几千亿的参数",
    "media_tencent_id": "2075"
  }
]

onCourseClick

点击跳转到课程,参数为课程对象

参数

onCourseClickObject
json
{
  "id": 121,
  "media_id": 252717,
  "headimg_media_id": 213169,
  "title": "南方周末报社写作讲座(第一季)",
  "media": {
    "id": 252717,
    "name": "w6fSTXYZaANRCP6cNJ1hO4UYxZNMyFPIcl7BdTNL.png",
    "path": "http://images.infzm.com/cms/medias/image/23/09/28/w6fSTXYZaANRCP6cNJ1hO4UYxZNMyFPIcl7BdTNL.png"
  },
}

onCourseVideoContentShowBtnClick

弹出文稿内容。客户端判断逻辑:课程已购买 || 已借阅 || 单课免费

如果不是,弹出 toast 提示用户购买

加载文稿地址:https://api.infzm.com/mobile/course_items/${单课id}?format=html&style=night|day

onCourseFavoriteClick/onCourseUnFavoriteClick

web api GET dev.api.infzm.com/mobile/course_item/1/add_collect?token=164b6db11f5f55ebf1fad1c6924094e1&user_id=1

收藏单课、取消收藏单课,参数为单课对象。

网络请求成功后调用

notifyWebViewUpdated({ name: 'courseFavorite' })

notifyWebViewUpdated({ name: 'unCourseFavorite' })

参数

onCourseFavoriteClickObject/onCourseUnFavoriteClickObject
json
{
  "id": 2049,
  "title": "杨嘉敏:如何打造一个好看的地理故事?",
  "media_type": "audio",
  "lecturer": "",
  "is_free": 0,
  "isdigg": false,
  "is_charging": false,
}

onCourseVideoPlayList

视频课程中的播放列表。

返回视频内容的播放列表数组,取 course.course_items 字段视频内容返回数组

返回值

返回值典型值类型备注
ArrayArrayArray
json
[
    {
        "id": 2018,
        "title": "#一起问杜甫#观后感打卡规则",
        "media_type": "magazine",
        "media_cover": {
            "id": 205697,
            "name": "aDMW4WRxOxCBCoW5FtStp5n6F5kxr0Vu3MswMq6m.jpeg",
            "path": "http://images.infzm.com/cms/medias/image/22/08/18/aDMW4WRxOxCBCoW5FtStp5n6F5kxr0Vu3MswMq6m.jpeg",
            "width": 3400,
            "height": 1911
        },
    },
    {
        "id": 2012,
        "title": "01 杜甫应该取名“杜国庆”",
        "media_type": "video",
        "media_cover": {
            "id": 204553,
            "name": "Inw9p5tx5oqMhDigs146tgXHXFSeNpK81NT6A3Q5.jpeg",
            "path": "http://images.infzm.com/cms/medias/image/22/08/11/Inw9p5tx5oqMhDigs146tgXHXFSeNpK81NT6A3Q5.jpeg",
            "width": 3400,
            "height": 1911
        },
    },

]

onCourseVideoPlayListClick

播放列表,点击更多,打开弹窗

onCourseVideoPlayListItemClick

点击播放列表中的视频,进入新课程。参数是单课对象

参数

onCourseVideoPlayListItemClickObject
json
{
  "id": 2012,
  "title": "01 杜甫应该取名“杜国庆”",
  "media_type": "video",
}

onCoursePaymentClick

不可看未购买内容的点击事件

参数

onCoursePaymentClickObject
json
{
  type: "vip | buy | borrow | wecom"
}

type 值定义

典型值类型版本备注
vipString-开通会员
buyString-确认订单
borrowString-立即借阅
wecomString1.6.0打开 webview open-weapp.php 服务,跳转到“南周会员”微信小程序添加客服页面

onPreCourseItem/onNextCourseItem

单课上一讲下一讲点击事件,对应接口 course_item.prev_content/course_item.next_content 对象

参数

onPreCourseItemObject/onNextCourseItemObject
json
{
  "target": {
    "id": 2103,
    "title": "38 杜甫草堂经历过的大风大雷大雨天",
    "course_section_id": 166
  },
  "target_dict": {
    "link_type": 22,
    "version": "1.6.14",
    "course_item_id": "2103",
    "media_type": "video",
    "course_id": 119
  }
}

onCourseItemComment

web api GET /mobile/course_items/course_items_comments?course_item_id=2012&page=1&user_id=&token=&course_item_comment_id=

最新单课评论。返回评论数组,参考 onHotComment API

参数

onCourseItemCommentObject
json

{
    "page": 1,
    "limit": 5,
    "course_item_id": 12
}

返回值

返回评论数组,参考 onHotComment API

onCourseItemMoreReplyComments

web api GET /mobile/comments/expand_comment_list?course_item_comment_id=2266565

加载更多的该条回复评论,参考 onMoreReplyComments API

onCourseItemChallengeClick

onCourseItemChallengeClick.png

点击课程页面中的打卡模块

参数

onCourseItemChallengeClickObject
json
{
  "id": 1,
  "checkin_id": 3,
  "title": "作业标题111",
  "start_time": "2023-10-12",
  "end_time": "2023-10-19",
  "diary_user_count": 1,
  "user_status": 0
}

划线笔记方法

功能操作示例

mark-how-to-used.jpg

划线笔记元数据

web-highlighter 中的 HighlightRange 对象有足够的信息作为元数据,用来保存到本地或者服务器,用于下次加载高亮内容。

HighlightRange 对象的结构如下:

JSON
{
  "startMeta": {
    "parentTagName": "P", "parentIndex": 33, "textOffset": 7
  },
  "endMeta": {
    "parentTagName": "P", "parentIndex": 33, "textOffset": 58
  },
  "text": "没想到采来一个声势浩大的春天一样,以罪犯身份西行的裴景福,他在逆旅孤馆中写就的原本为打发长路时光的日记",
  "id": "a26b8fb9-dd2f-410f-8272-d3263f655131",
  "__isHighlightSource": {},
  "extra": { "type": "mark" }
}

下面是HighlightRange 对象 作为元数据的定义:

字段名称类型含义
extraObject额外数据,用于区分划线还是
startMetaObject内容开始位置。
parentTagName 是文字内容的标签名称。
parentIndex 是文字内容的标签位于正文同名标签的位置,从0开始textOffset 是开始文字偏移数,从0开始
endMetaObject内容结束位置。
parentTagName 是文字内容的标签名称。
parentIndex 是文字内容的标签位于正文同名标签的位置,从0开始 textOffset 是结束文字偏移数,从0开始
textString内容的文本,换行内容使用 \n 间隔
idString选区内容生成的 UUID

划线、笔记API调用时序图

note-uml.jpg

getContentMarks

获取当前用户在文章中全部划线和笔记

参数

content_id
参数典型值类型备注
content_id12345Number

返回值

返回值典型值类型备注
JSONArrayJSONArrayJSONArray
json
[
  {
    "id"        : 998,
    "content_id": "216909",
    "type"      : 1,
    "text"      : "选中的原文内容",
    "note"      : "用户输入的心得内容",
    "updated_at": "2025-08-05 11:45:13",
    "sources"   : {}
  },
    {
    "id"        : 998,
    "content_id": "216909",
    "type"      : 1,
    "text"      : "选中的原文内容",
    "note"      : "用户输入的心得内容",
    "updated_at": "2025-08-05 11:45:13",
    "sources"   : {}
  },
]

示例

java
@JavascriptInterface
    public void getContentMarks(Object note, CompletionHandler<JSONArray> handler) {
    Log.d(TAG, "getContentMarks");
    if (!GlobalSettings.getLoginStatus(getContext())) {
        handler.complete(null);
    } else {
        presenter.getNetContentMixNoteList(content_id, handler);
    }
}

onAddMark

用户点击了划线按钮。成功提交了划线数据后调用 notifyWebViewUpdated markSuccess

网络请求失败,或者创建失败时,调用 notifyWebViewUpdated markCreateFail

onAddMark.jpg

参数

onAddMarkObject
参数典型值类型备注
text中国焕发出强大生机活力并……String划线文字内容
type1Number1是划线 2是笔记
sources{}Object划线笔记元数据

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onAddMark(Object onAddMarkObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onAddMarkObject;
    Log.d(TAG, "onAddMark " + jsonObject.toString());
    presenter.addNetContentUnderLineItem(mContentId,jsonObject.optString("text"),jsonObject.optJSONObject("sources"),jsonObject);
    handler.complete(true);
}

onAddNote

用户点击了笔记按钮,弹出笔记填写窗口。成功提交笔记后调用 notifyWebViewUpdated noteSuccess

取消新建笔记,调用 notifyWebViewUpdated noteCancel

网络请求失败,或者创建失败时,调用 notifyWebViewUpdated noteCreateFail

onAddNote.jpg

参数

onAddNoteObject
参数典型值类型备注
text中国焕发出强大生机活力并……String划线文字内容
type2Number1是划线 2是笔记
sources{}Object划线笔记元数据

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onAddNote(Object onAddNoteObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onAddNoteObject;
    Log.d(TAG, "onAddMark " + jsonObject.toString());
    presenter.addNetContentUnderLineItem(mContentId,jsonObject.optString("text"),jsonObject.optJSONObject("sources"),jsonObject);
    handler.complete(true);
}

onAddNotefromLine

在划线基础上写笔记,弹出笔记填写窗口,完成写笔记。划线会变成笔记。

成功添加笔记后,调用 notifyWebViewUpdated noteFromLineSuccess

onAddNotefromLine.jpg

参数

onAddNotefromLineObject
参数典型值类型备注
id123Number划线id
text中国焕发出强大生机活力并……String划线文字内容
type1Number1是划线 2是笔记
sources{}Object划线笔记元数据

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onAddNotefromLine(Object onAddNotefromLineObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onAddNotefromLineObject;
    int noteId = jsonObject.optInt("id");
    String textStr = jsonObject.optString("text");
    JSONObject sources = jsonObject.optJSONObject("sources");

    handler.complete(true);
}

onMarkDelete

删除划线。成功提交删除划线请求后调用 notifyWebViewUpdated markDelete

onMarkDelete.jpg

参数

onMarkDeleteObject
参数典型值类型备注
id123Number划线id
text中国焕发出强大生机活力并……String划线文字内容
type1Number1是划线 2是笔记
sources{}Object划线笔记元数据

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onMarkDelete(Object onMarkDeleteObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onMarkDeleteObject;
    int noteId = jsonObject.optInt("id");
    String textStr = jsonObject.optString("text");
    JSONObject sources = jsonObject.optJSONObject("sources");

    handler.complete(true);
}

onNoteShow

用户点击笔记,显示笔记内容

onNoteShow.jpg

参数

onNoteShowObject
参数典型值类型备注
id123Number划线id
text意味着社会主义……String文字内容
note我的笔记内容……String用户的笔记内容
type2Number1是划线 2是笔记
updated_at2025-08-05 11:45:13String修改时间
sources{}Object划线笔记元数据

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onNoteShow(Object onNoteShowObject,CompletionHandler<Boolean> handler) {
    JSONObject jsonObject = (JSONObject)onNoteShowObject;
    Log.e(TAG, "onNoteShow " + jsonObject.toString());

    handler.complete(true);
}

onChat

点击查AI按钮

onChat.jpg

参数

onChatString

类型 String

典型值 来的历史性飞跃,意味

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onChat(Object onChatString,CompletionHandler<Boolean> handler) {
    TargetDict targetDict = new TargetDict();
    targetDict.setQueryString((String)queryStr);

    handler.complete(true);
}

打卡业务方法

onChallengeDetail

获取打卡详情页(已参加)数据

onChallengeDetail.png

参数

id

onChallengeIntroClick

打卡详情简介页

onChallengeIntroClick.png

参数

id

onChallengeCourseClick

点击打卡详情页学习内容

onChallengeCourseClick.png

参数

onChallengeCourseClickObject
json
{
  "id": 363,
  "title": "【新课首发】",
  "course_number": 26,
  "lecturer": "",
  "is_show_number": 0,
  "order_number": 0,
  "media_type": "audio",
  "course_items": []
}

onChallengeTask

获取打卡详情页作业列表

onChallengeTask.png

参数

onChallengeCourseClickObject
json
{
 "challenge_id": 1235,//打卡id
 "page"    : 1, //页码
 "limit"   : 10,
}

后端接口 mobile/homework?page=1&checkin_id=2

onTaskItemClick/onTaskEditClick

点击打卡详情页作业

onTaskItemClick.pngonTaskEditClick.png

参数

onTaskItemClickObject/onTaskEditClickObject
json
{
  "id": 1,
  "title": "作业标题111",
  "start_time": "2023-10-12",
  "end_time": "2023-10-19",
  "diary_user_count": 1,
  "user_avatar": [],
  "user_status": 1,
  "amount": 1
}

作业业务方法

onTaskDetail

获取作业详情页数据

onTaskDetail.png

参数

id

onTaskComment

作业详情页精选日记数据

onTaskComment.png

参数

onTaskCommentObject
json
{
    "task_id": 1235,//作业id
    "page"   : 1, //页码
    "limit"  : 10,
}

返回内容

json
{
  "code":200,
  "data": {
    "list": [],
    "next_page": false
  }
}

onTaskCommentItemClick

点击日记评论、点赞、分享按钮

onTaskCommentItemClick.png

参数

onTaskCommentItemClickObject
json
{
    "_type": "content | reply | like | share",
    "id": 1,
    "root_id": 1
}

_type 含义: reply 进入日记详情页, like 点赞, share 分享, content 点击内容,暂时无用

播客业务方法

onPodCastHome

点播客专栏,进入播客专栏页面,参数为 content.special_column

参数

onPodCastHomeObject
json
{
    "id": 26,
    "title": "播客专栏",
    "count": 4,
    "type": "podcast",
    "media_id": 190253,
    "description": "测822播客专栏",
    "media": {}
}

onAudioClientRects

页面加载完成时会调用,播客播放器位置

参数

onAudioClientRectsObject
json
{
    "left"    : 19.453125,
    "top"     : 433.4375,
    "width"   : 375.09375,
    "height"  : 211.296875,
    "url"     : "http://xxx.mp3",
    "id"      : "5285890",
    "duration": "231"
}

onAudioSeek

快进到播客音频时间点

参数

onAudioSeekObject
json
{
    "id" :"1",
    "time_spot": 180, //180秒 3分钟
    "desc": "从小就是别人家的孩子",
    "media_tencent_id": "5285890"
}

onNextPodcast/onPrePodcast

播客上一讲 下一讲

参数

onNextPodcastObject/onPrePodcastObject
json
{
    id: 1234,
    title:'黑白',
    target: {},
    target_dict: {},
}

onForumEntry

普通文章获取话题讨论内容,对用后端接口 GET /mobile/v8/contents/generate_topic_buzz?content_id=241517

返回值

返回值典型值类型备注
jsonforum_entryJSONArray数据结构

onForumEntryClick

点击页面上的参与讨论

参数

onForumEntryClickObject
onForumEntryClickObject (点击展开)
json
{
    "id"           : 241519,
    "short_subject": "\u201c\u5dfd\u98ce\u6570\u5b57\u4e16\u754c\u201d\uff1a\u5728\u4e91\u7aef\uff0c\u917f\u9020\u4e00\u74f6\u4e13\u5c5e\u7684\u201c\u8305\u53f0\u7f8e\u9152\u201d",
    "topic_number" : 0,
    "topic_count"  : 0,
    "target_dict"  : {
        "article_id"  : "241519",
        "article_type": "article",
        "article_mode": "free",
        "link_type"   : 1,
        "version"     : "1.0"
    }
}

onCommentIn/onCommentOut

进入和退出评论区事件

文章业务方法

WARNING

为提高客户端代码语义化,H5Api 类中实现的函数名 以具名行为的方式命名。如业务 user 业务方法应实现为 getUser

getContent

返回内容详情,用于文章详情页和课程详情页

参数

参数典型值类型备注
id147022/4String文章 ID content id/课程详情 IDcourse_item id

返回值

返回值典型值类型备注
json文章详情 / 课程详情JSON Object
文章详情返回值(点击展开)
json
{
  "content": {
    "status": 4,
    "id": 147022,
    "link_id": 323711,
    "subject": "孩子从小要学编程吗?",
    "subsubject": "",
    "short_subject": "孩子从小要学编程吗?",
    "author": "柴内普·图菲克奇(Zeynep Tufekci)",
    "introtext": "许多面向儿童的计算机教程和编程语言十分风行,那么是否人人都应该从小学计算机呢?答案是因人而异,如果孩子喜欢,当然是最好不过。",
    "fulltext": "<p class=\"contentImg image\"><img class=\"landscape\" src=\"http://images.infzm.com/cms/medias/image/content/kcrt6mDYaWrN323RMRZgrFBCecJdoHQS6qWiEDDq.jpeg\" width=\"500\" height=\"667\" data-src=\"//images.infzm.com/cms/medias/image/content/kcrt6mDYaWrN323RMRZgrFBCecJdoHQS6qWiEDDq.jpeg\" data-key=\"7545\"></p>\n<p class=\"cm_pic_caption\" style=\"text-align: center; color: #999; padding: 0 4em;\"><span class=\"cm_pic_author\" style=\"color: #aaa;\"><span style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">美国前总统奥巴马曾表示,应该“向每个学生提供动手式的计算机科学和数学课程,从一开始就让他们为将来的工作做好准备。”不久,他启动了“人人来学计算机”(Computer Science For All)的项目,项目经费高达40亿美元。</span>(请输入图片来源/图)</span></p>\n<p><b></b><span style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">访谈问题:科技公司对此热情很高。亚马逊发起了“亚马逊未来工程师”项目,每年想教1000万儿童编程。脸书、微软和谷歌等公司也有类似项目,规模及范围各有大小。</span></p>\n<p><b></b>访谈回答:许多家长也很热心。Code.org是一家促进计算机教育的非营利机构,具他们统计,有九成家长希望孩子在学校学习计算机。这解释了为什么许多面向儿童的教程和计算机编程语言会如此风行,比如Scratch语言和“编程一小时”活动。</p>\n<p><a href=\"https://www.zhihu.com/\" title=\"这是个链接\">这是个链接</a></p>\n<p class=\"contentImg image\"><img class=\"landscape\" src=\"http://images.infzm.com/cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg\" width=\"1000\" height=\"667\" data-src=\"//images.infzm.com/cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg\" data-key=\"7515\"></p>\n<p class=\"cm_pic_caption\" style=\"text-align: center; color: #999; padding: 0 4em;\">2019年7月30日,参赛选手在进行“少儿编程赛”。&nbsp;<span class=\"cm_pic_author\">(新华社记者 骆学峰/图)</span></p>\n<p><span style=\"color: #339966;\"><b>那么,要让你的孩子参加编程营吗?</b></span><em>要执意让他们上计算机课吗?</em><span class=\"nfzm-web-style--kaiti\" style=\"font-family: 楷体, 楷体_GB2312, STKaiti;\">可以,但不一定。我从小就学习编程,并且从中获益匪浅。</span>我用兼职赚的钱买了一台家用电脑,学习了Basic编程语言和一些机器语言。那很好玩,就像解谜。我在大一时找了第一份工作,做软件开发。一直到今天,情况并没多大变化:软件开发工程师还是很赚钱,属于紧俏人才。那为什么我要说“不一定”呢?</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p><p><audio class=\"contents-audio\" id=\"contents-audio-0\" data-fileid=\"5285890786773580306\" data-media=\"audio\" data-resource=\"tencent\" data-filename=\"刘惜君 - 遥远的歌.mp3\" data-url=\"null\" width=\"320\" height=\"80\" src=\"\">刘惜君 - 遥远的歌.mp3</audio></p></p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>&nbsp;</p>\n<p>编程对于我很好玩。可是对于那些兴趣不大的孩子呢?难道也要强迫他们学习编程,只为了将来能找份工作?在我看来,几十年后,我们不太可能还像今天这样给计算机编程。就拿机器学习来说(我们今天讲到“人工智能”,主要指的就是机器学习),它迥异于为计算机下达详细的逐步指令。我们今天要做的是给机器学习算法输入大量数据,让程序自行建构完成工作所需的模型。</p>\n<h3 class=\"thirdTitle\">小标题二</h3>\n<p>我举一个显著的例子:从前的谷歌翻译包含50万行代码,但今天改用机器学习语言,</p>\n<p><a href=\"http://www.infzm.com/wap/#/vip\" title=\"南周会员页\">南周会员页</a></p>\n<p>大约只有500行代码。现在最大的难题不是学习一门编程语言,而是拥有大量数据,并在数学上理解计算机构建的模型如何运作,这样才能调整、测试这些模型。</p>\n<h5 class=\"thirdTitle fourthTitle fifthTitle\">小标题三</h5>\n<p>在未来,这类计算机工作要注重什么呢?在技术方面,主要是数学:统计学、线性代数、概率论和微积分。数学仍是一门重要技术,除了编程,对许多职业都很有用。对日常生活也不可或缺。建立算法思维未必要通过编程。懂一点数学,再从烹饪、缝纫和编织(这些都包含了某种算法)中积累适当的学习经验,都很有价值。</p>\n<p><a href=\"http://www.infzm.com/app/open-page.php?link_type=7\" title=\"南周会员\">南周会员</a></p>\n<h4 class=\"fourthTitle\">小标题</h4>\n<p>对未来更重要的,是认清一个事实:计算机编程本身鼓励我们建构一个闭合的世界。这也是我当年觉得编程好玩的一个原因:能用一条条指令组装起一个(乏味的)东西,然后在自己建构的世界中玩耍,简直像魔法般诱人。但可惜,这和当今科技产业的做法已经相去甚远。当今需要的人才,要懂历史、社会学、心理学、数学和计算机,还要擅长分析复杂、开放和混沌的系统。 </p>\n<p><p><video class=\"contents-video\" id=\"contents-video-0\" data-fileid=\"5285890795798398563\" data-media=\"video\" data-resource=\"tencent\" data-filename=\"2 环保小视频.mp4\" data-cover=\"http://images.infzm.com/cms/medias/image/19/03/26/LQGrInroFfUa17OlzZv4dtXNHWgGVsWlrWDKEzaZ.jpeg\" data-url=\"http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/c1e233295285890795798398563/ErvtIKlxIo0A.mp4\" poster=\"\" controls=\"controls\" width=\"640\" height=\"360\">\n                       <source src=\"\" type=\"video/mp4\"></video></p></p>\n<p>那么,你应该让一个对编程感兴趣的孩子加入编程营吗?当然应该。要不要让他们用Scratch语言编程玩,或参加“编程一小时”课程,看看他们是否感兴趣?绝对要。但如果他们对编程没有兴趣,只想学习如何做纸杯蛋糕、缝布娃娃或是爬树,你也不必担心。</p>\n<p>我们绝不能让年轻人认为,世界正强迫他们在两条道路之间选择,一边是数学和理科,一边是社会科学和人文。我们要面对的最有趣或许也是最艰难的问题,将位于这两条道路的交叉处――而不在我们为了好玩创造出来的那个渺小封闭的世界里。</p>\n<p class=\"nfzm-web-style--kaiti\">(Scientific American中文版环球科学授权南方周末发表,红猪翻译)</p>\n<p>&nbsp;</p>",
    "publish_time": "2019-09-19 10:04:57",
    "link_url": "",
    "isnew": 1,
    "subject_media": null,
    "content_network_editor": "柔翡",
    "content_charge_editor": "朱力远",
    "check_author": "",
    "content_from": "",
    "share_count": 0,
    "comment_count": 2,
    "ding_count": 3,
    "pay_property": {
      "content_type": "article",
      "front_template": "",
      "mode": "free",
      "end_freetime": "1899-11-30 00:00:00"
    },
    "column": {
      "id": 143,
      "platform": "all",
      "title": "分类2",
      "type": "column"
    },
    "channels": [
      {
        "id": 1,
        "platform": "all",
        "type": "channel",
        "title": "推荐"
      },
      {
        "id": 4,
        "platform": "all",
        "type": "channel",
        "title": "文化"
      }
    ],
    "sns_share": {
      "url": "http://www.infzm.com/content/147022",
      "share_title": "孩子从小要学编程吗?",
      "share_desc": "许多面向儿童的计算机教程和编程语言十分风行,那么是否人人都应该从小学计算机呢?答案是因人而异,如果孩子喜欢,当然是最好不过。",
      "path": "http://images.infzm.com/medias/default/logo_100_white.png"
    },
    "tags": [
      {
        "title": "计算机"
      }
    ],
    "medias": [
      {
        "author": "",
        "description": "fromPeopleMedia:23219",
        "file_path": "cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg",
        "subject": ""
      }
    ],
    "content_medias": [],
    "video_cover": {},
    "relation_contents": [],
    "video": {},
    "content_title_picture": "cms/medias/image/content/uiE1JUVEMS70NvJ8ATA2frfPtYupbmz6RAxINx9s.jpeg",
    "submodules": [],
    "audios": []
  },
  "user": {
    "islogin": false,
    "isview": true,
    "isNewsStand": 0,
    "isdigg": false,
    "isfav": false
  },
  "cache": "1_redis",
  "magazine": {}
}
课程详情返回值(点击展开)
json
{
  "course_item": {
    "id": 4,
    "title": "02 卯时·早膳早课",
    "media_id": 7,
    "media_free_id": 0,
    "media_cover_id": 3220,
    "media_type": "video",
    "lecturer": "向阳",
    "is_free": 0,
    "course_id": 3,
    "comment_count": 6,
    "ding_count": 26,
    "fulltext": "",
    "introtext": null,
    "isdigg": false,
    "media": {
      "id": 7,
      "name": "故宫第二集1012.mp4",
      "path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
      "width": 0,
      "height": 0,
      "type": "video",
      "duration": 784,
      "fileId": "5285890782836944635"
    },
    "media_free": null,
    "media_cover": {
      "id": 3220,
      "name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
      "path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
      "width": 952,
      "height": 535,
      "type": "image"
    }
  },
  "course": {
    "id": 3,
    "media_id": 3262,
    "headimg_media_id": 3211,
    "title": "《故宫 · 皇帝的一天》",
    "is_final": 0,
    "course_number": 10,
    "lecturer": "向阳",
    "is_show_number": 0,
    "order_number": 1658,
    "media_type": "video",
    "share_title": "南周严选课:在故宫带你走过皇帝的一天",
    "share_media_id": 3245,
    "share_desc": "十节视频课,亲近一群你从未亲近的皇帝,发现一座你从未发现的故宫。",
    "desc": "<p><img src=\"medias/image/18/11/22/fCsHr7RrJnbQBtgGKCDotufbk0B3YIjpSLR8uBol.jpeg\" data-src=\"//images.infzm.com/cms/medias/image/18/11/22/fCsHr7RrJnbQBtgGKCDotufbk0B3YIjpSLR8uBol.jpeg\" data-key=\"4303\" /></p>",
    "lecturer_desc": null,
    "chapter_desc": null,
    "purchase_desc": "<p><img src=\"medias/image/courses/qRnvLwr5lRM6yv7fOwhTiDUL9mAY4sOrkgYTsX6W.png\" data-key=\"3213\" /></p>",
    "price_type": 2,
    "price": 1000,
    "vip_price": 1000,
    "expire_price": 0,
    "expire_time": "2018-11-26 23:59:59",
    "lecturer_media_id": 3212,
    "lecturer_id": "[1]",
    "link_url": null,
    "introtext": null,
    "status": 1,
    "specific_member": 0,
    "is_update_note": 0,
    "update_note": "",
    "is_show_cover": 0,
    "is_section_style": 1,
    "is_multi_media": 1,
    "share_url": "http://www.infzm.com/wap/#/course/3",
    "course_items_count": 10,
    "is_free": 1,
    "course_url": "http://cms.infzm.com/mobile/courses/3?format=html",
    "pumpkin": 50,
    "lecturers": [
      {
        "id": 1,
        "title": "向阳",
        "media_id": 3804,
        "desc": "媒体人、作家,著有《经典躺着读》。南方周末前副总编辑,南瓜视业创始人。大型人文教育公开课《同一堂课》出品人。",
        "media": {
          "id": 3804,
          "name": "FZPvFHXAXh1VlpwlTssAKe75xtisArffqBOTkk7V.png",
          "path": "http://dev.cms.infzm.com/medias/image/18/11/16/FZPvFHXAXh1VlpwlTssAKe75xtisArffqBOTkk7V.png",
          "width": 400,
          "height": 400,
          "type": "image"
        }
      }
    ],
    "now_time": "2020-05-13 15:00:46",
    "course_item": {
      "id": 3,
      "title": "01 寅时·给太后请安",
      "media_id": 6,
      "media_free_id": 0,
      "media_cover_id": 3222,
      "media_type": "video",
      "lecturer": "向阳",
      "is_free": 0,
      "published_at": "2018-11-05 19:49:57",
      "course_id": 3,
      "comment_count": 7,
      "fulltext": "",
      "introtext": null,
      "media": {
        "id": 6,
        "name": "故宫第一集 修改版-ok 1012.mp4",
        "path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/ae5c46915285890782830128097/0BxWzQJ286oA.mp4",
        "width": 0,
        "height": 0,
        "type": "video",
        "duration": 847,
        "fileId": "5285890782830128097"
      },
      "media_free": null,
      "media_cover": {
        "id": 3222,
        "name": "6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
        "path": "http://dev.cms.infzm.com/medias/image/courses/6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
        "width": 1165,
        "height": 655,
        "type": "image"
      }
    },
    "isbuy": false,
    "has_coupon_rule_user": 0,
    "isborrow": 0,
    "media": {
      "id": 3262,
      "name": "e4Q2gDcTYSCH5yfOYIlhx78n8T9I0BQU0fCGGdg7.jpeg",
      "path": "http://dev.cms.infzm.com/medias/image/courses/e4Q2gDcTYSCH5yfOYIlhx78n8T9I0BQU0fCGGdg7.jpeg",
      "width": 1242,
      "height": 698,
      "type": "image"
    },
    "headimg_media": {
      "id": 3211,
      "name": "ahkxfDtiaw5HKHNkUfoEEcOmWcEjzWFMMfjM0Bnh.jpeg",
      "path": "http://dev.cms.infzm.com/medias/image/courses/ahkxfDtiaw5HKHNkUfoEEcOmWcEjzWFMMfjM0Bnh.jpeg",
      "width": 140,
      "height": 140,
      "type": "image"
    },
    "share_media": {
      "id": 3245,
      "name": "LUFhLqqjPcaTvsBCbVUNvaR1pW6XyHFhBALu9h20.jpeg",
      "path": "http://dev.cms.infzm.com/medias/image/courses/LUFhLqqjPcaTvsBCbVUNvaR1pW6XyHFhBALu9h20.jpeg",
      "width": 140,
      "height": 140,
      "type": "image"
    },
    "lecturer_media": {
      "id": 3212,
      "name": "abWUAG2ESMTwooiwI6JytxrhFTRrO43ZS5PGpXHA.png",
      "path": "http://dev.cms.infzm.com/medias/image/courses/abWUAG2ESMTwooiwI6JytxrhFTRrO43ZS5PGpXHA.png",
      "width": 1182,
      "height": 575,
      "type": "image"
    },
    "course_items": [
      {
        "id": 3,
        "title": "01 寅时·给太后请安",
        "media_id": 6,
        "media_free_id": 0,
        "media_cover_id": 3222,
        "media_type": "video",
        "lecturer": "向阳",
        "is_free": 0,
        "published_at": "2018-11-05 19:49:57",
        "course_id": 3,
        "comment_count": 7,
        "fulltext": "",
        "introtext": null,
        "media": {
          "id": 6,
          "name": "故宫第一集 修改版-ok 1012.mp4",
          "path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/ae5c46915285890782830128097/0BxWzQJ286oA.mp4",
          "width": 0,
          "height": 0,
          "type": "video",
          "duration": 847,
          "fileId": "5285890782830128097"
        },
        "media_free": null,
        "media_cover": {
          "id": 3222,
          "name": "6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
          "path": "http://dev.cms.infzm.com/medias/image/courses/6uFUqRRJPbKiCwB9RJV5jLOgstjRNcaPC9mI6lD0.png",
          "width": 1165,
          "height": 655,
          "type": "image"
        }
      },
      {
        "id": 4,
        "title": "02 卯时·早膳早课",
        "media_id": 7,
        "media_free_id": 0,
        "media_cover_id": 3220,
        "media_type": "video",
        "lecturer": "向阳",
        "is_free": 0,
        "published_at": "2018-11-05 22:49:23",
        "course_id": 3,
        "comment_count": 6,
        "fulltext": "",
        "introtext": null,
        "media": {
          "id": 7,
          "name": "故宫第二集1012.mp4",
          "path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
          "width": 0,
          "height": 0,
          "type": "video",
          "duration": 784,
          "fileId": "5285890782836944635"
        },
        "media_free": null,
        "media_cover": {
          "id": 3220,
          "name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
          "path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
          "width": 952,
          "height": 535,
          "type": "image"
        }
      }
    ]
  },
  "user": null,
  "cache": "0_redis"
}

示例

java
@JavascriptInterface
public void getContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(this.content);
}

getVote

获取当前图文文章内投票模块数据

参数

参数典型值类型备注
id147022String文章 ID content id 或 单课id

返回值

返回值典型值类型备注
jsonJSON Object
getVote 返回值(点击展开)
json
{
    "id"           : 7,
    "title"        : "测试投票",
    "expire_at"    : "2021-07-13 22:28:11",
    "cited_count"  : 1,
    "created_at"   : "2021-07-14 10:01:51",
    "updated_at"   : "2021-07-15 09:49:31",
    "is_end"       : true,
    "user_options" : [
        36,
        40,
        46
    ],
    "user_status"  : true,
    "vote_problems": [
        {
            "id"                  : 16,
            "vote_id"             : 7,
            "type"                : "single",
            "problem"             : "问题1",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 36,
                    "vote_problem_id": 16,
                    "description"    : "选项1",
                    "num"            : 12,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 37,
                    "vote_problem_id": 16,
                    "description"    : "选项2",
                    "num"            : 11,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 38,
                    "vote_problem_id": 16,
                    "description"    : "选项4",
                    "num"            : 1,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        },
        {
            "id"                  : 17,
            "vote_id"             : 7,
            "type"                : "multiple",
            "problem"             : "问题2",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 39,
                    "vote_problem_id": 17,
                    "description"    : "选项1",
                    "num"            : 14,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 40,
                    "vote_problem_id": 17,
                    "description"    : "选项2",
                    "num"            : 16,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 41,
                    "vote_problem_id": 17,
                    "description"    : "选项3",
                    "num"            : 19,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        },
        {
            "id"                  : 18,
            "vote_id"             : 7,
            "type"                : "single",
            "problem"             : "问题3",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 42,
                    "vote_problem_id": 18,
                    "description"    : "选项1",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 43,
                    "vote_problem_id": 18,
                    "description"    : "选项2",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 44,
                    "vote_problem_id": 18,
                    "description"    : "选项3",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 45,
                    "vote_problem_id": 18,
                    "description"    : "选项4",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 46,
                    "vote_problem_id": 18,
                    "description"    : "选项5",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        }
    ]
}

示例

java
@JavascriptInterface
public void getVote(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(this.vote);
}

getPk

获取当前图文文章内观点PK 模块数据

参数

参数典型值类型备注
id147022String文章 ID content id

返回值

返回值典型值类型备注
jsonJSON Object
getPk 返回值(点击展开)
json
{
    "id": 1,
    "title": "测试观点pk",
    "expire_at": "2021-07-14 11:39:57",
    "cited_count": 1,
    "created_at": null,
    "updated_at": null,
    "is_end": true,
    "user_options": [
        2
    ],
    "user_status": true,
    "opinion_descs": [
        {
            "id": 112,
            "opinion_id": 1,
            "standpoint": "negative",
            "opinion_name": "反方观点1",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        },
        {
            "id": 113,
            "opinion_id": 1,
            "standpoint": "positive",
            "opinion_name": "正方观点2",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        },
        {
            "id": 114,
            "opinion_id": 1,
            "standpoint": "negative",
            "opinion_name": "反方观点2",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        }
    ],
    "opinion_options": [
        {
            "id": 1,
            "opinion_id": 1,
            "standpoint": "positive",
            "description": "支持正方",
            "num": 10,
            "created_at": null,
            "updated_at": null
        },
        {
            "id": 2,
            "opinion_id": 1,
            "standpoint": "negative",
            "description": "支持反方",
            "num": 27,
            "created_at": null,
            "updated_at": null
        }
    ]

示例

java
@JavascriptInterface
public void getPk(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(this.pk);
}

getNextContent

获取下一篇、下一章节内容,用于电子报详情页和课程详情页

参数

参数典型值类型备注
id147022/4String文章 ID content id/课程详情 IDcourse_item id

返回值

返回值典型值类型备注
json下一课程JSON Object

WARNING

电子报详情页下一篇文章暂未支持

课程详情返回值(点击展开)
json
{
  "id": 4,
  "title": "02 卯时·早膳早课",
  "media_id": 7,
  "media_free_id": 0,
  "media_cover_id": 3220,
  "media_type": "video",
  "lecturer": "向阳",
  "is_free": 0,
  "course_id": 3,
  "comment_count": 6,
  "ding_count": 26,
  "fulltext": "",
  "introtext": null,
  "isdigg": false,
  "media": {
    "id": 7,
    "name": "故宫第二集1012.mp4",
    "path": "http://1251434507.vod2.myqcloud.com/93ffc8dfvodgzp1251434507/8f05105b5285890782836944635/mUaMHFF3o9wA.mp4",
    "width": 0,
    "height": 0,
    "type": "video",
    "duration": 784,
    "fileId": "5285890782836944635"
  },
  "media_free": null,
  "media_cover": {
    "id": 3220,
    "name": "OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
    "path": "http://dev.cms.infzm.com/medias/image/courses/OjVVatsy6bLu3sXu2brcb5vy6RJa5P2mKo13fbMe.png",
    "width": 952,
    "height": 535,
    "type": "image"
  }
}

示例

java
@JavascriptInterface
public void getNextContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(this.content);
}

getRewards

返回打赏数据结构

参数典型值类型备注
link_id147022String文章业务 ID

返回值

返回值典型值类型备注
jsonrewardsJSONArray数据结构

WARNING

注意改接口返回的是 JSON 数组,即 data 的值

示例

java
@JavascriptInterface
public void getRewards(Object link_id, CompletionHandler<JSONArray> handler) throws JSONException {
    handler.complete(this.rewards);
}

getComments

返回当前页评论数据。当收到 notifyWebViewUpdated comment 事件通知,会调用该接口。

注意保存评论数据的上下文(页数),用于分页加载。接口返回的内容的分页数制作为参考。

参数

返回值

返回值典型值类型备注
jsoncommentsJSONArray数据结构

WARNING

接口返回的是后端接口的 data 值,不含 code 和 msg

示例

java
@JavascriptInterface
public void getComments(Object link_id, CompletionHandler<JSONArray> handler) throws JSONException {
    handler.complete(this.comments);
}

getAudio

返回全局正在播放的音频对象序号

参数典型值类型备注
id147022String文章 ID

返回值

json
{
  "index": "0"
}

示例

java
@JavascriptInterface
public void getAudio(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(new JSONObject);
}

getUser

用户信息,返回数据结构到网页

返回值

返回值典型值类型备注
jsonuserJSONObject数据结构

WARNING

用户未登录时,返回空的数据结构,如下:

json
{

}

示例

java
@JavascriptInterface
public void getUser(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
    JSONObject user = new JSONObject();
    user.put("username", "Mather");
    handler.complete(content);
}

onComments

请求文章评论,参数为文章的 link_id ,分页数 page 和每页条数 limit 。请求的成功以 notifyWebViewUpdated comment 事件通知。

HybridAppFramework

评论模块若干API 的调用流程图

参数

onCommentsObject
json
{
    "link_id" : 2,
    "page"    : 1,
    "limit"   : 10
}
参数典型值类型备注
link_id2Number文章的 link_id
page1Number分页数
limit10Number每页条数

返回值

true

示例

java
@JavascriptInterface
public void onComments(Object commentsObject, CompletionHandler<JSONObject> handler) throws JSONException {

    JSONObject _commentsObject = (JSONObject) commentsObject;
    int link_id    = _commentsObject.getInt("link_id");
    int page    = _commentsObject.getInt("page");
    int limit    = _commentsObject.getInt("limit");

    handler.complete(true);
}

onContentVote

投票提交内容,完整的参数见后端接口文档

参数

ContentVoteObject
json
{
    "vote_id"     : 2,
    "content_id"  : 12345, //文章页面返回的是 文章id
    "course_item_id"  : 1193, //单课页面返回的是 单课id
    "vote_problem_options": [30, 31, 32, 33]
}
参数典型值类型备注
vote_id2Number投票id
content_id12345Number投票所属文章的id
vote_problem_options127Number[]选项集合

返回值

返回值典型值类型备注
jsonJSON Object
onContentVote 返回值(点击展开)
json
{
    "id"           : 7,
    "title"        : "测试投票",
    "expire_at"    : "2021-07-13 22:28:11",
    "cited_count"  : 1,
    "created_at"   : "2021-07-14 10:01:51",
    "updated_at"   : "2021-07-15 09:49:31",
    "is_end"       : true,
    "user_options" : [
        36,
        40,
        46
    ],
    "user_status"  : true,
    "vote_problems": [
        {
            "id"                  : 16,
            "vote_id"             : 7,
            "type"                : "single",
            "problem"             : "问题1",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 36,
                    "vote_problem_id": 16,
                    "description"    : "选项1",
                    "num"            : 12,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 37,
                    "vote_problem_id": 16,
                    "description"    : "选项2",
                    "num"            : 11,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 38,
                    "vote_problem_id": 16,
                    "description"    : "选项4",
                    "num"            : 1,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        },
        {
            "id"                  : 17,
            "vote_id"             : 7,
            "type"                : "multiple",
            "problem"             : "问题2",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 39,
                    "vote_problem_id": 17,
                    "description"    : "选项1",
                    "num"            : 14,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 40,
                    "vote_problem_id": 17,
                    "description"    : "选项2",
                    "num"            : 16,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 41,
                    "vote_problem_id": 17,
                    "description"    : "选项3",
                    "num"            : 19,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        },
        {
            "id"                  : 18,
            "vote_id"             : 7,
            "type"                : "single",
            "problem"             : "问题3",
            "created_at"          : "2021-07-14 10:18:59",
            "updated_at"          : "2021-07-14 10:18:59",
            "vote_problem_options": [
                {
                    "id"             : 42,
                    "vote_problem_id": 18,
                    "description"    : "选项1",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 43,
                    "vote_problem_id": 18,
                    "description"    : "选项2",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 44,
                    "vote_problem_id": 18,
                    "description"    : "选项3",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 45,
                    "vote_problem_id": 18,
                    "description"    : "选项4",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                },
                {
                    "id"             : 46,
                    "vote_problem_id": 18,
                    "description"    : "选项5",
                    "num"            : 0,
                    "created_at"     : "2021-07-14 10:18:59",
                    "updated_at"     : "2021-07-14 10:18:59"
                }
            ]
        }
    ]
}

示例

java
@JavascriptInterface
public void onContentVote(Object ContentVoteObject, CompletionHandler<JSONObject> handler) throws JSONException {
    JSONObject _ContentVoteObject = (JSONObject) ContentVoteObject;
    int vote_id    = _ContentVoteObject.getInt("vote_id");
    //post to server

    JSONObject res = new JSONObject();
    res.put("data", "data"); //data 值是返回值
    handler.complete(res);
}

onContentPk

观点PK提交内容,完整的参数见后端接口文档

参数

ContentPkObject
json
{
    "opinion_id": 2,
    "content_id": 12345,
    "opinion_option_id": 123,
}
参数典型值类型备注
opinion_id2Numberpk id
content_id12345Numberpk 所属文章的 id
opinion_option_id127Number正方或反方的选项 id

返回值

返回值典型值类型备注
jsonJSON Object
onContentPk 返回值(点击展开)
json
{
    "id": 1,
    "title": "测试观点pk",
    "expire_at": "2021-07-14 11:39:57",
    "cited_count": 1,
    "created_at": null,
    "updated_at": null,
    "is_end": true,
    "user_options": [
        2
    ],
    "user_status": true,
    "opinion_descs": [
        {
            "id": 112,
            "opinion_id": 1,
            "standpoint": "negative",
            "opinion_name": "反方观点1",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        },
        {
            "id": 113,
            "opinion_id": 1,
            "standpoint": "positive",
            "opinion_name": "正方观点2",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        },
        {
            "id": 114,
            "opinion_id": 1,
            "standpoint": "negative",
            "opinion_name": "反方观点2",
            "created_at": "2021-07-14 16:48:44",
            "updated_at": "2021-07-14 16:48:44"
        }
    ],
    "opinion_options": [
        {
            "id": 1,
            "opinion_id": 1,
            "standpoint": "positive",
            "description": "支持正方",
            "num": 10,
            "created_at": null,
            "updated_at": null
        },
        {
            "id": 2,
            "opinion_id": 1,
            "standpoint": "negative",
            "description": "支持反方",
            "num": 27,
            "created_at": null,
            "updated_at": null
        }
    ]

示例

java
@JavascriptInterface
public void onContentPk(Object ContentPkObject, CompletionHandler<JSONObject> handler) throws JSONException {
    JSONObject _ContentPkObject = (JSONObject) ContentPkObject;
    int vote_id    = _ContentPkObject.getInt("vote_id");
    //post to server

    JSONObject res = new JSONObject();
    res.put("data", "data"); //data 值是返回值
    handler.complete(res);
}

onContentMounted

网页获取正文内容并渲染到页面后触发的回调,客户端可监听 onContentMounted 即可得知内容已显示在页面上。

内容显示出来后,前端便会计算正文标题和标题下方内容到页面顶部的高度,将参数带进 onContentMounted 回调参数中。

参数

ContentMountedObject
json
{
    "titleOffsetTop": 82,
    "metaOffsetTop": 127,
    "postOffsetTop": 3555,
    "pkOffsetTop": 2000,
    "voteOffsetTop": 2500,
    "contentHeight": 700,
    "topAdOffsetTop": 100
}
参数典型值类型备注
titleOffsetTop82Number正文标题到页面顶部的距离
metaOffsetTop127Number标题下方内容到页面顶部的距离
postOffsetTop3555Number报料投稿模块到页面顶部的距离,0 代表电子报场景无该模块
pkOffsetTop2000Number观点PK 模块到页面顶部的距离,0 代表无该模块
voteOffsetTop2500Number投票模块到页面顶部的距离,0 代表无该模块
contentHeight700Number文章正文中,文字和图片的高度
contentOffsetBottom500Number文章正文中到页面底部的距离
topAdOffsetTop100Number文章顶部广告位到页面顶部的距离
authorCardsOffsetTop621Number作者卡片模块到页面顶部的距离
onCommentOffsetTop1621Number评论模块到页面顶部的距离,0 代表无该模块

titleOffsetTop metaOffsetTop 属性分别表示页面中不同两点间的距离:

titleOffsetTop-and-metaOffsetTop.jpg

postOffsetTop 表示页面中不同两点间的距离:

postOffsetTop.jpg

contentHeight 表示文章正文中,文字和图片的高度:

contentHeight.jpg.jpg

示例

java
@JavascriptInterface
public void onContentMounted(Object ContentMountedObject, CompletionHandler<Boolean> handler) throws JSONException {
    JSONObject _ContentMountedObject = (JSONObject) ContentMountedObject;
    int titleOffsetTop    = _ContentMountedObject.getInt("titleOffsetTop");
    int metaOffsetTop     = _ContentMountedObject.getInt("metaOffsetTop");
    int postOffsetTop     = _ContentMountedObject.getInt("postOffsetTop");

    handler.complete(true);
}

onCommentItemClick

点击评论内容,回复评论、点赞和更多操作

参数

commentItemObject

commentItemObject 对象柔合了单条评论数据,客户端可根据需求自行判定

commentItemObject 中的 _type 参数描述对应业务功能; _index 参数表示该目标评论位于原评论数组中序号(从 0 开始)

_type类型备注
replyString回复用户评论
likeString点赞用户评论
item-likeString点赞用户评论(楼中楼)
unlikeString取消点赞用户评论
item-unlikeString取消点赞用户评论(楼中楼)
moreString点击更多操作
shareString分享该条评论内容
json
{
  "_type": "reply",
  "_index": 0,
  "id": 2264072,
  "parent_id": 0,
  "root_id": 0,
  //表示回复哪条id
  "link_id": 323711,
  "user_id": 2292965,
  "comment_content": "燃气热水器",
  "user": {},
  "created_at": null,
  "comment_images": [
    {
      id:1,
      width: 1080,
      height: 1585,
      path: 'https://images.infzm.com/cms/medias/image/25/03/18/BWQ1tD1Z4gxt8oKAH4UDpLBXM9jiAquOLJNON07M.jpeg'
    }
  ]
}

示例

java
@JavascriptInterface
public void onCommentItemClick(Object commentItemObject, CompletionHandler<Boolean> handler) throws JSONException {
    JSONObject commentItem = (JSONObject) commentItemObject;
    String id    = commentItem.getString("id");

    handler.complete(true);
}

onCommentImageClick

点击评论图片,全屏显示这张图片

参数

commentImageObject
json
{
  id:1,
  width: 1080,
  height: 1585,
  path: 'https://images.infzm.com/cms/medias/image/25/03/18/BWQ1tD1Z4gxt8oKAH4UDpLBXM9jiAquOLJNON07M.jpeg'
}

onImageList

onImageViewer

全屏显示文章内图片,imageObj JSONObject 中包含当前点击的图片 current 和文章中所有图片 list

! 在 1.7.0 版中,头图加入了可浏览的图片集合

参数

imageObj

包含当前图片 current 的资源地址、left 离视窗左侧、top 离视窗顶部、with 宽度、height 高度,和当前页面所有的图片资源地址。

离视窗左侧、离视窗顶部、宽度、高度的单位为 px

json
{
    "current": "http://images.infzm.com/cms/medias/image/20/07/26/RhRj06GKd89KqOTyNEQjeUKNFQLDKfjrZKC2CAVy.jpeg",
    "left"   : 0,
    "top"    : 440,
    "width"  : 375,
    "height" : 211,
    "data"   : [
        "http://images.infzm.com/cms/medias/image/20/07/26/RhRj06GKd89KqOTyNEQjeUKNFQLDKfjrZKC2CAVy.jpeg",
        "http://images.infzm.com/cms/medias/image/20/07/26/oYmAWVCaj6hd21skaO9rIsHJJCZ29uylZqRyUtWV.jpeg",
        "http://images.infzm.com/cms/medias/image/20/07/26/gVvMRN295zS4QA29oN9aLiO7PrpDa36su64wDGNF.jpeg"
    ]
}

示例

java
@JavascriptInterface
public void onImageViewer(Object imageObj, CompletionHandler<Boolean> handler) throws JSONException {
    JSONObject images = (JSONObject) imageObj;
    String current    = images.getString("current");
    JSONArray data    = images.getJSONArray("data");
    /*
    open imageViewer
     */
    handler.complete(true);
}

getRelationContent

获取当前文章的推荐模块内容

参数

参数典型值类型备注
id147022String文章 ID content id

返回值

返回值典型值类型备注
jsonrelationContentJSONArray数据结构

示例

java
@JavascriptInterface
public void getRelationContent(Object id, CompletionHandler<JSONObject> handler) throws JSONException {
    handler.complete(this.relationContent);
}

onRelationContent/onRelationWithTopic

点击相关推荐,话题中含有的关联内容

参数

参数典型值类型备注
relationContent{}JSON相关推荐,单条内容的数据结构

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onRelationContent(Object index, CompletionHandler<Boolean> handler) {
    int RelationContentIndex = (int) index;
    /*
    open new content code in here
     */
    handler.complete(true);
}

onShare

点击分享按钮

参数

shareType
参数典型值类型备注
shareTypetimeline wechat weibo qqString微信朋友圈、微信好友、微博、QQ

返回值

返回值典型值类型备注
truetrue falseBoolean
java
@JavascriptInterface
public void onShare(Object shareType, CompletionHandler<Boolean> handler) {
    String shareType = (String) type;
    /*
    share code in here
     */
    handler.complete(true);
}

onVideoPlay

调起客户端视频播放功能

参数

videoParams
json
{
  "left"    : 19.453125,
  "top"     : 433.4375,
  "width"   : 375.09375,
  "height"  : 211.296875,
  "url"     : "http://1251434507.vod2.myqcloud.com/48276b87vodtransgzp1251434507/c1e233295285890795798398563/v.f20.mp4",
  "id"      : "5285890795798398563",
  "duration": "231"
}

返回值

返回值典型值类型备注
truetrue falseBoolean

示例

java
@JavascriptInterface
public void onVideoPlay(Object videoParams, CompletionHandler<Boolean> handler) throws JSONException {
    JSONObject video = (JSONObject) videoParams;
    double left     = video.getDouble("left");
    String id       = video.getString("id");
    /*
    open video
     */
    handler.complete(true);
}

onAudioPlay

调起客户端音频播放功能

参数

audioParams
json
{
  "index"   : "0",
  "title"   : "刘惜君 - 遥远的歌",
  "id"      : "5285890786773580306",
  "duration": "174",
  "url"     : "http://1251434507.vod2.myqcloud.com/48276b87vodtransgzp1251434507/ebbd01f65285890786773580306/v.f1010.mp3",
  "status"  : "playing" //stop
}

返回值

返回值典型值类型备注
truetrue falseBoolean

示例

java
@JavascriptInterface
public void onAudioPlay(Object audioParams, CompletionHandler<Boolean> handler) throws JSONException {
    JSONObject audio = (JSONObject) audioParams;

    String id       = audio.getString("id");
    double duration = audio.getString("duration");
    /*
    play audio
     */
    handler.complete(true);
}

onChannel

打开相关频道/栏目

参数

channelParams
参数典型值类型备注
termId145Number频道/栏目 ID
title分类4String频道/栏目名称

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onChannel(Object channelParams, CompletionHandler<Boolean> handler) {
    JSONObject channel = (JSONObject) channelParams;

    int id          = channel.getInt("termId");
    double duration = channel.getString("title");
    /*
    open channel
     */
    handler.complete(true);
}

onColumn

收录于专栏模块

参数

specialColumnParams
参数典型值类型备注
specialColumnParams{}JSON专栏数据结构
json
{
    "special_column": {
        "id": 15,
        "title": "wh专栏",
        "count": 2
    }
}

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onColumn(Object specialColumnParams, CompletionHandler<Boolean> handler) {
    JSONObject column = (JSONObject) specialColumnParams;

    int id          = column.getInt("id");
    double duration = column.getString("title");
    /*
    open column
     */
    handler.complete(true);
}

onSubject

收录于专题模块

参数

belongSubjectParams
参数典型值类型备注
belongSubjectParams{}JSON收录于专题模块数据结构
json
{
    "belong_subject": {
        "id": 216755,
        "subject": "正文列表标题-总策划从库里选择",
        "subject_media": {
            "id": 146497,
            "path": "cms\/medias\/image\/22\/06\/10\/cd82f5b2ce04e119d4c5a50f997398da.png",
            "width": 657,
            "height": 260
        }
    }
}

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onSubject(Object belongSubjectParams, CompletionHandler<Boolean> handler) {
    JSONObject belongSubject = (JSONObject) belongSubjectParams;

    int id          = belongSubject.getInt("id");
    string subject = belongSubject.getString("subject");
    /*
    open subject
     */
    handler.complete(true);
}

onMovement

文章详情页加了组稿模块,点击调用 onMovement API ,参数是一个json对象。取自文章接口 content.belong_composite 对象

feature-movement.png
onMovementParams
参数典型值类型备注
onMovementParams{}JSON组稿对象
json
{
  "belong_composite": {
    "id": 243350,
    "subject": "组稿组稿组稿组稿组稿组稿组稿组稿组稿",
    "subject_media": {
      "id": 352758,
      "path": "cms/medias/image/25/11/28/s8oQ7mt1xXeVI1F3gaMC4C2cU51EzV1knbvnwk8g.png",
      "width": 400,
      "height": 534
    },
    "modules": [
      {
        "id": 1012,
        "title": "动静1012",
        "mobile_media_id": 352753,
        "mobile_media": {
          "id": 352753,
          "name": "YqwYS6zHIOUZOWovYna0nuibNkdiUTw9yHmmQf73.gif",
          "path": "http://dev.cms.infzm.com/cms/medias/image/25/11/14/YqwYS6zHIOUZOWovYna0nuibNkdiUTw9yHmmQf73.gif",
          "width": 35,
          "height": 35,
          "type": "image"
        }
      }
    ],
    "published_at": "2025-11-28 10:21:04"
  }
}

onAuthorCard

点击本文作者模块中的“看看TA”按钮

参数

authorParams
参数典型值类型备注
authorParams{}JSON作者数据结构见数据结构

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onAuthorCard(Object authorParams, CompletionHandler<Boolean> handler) {
    JSONObject author = (JSONObject) authorParams;

    int id          = author.getInt("id");
    string name = author.getString("name");
    /*
    open subject
     */
    handler.complete(true);
}

onAuthorSub

订阅作者

参数

authorParams
参数典型值类型备注
authorParams{}JSON作者数据结构见数据结构

返回值

返回值典型值类型备注
truetrueBoolean

onAuthorUnsub

取消订阅作者

authorParams
参数典型值类型备注
authorParams{}JSON作者数据结构见数据结构

返回值

返回值典型值类型备注
truetrueBoolean

onFollowColumn

关注栏目

参数

followColumnParams
参数典型值类型备注
column_id152Number

返回值

返回值典型值类型备注
truetrueBoolean

onUnFollowColumn

取消关注栏目

unFollowColumnParams
参数典型值类型备注
column_id152Number

返回值

返回值典型值类型备注
truetrueBoolean

onSearch

打开文章标签,搜索页面

参数

title
参数典型值类型备注
title分类4String搜索关键字

返回值

返回值典型值类型备注
truetrueBoolean

示例

java
@JavascriptInterface
public void onSearch(String title, CompletionHandler<Boolean> handler) {
    /*
    open search
     */
    handler.complete(true);
}

onVoiceText

标题与正文内容,用于语音播放

参数

title
参数典型值类型备注
text分类4String标题与正文字符串

返回值

返回值典型值类型备注
truetrueBoolean

onDevice

设备信息、客户端版本

返回值

返回值典型值类型备注
jsondeviceJSONObject数据结构
json
{
  "platform"       : "android", //ios
  "client_version" : "6.7.0"
}

示例

java
@JavascriptInterface
public void onDevice(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
    JSONObject device = new JSONObject();
    device.put("platform", "android");
    handler.complete(device);
}

onConfig

用户自定义,系统设置。包含正文字体大小、字体样式、深色模式(夜间模式)、正文广告内容、广告显示开关。

前端初次调用该方法,返默认的数据结构。内容更新后客户端需要调用 notifyWebViewUpdated API,并传入 { "name": "config" } 参数,通知前端重新调用。

返回值

返回值典型值类型备注
jsonconfigJSONObject数据结构
json
{
  "fontSize"             : "normal", //小 small | 标准 normal | 大 large | 特大 xlarge
  "fontStyle"            : "system", //系统默认 system | 思源宋体 simsun | 霞鹜文楷 LXGWWenKai
  "nightMode"            : false,    //夜间模式 true | 浅色模式 false
  "topContentAdText"     : "广告",   //iPhone/Android 文章页顶通 S-T1
  "topContentAd"         : "http://dev.ad.infzm.com/medias/image/advertising/RXHdi9Zd8XFg5RoQXSM8ARFVCgUUiEjQwoCdsfVq.jpeg", //iPhone/Android 文章页顶通 S-T1
  "bottomContentAdText"  : "活动",   //iPhone/Android 文章页相关推荐上方 S-T2
  "bottomContentAd"      : "http://dev.ad.infzm.com/medias/image/advertising/RXHdi9Zd8XFg5RoQXSM8ARFVCgUUiEjQwoCdsfVq.jpeg", //iPhone/Android 文章页相关推荐上方 S-T2
  "afterRelationAdText"  : "",   // S-T3
  "afterRelationAd"      : "", // S-T3
  "showAd"               : true,      //显示广告 true
  "navAndStatusBarHeight": "64",      //64 个单位,网页内容顶部预留的高度
  "bottomBarHeight"      : "32",      //32 个单位,网页内容底部预留的高度
  "commentHookId"        : "748367" //评论ID ,表示当前文章要定位到评论模块,并高亮第一条评论
  "markNoteId"           : "123213", //划线笔记 ID ,表示当前文章要定位到划线笔记
  "featureConfig": {
    "enableMovementModule": false //文章中的组稿模块 不显示,默认为 true
  }
}

广告位

广告位置见 7.0 版本设计稿

数据字段广告位名称广告标识
topContentAdText/topContentAd文章页顶通S-T1
bottomContentAdText/bottomContentAd文章页相关推荐上方S-T2
afterRelationAdText /afterRelationAd相关推荐后方S-T3

示例

java
@JavascriptInterface
public void onConfig(Object _null, CompletionHandler<JSONObject> handler) throws JSONException {
    JSONObject config = new JSONObject();
    config.put("fontSize", "normal");
    handler.complete(config);
}