tencent-qqnews-user
Version:
用于在腾讯新闻客户端中进行登录、获取用户信息和提交请求等操作
170 lines (148 loc) • 4.78 kB
JavaScript
/**
* get script
* @param {*} url
* @param {*} callback
* @param {*} sid
*/
export const getScript = function (url, callback, sid) {
var head = document.getElementsByTagName('head')[0],
js = document.createElement('script');
js.setAttribute('type', 'text/javascript');
js.setAttribute('charset', 'UTF-8');
js.setAttribute('src', url);
sid && js.setAttribute('id', sid);
head.appendChild(js);
//执行回调
var callbackFn = function () {
if (typeof callback === 'function') {
callback();
}
};
if (document.all) {
//IE
js.onreadystatechange = function () {
if (js.readyState == 'loaded' || js.readyState == 'complete') {
callbackFn();
}
};
} else {
js.onload = function () {
callbackFn();
};
}
};
export const os = (function () {
if (typeof window === 'undefined') {
return {};
}
var userAgent = navigator.userAgent.toLowerCase();
let _version = 0;
if (/qqnews/.test(userAgent)) {
var qqnews_version = userAgent.match(
/(qqnews\/|qqnewslite\/)(\d+\.\d+\.\d+)/
);
var [major, minor, patch] =
qqnews_version && qqnews_version[2]
? qqnews_version[2].split('.')
: [0, 0, 0];
_version =
Math.floor(major) * 100 +
Math.floor(minor) +
Math.floor(patch) / 1000;
}
return {
androidversion: userAgent.substr(userAgent.indexOf('android') + 8, 3),
ipad: /ipad/.test(userAgent),
iphone: /iphone/.test(userAgent),
android: /android/.test(userAgent),
qqnews: /qqnews/.test(userAgent),
qqnewslite: /qqnewslite\//.test(userAgent), // 极速版
weixin: /micromessenger/.test(userAgent),
mqqbrowser: /mqqbrowser\//.test(userAgent), // QQ浏览器
qq: /qq\//.test(userAgent), // 手机QQ
tenvideo: /qqlivebrowser/.test(userAgent), // 腾讯视频
qqmusic: /qqmusic/.test(userAgent), //QQMUSIC
qqac: /qqac_client/.test(userAgent), // 腾讯动漫
qqnews_version: _version,
};
})();
export const cookie = {
// 写cookies
setCookie(name, value, day) {
let Days = day || 30;
let exp = new Date();
exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
document.cookie =
name + '=' + escape(value) + ';path=/;expires=' + exp.toGMTString();
},
// 读取cookies
getCookie(name, type = 0) {
let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)');
let arr = document.cookie.match(reg);
if (arr) {
return type ? arr[2] : unescape(arr[2]);
} else {
return '';
}
},
delCookie(name) {
let ex = new Date();
ex.setTime(ex.getTime() - 1);
document.cookie = name + '=; expires=' + ex.toGMTString() + ';path=/';
},
};
export const callbackRandom = (prefix = 'cb') => {
const date = new Date();
return `${prefix}${(date.getTime() + '').substr(-8)}_${(
Math.random() + ''
).substr(-8)}`;
};
export const jsonp = (url, data = {}, callback) => {
let target = document.getElementsByTagName('script')[0] || document.head;
let fetchCallBack = callbackRandom();
let timeout = 6000;
let script;
let timer;
let cleanup = () => {
if (script.parentNode) script.parentNode.removeChild(script);
window[fetchCallBack] = () => {};
if (timer) clearTimeout(timer);
};
// 将Object类型的数据转换为URL链接需要的参数
let paramObj = (params) => {
let str = '',
key,
item;
for (key in params) {
if (typeof params[key] === 'object') {
item = JSON.stringify(params[key]);
} else {
item = params[key];
}
str += `&${key}=${encodeURIComponent(item)}`;
}
return str.substring(1);
};
return new Promise((resolve, reject) => {
if (timeout) {
timer = setTimeout(() => {
cleanup();
reject(new Error(url + ' Timeout'));
}, timeout);
}
window[fetchCallBack] = (data) => {
cleanup();
resolve(data);
};
url +=
(~url.indexOf('?') ? '&' : '?') +
paramObj(data) +
'&callback=' +
fetchCallBack;
// create script
script = document.createElement('script');
script.src = url;
target.parentNode && target.parentNode.insertBefore(script, target);
script.onerror = reject;
});
};