{"id":17260981,"url":"https://github.com/jeffwcx/ohu-share","last_synced_at":"2025-03-26T09:47:32.504Z","repository":{"id":57313888,"uuid":"123146249","full_name":"jeffwcx/ohu-share","owner":"jeffwcx","description":"JavaScript share plugin makes you (⊙o⊙) ","archived":false,"fork":false,"pushed_at":"2018-04-04T13:29:21.000Z","size":1177,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-04-25T22:43:25.230Z","etag":null,"topics":["cross-platform","javascript-plugin","social-share"],"latest_commit_sha":null,"homepage":"https://jeffwcx.github.io/ohu-share/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jeffwcx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-02-27T15:09:47.000Z","updated_at":"2018-06-21T01:27:30.000Z","dependencies_parsed_at":"2022-09-20T23:21:11.633Z","dependency_job_id":null,"html_url":"https://github.com/jeffwcx/ohu-share","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffwcx%2Fohu-share","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffwcx%2Fohu-share/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffwcx%2Fohu-share/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jeffwcx%2Fohu-share/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jeffwcx","download_url":"https://codeload.github.com/jeffwcx/ohu-share/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245632396,"owners_count":20647190,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-platform","javascript-plugin","social-share"],"created_at":"2024-10-15T07:49:44.126Z","updated_at":"2025-03-26T09:47:32.478Z","avatar_url":"https://github.com/jeffwcx.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ohu-share\n\n跨浏览器的分享插件，可优雅降级\n\n## 分享策略\n\n该分享插件秉持稳定，可靠的特点，可在PC端和移动端分别进行分享，移动端如果目标分享对象支持原生调用分享，那就进行原生分享，如果不支持，使用URL分享；PC端则一贯使用URL分享。\n\n![flowchart](./assets/flowchart.png)\n\n**分享目标**\n\n✅ 微信好友\n\n✅ 微信朋友圈\n\n✅ QQ好友\n\n✅ QQ空间\n\n✅ 微博\n\n**浏览器原生支持列表**\n\n✅ QQ浏览器 \n\n✅ UC浏览器 \n\n✅ 微信内置浏览器 \n\n✅ 百度浏览器\n\n✅ 百度APP\n\n✅ 搜狗浏览器\n\n❌ QQ内置浏览器（待支持）\n\n\n## 引入\n\n```\nnpm i -S ohu-share\n```\n```javascript\nimport { Share } from 'ohu-share'\n```\nor\n```html\n\u003cscript src=\"https://unpkg.com/ohu-share/dist/ohu-share.min.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  var share = new ohu.Share()\n\u003c/script\u003e\n```\n\n## API\n\n### new Share(shareData, config)\n\n初始化分享，主要是传入分享数据配置，及插件本身的配置\n\n```javascript\nconst share = new Share({\n  title: '简单例子',\n  desc: '简单的摘要和描述',\n  icon: '',\n  link: 'https://github.com/jeffwcx',\n  from: 'github',\n  wechat: { // option，未选定配置，通过share.setShareData可异步加载\n    appId: '',\n    timestamp: '',\n    nonceStr: '',\n    signature: ''\n  }\n}, {\n  dataset: '', // 可查看share.mount API\n  appMap: {}, // 可查看share.mount API\n  isSupport: function (supportType) {} // 可查看share.setSupport API\n})\n```\n\n### share.to(Apps.MOMENTS)\n\n单独APP分享接口\n\n```javascript\nimport { Apps } from 'ohu-share'\n\nshare.to(Apps.QQ)\n  .then(({ isSupport, supportType, context }) =\u003e {\n    // 根据以上变量自由进行降级处理\n  })\n  .catch((err) =\u003e {\n    // 处理错误\n  })\n```\n\n### share.on('share', successHandler, errorHandler)\n### share.mount(), share.mount({ dataset, appMap, el})\n\n多个元素分享\n\n```html\n\u003cbutton data-share=\"qq\"\u003eshare to QQ\u003c/button\u003e\n\u003cbutton data-share=\"qzone\"\u003eshare to QZone\u003c/button\u003e\n\u003cscript\u003e\n  share.on('share', function success (app, support, context) {\n    // support有两个参数： isSupport, supportType\n    // 可根据不同的APP分别进行处理\n  }, function error (err) {\n    // 处理错误\n  })\n  // 默认的dataset是‘data-share’\n  share.mount()\n  share.mount({\n    el: parentNode,\n    appMap: {\n      // 自定义分享的APP的名字，这里我们将wechatFriend对应到Apps.MOMENTS\n      // 所以我们可以通过`data-share=\"wechatFriend\"`分享到微信朋友圈\n      'wechatFriend': Apps.MOMENTS\n    },\n    // 更改分享的dataset属性名\n    // 设置为'share-to'之后，我们可以通过`\u003cbutton data-share-to=\"qq\"\u003e\u003c/button\u003e`分享到qq\n    dataset: 'share-to'\n  })\n\u003c/script\u003e\n```\n\n### share.setShareData(modifyShareDataFunc)\n\n设置分享数据\n\n```javascript\n// 可返回Promise，可用于动态加载Share数据（例如微信）\nshare.setShareData(function (shareData) {\n  return fetch('wechat/api')\n  .then((data) =\u003e {\n    return Promise.resolve({\n      then: function (resolve, reject) {\n        return data.json()\n      }\n    })\n  })\n  .then((data) =\u003e {\n    shareData.wechat = data\n  })\n})\n\n// 直接设置\nshare.setShareData(function (shareData) {\n  shareData.wechat = {\n    appId: appId,\n    timestamp: timestamp,\n    nonceStr: nonceStr,\n    signature: signature\n  }\n  return config\n})\n```\n\n### share.setSupport(func)\n\n定制返回的结果isSupport，以下为默认函数，你可查看下文的SUPPORT常量来决定你要如何定制函数\n\n```javascript\n// 定制isSupport属性\nshare.setSupport(function (supportType) {\n  return !(SUPPORT.LEVEL4 === supportType ||\n    SUPPORT.LEVEL7 === supportType)\n})\n```\n\n### share.setAppMap(appMap), share.setAppMap(newAppValue, Apps.MOMENTS)\n```javascript\nshare.setAppMap({\n  'wechatFriend': Apps.MOMENTS,\n  'timeline': Apps.MOMENTS, // 可重复设置\n  'webo': Apps.WEIBO\n})\n\nshare.setAppMap('QQ', Apps.QQ)\n\n```\n\n### 常量\n\n+ 浏览器常量\n\n```javascript\nimport { Browsers } from 'ohu-share'\n\nBrowsers.UC // 'uc'\n```\nor\n\n```html\n\u003cscript\u003e\n  var Browsers = ohu.Browsers\n  Browsers.UC // 'uc'\n\u003c/script\u003e\n```\n\n```javascript\n{\n  QQBROWSER: 'qqbrowser',\n  UC: 'uc',\n  BAIDUBROWSER: 'baidubrowser',\n  BAIDU: 'baidu',\n  QQ: 'qq',\n  WECHAT: 'wechat',\n  LIEBAO: 'liebao',\n  SOGOU: 'sogou'\n}\n```\n\n+ APP名称常量\n\n```javascript\nimport { Apps } from 'ohu-share'\n\nApps.WECHAT // 'wechat'\n```\nor\n\n```html\n\u003cscript\u003e\n  var Apps = ohu.Apps\n  Apps.WECHAT // 'wechat'\n\u003c/script\u003e\n```\n\n```javascript\n{\n  WECHAT: 'wechat',\n  MOMENTS: 'moments',\n  QQ: 'qq',\n  QZONE: 'qzone',\n  WEIBO: 'weibo'\n}\n```\n+ 支持类型常量\n\n```javascript\nimport { SUPPORT } from 'ohu-share'\n\nSUPPORT.LEVEL1 // 0 支持自定义分享和单独唤起APP\n```\nor\n\n```html\n\u003cscript\u003e\n  var SUPPORT = ohu.SUPPORT\n  SUPPORT.LEVEL1  // 0 支持自定义分享和单独唤起APP\n\u003c/script\u003e\n```\n各个支持等级的解释\n\n```javascript\n{\n  /**\n   * 最好的支持类型，支持自定义分享和单独唤起APP，例如QQ浏览器\n   */\n  LEVEL1: 0,\n  /**\n   * 支持自定义分享，但只能唤起分享面板，例如百度浏览器\n   */\n  LEVEL2: 1,\n  /**\n   * 不支持自定义分享（或者支持有残缺），支持单个唤起应用，例如UC浏览器\n   */\n  LEVEL3: 2,\n  /**\n   * 支持自定义分享，但不支持唤起，例如微信内置浏览器\n   */\n  LEVEL4: 3,\n  /**\n   * 支持scheme\n   */\n  LEVEL5: 4,\n  /**\n   * 支持url\n   */\n  LEVEL6: 5,\n  /**\n   * 不支持任何形式的分享\n   */\n  LEVEL7: 6\n}\n```\n\n## Examples\n\n1. [简单例子](https://jeffwcx.github.io/ohu-share/examples/)\n2. [复杂例子](https://jeffwcx.github.io/ohu-share/examples/user-define.html)\n\n## TODO\n+ 使用async/await api\n+ 定制分享策略\n+ vue组件\n\n## 一些你需要了解的坑\n\n1. UC ios浏览器上分享，其自有变量`ucbrowser`在`DOMContentLoaded`或者是`load`事件触发时为`undefined`，据我测算大概在50ms后`ucbrowser`不为`undefined`\n\n2. 百度浏览器，百度APP，UC浏览器，微信内置浏览器均不支持启动外部协议（location.href不起作用）\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffwcx%2Fohu-share","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjeffwcx%2Fohu-share","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjeffwcx%2Fohu-share/lists"}