diff --git a/src/disqus.js b/src/disqus.js index f40f89e..6757126 100644 --- a/src/disqus.js +++ b/src/disqus.js @@ -230,7 +230,7 @@ * The variable used in DisqusJS * * DisqusJS Mode - * disqusjs.mode = proxy | direct - Set which mode to use, should store and get in localStorage + * disqusjs.mode = dsqjs | disqus - Set which mode to use, should store and get in localStorage * * DisqusJS Config * disqusjs.config.shortname - The disqus shortname @@ -248,7 +248,12 @@ */ disqusjs.page = []; -disqusjs.mode = 'proxy'; + +window.disqus_config = function () { + this.page.url = disqusjs.config.url; + this.page.identifier = disqusjs.config.identifier; +}; + var xhr = new XMLHttpRequest(); setLS = (key, value) => { @@ -295,31 +300,15 @@ Date.prototype.Format = function (fmt) { return fmt; } -/* - * Name: getMode() - * Description: get mode from localstorage - */ - -function getMode() { - let s = getLS('disqusjs_mode'); - if (!s) { - // Run checkDisqus() when no localStorage item - // disqusjs.mode will be set in checkDisqus() - checkDisqus(); - } else { - disqusjs.mode = s; - } -} - /* * Name: loadDisqus() * Descriptin: load disqus as it should be. */ -function loadDisqus() { +loadDisqus = () => { var d = document; var s = d.createElement('script'); - s.src = '//' + disqusjs.config.shortname + '.disqus.com/embed.js'; + s.src = 'https://' + disqusjs.config.shortname + '.disqus.com/embed.js'; s.setAttribute('data-timestamp', + new Date()); (d.head || d.body).appendChild(s); } @@ -328,43 +317,59 @@ function loadDisqus() { * Name: checkDisqus() * Description: Check disqus is avaliable for visitor or not * How it works: check favicons under 2 domains can be loaded or not. -*/ -function checkDisqus() { + */ + +checkDisqus = () => { let domain = ['disqus.com', disqusjs.config.shortname + '.disqus.com'], test = 0, success = 0; + setmode = () => { if (success = test) { - disqusjs.mode = 'direct', - setLS('disqusjs_mode', 'direct'); + setLS('disqusjs_mode', 'disqus'); } else { - disqusjs.mode = 'proxy', - setLS('disqusjs_mode', 'proxy'); + setLS('disqusjs_mode', 'dsqjs'); } }; - check = (domain) => { - var img = new Image; - var checker = setTimeout(() => { - img.onerror = img.onload = null, - test++ , - setmode(); - }, 3000); + + var img = new Image; + let check1 = setTimeout(() => { + img.onerror = img.onload = null; + test = test + 1; + console.log(img.src + ' timeout') + setmode(); + }, 2000); + + img.onerror = () => { + clearTimeout(check1); + setLS('disqusjs_mode', 'dsqjs'); + main(); + }; + img.onload = () => { + clearTimeout(check1); + let check2 = setTimeout(() => { + img.onerror = img.onload = null; + test = test + 1; + console.log(img.src + ' timeout') + setmode(); + }, 2000); + img.onerror = () => { - clearTimeout(checker), - test++ , - setmode(); + clearTimeout(check2); + setLS('disqusjs_mode', 'dsqjs'); + main(); }; + img.onload = () => { - clearTimeout(checker), - success++ , - test++ , - setmode(); + clearTimeout(check2); + setLS('disqusjs_mode', 'disqus'); + main(); }; - img.src = 'https://' + domain + '/favicon.ico?' + +(new Date); - }; - for (let i of domain) { - check(i); + + img.src = 'https://' + disqusjs.config.shortname + '.disqus.com/favicon.ico?' + +(new Date); }; + + img.src = 'https://disqus.com/favicon.ico?' + +(new Date); } /* @@ -374,38 +379,7 @@ function checkDisqus() { * API URI: /3.0/threads/list.json?forum=[disqus_shortname]&thread=ident:[identifier]&api_key=[apikey] */ -function getThreadInfo() { - - /* - * Name: getComment() - * Description: get the comment content - * API URI: /3.0/posts/list.json?forum=[shortname]&thread=[thread id]&api_key=[apikey] - */ - - getComment = () => { - let url = disqusjs.config.api + '3.0/posts/list.json?forum=' + disqusjs.config.shortname + '&thread=' + disqusjs.page.id + '&api_key=' + disqusjs.config.apikey; - xhr.open('GET', url, true); - xhr.timeout = 4000; - xhr.send(); - xhr.onload = function () { - if (this.status == 200 || this.status == 304) { - var res = JSON.parse(this.responseText); - if (res.code === 0) { - getCommentList(res.response); - } else { - // Have error when get comments. - } - - } - }; - xhr.ontimeout = (e) => { - console.log(e) - }; - xhr.onerror = (e) => { - console.log(e) - }; - } - +getThreadInfo = () => { let url = disqusjs.config.api + '3.0/threads/list.json?forum=' + disqusjs.config.shortname + '&thread=ident:' + disqusjs.config.identifier + '&api_key=' + disqusjs.config.apikey; xhr.open('GET', url, true); xhr.timeout = 4000; @@ -430,12 +404,42 @@ function getThreadInfo() { }; } +/* + * Name: getComment() + * Description: get the comment content + * API URI: /3.0/posts/list.json?forum=[shortname]&thread=[thread id]&api_key=[apikey] + */ + +getComment = () => { + let url = disqusjs.config.api + '3.0/posts/list.json?forum=' + disqusjs.config.shortname + '&thread=' + disqusjs.page.id + '&api_key=' + disqusjs.config.apikey; + xhr.open('GET', url, true); + xhr.timeout = 4000; + xhr.send(); + xhr.onload = function () { + if (this.status == 200 || this.status == 304) { + var res = JSON.parse(this.responseText); + if (res.code === 0) { + getCommentList(res.response); + } else { + // Have error when get comments. + } + + } + }; + xhr.ontimeout = (e) => { + console.log(e) + }; + xhr.onerror = (e) => { + console.log(e) + }; +} + /* * Name: getCommentList(data) * Description: Render JSON to comment list components */ -function getCommentList(data) { +getCommentList = (data) => { var topLevelComments = []; var childComments = []; @@ -477,7 +481,7 @@ function getCommentList(data) { renderComment(commentLists) } -function renderComment(data) { +renderComment = (data) => { var disqusjsBaseTpl = `
@@ -513,7 +517,6 @@ function renderComment(data) { return; } - console.log(nesting < 4) if (nesting < 4) { var html = ''; @@ -577,12 +579,24 @@ function renderComment(data) { html += baidu.template(commentBodyTpl, comment) - html += `${childrenComments(s)} - `; + html += `${childrenComments(s)}`; document.getElementById('dsqjs-list').insertAdjacentHTML('beforeend', html); }) } +main = () => { + disqusjs.mode = getLS('disqusjs_mode'); + if (disqusjs.mode === 'disqus') { + loadDisqus(); + } else if (disqusjs.mode === 'dsqjs') { + getThreadInfo(); + } else { + // Run checkDisqus() when no localStorage item + // disqusjs.mode will be set in checkDisqus() + checkDisqus(); + } + +} -getThreadInfo(); \ No newline at end of file +main(); \ No newline at end of file