Last active
February 23, 2021 20:51
-
-
Save ryanbekabe/debc9fd7ff7d809a1ea657e7dc550c2b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function ($) { | |
$.fn.DuplicateWindow = function () { | |
var localStorageTimeout = (5) * 1000; // 15,000 milliseconds = 15 seconds. | |
var localStorageResetInterval = (1/2) * 1000; // 10,000 milliseconds = 10 seconds. | |
var localStorageTabKey = 'my-application-browser-tab'; //source: https://www.jqueryscript.net/other/check-duplicate-browser-tab-window.html | |
var sessionStorageGuidKey = 'browser-tab-guid'; //dep: https://code.jquery.com/jquery-3.3.1.slim.min.js | |
var ItemType = { | |
Session: 1, | |
Local: 2 | |
}; | |
function setCookie(name, value, days) { | |
var expires = ""; | |
if (days) { | |
var date = new Date(); | |
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); | |
expires = "; expires=" + date.toUTCString(); | |
} | |
document.cookie = name + "=" + (value || "") + expires + "; path=/"; | |
} | |
function getCookie(name) { | |
var nameEQ = name + "="; | |
var ca = document.cookie.split(';'); | |
for (var i = 0; i < ca.length; i++) { | |
var c = ca[i]; | |
while (c.charAt(0) == ' ') c = c.substring(1, c.length); | |
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); | |
} | |
return null; | |
} | |
function GetItem(itemtype) { | |
var val = ""; | |
switch (itemtype) { | |
case ItemType.Session: | |
val = window.name; | |
break; | |
case ItemType.Local: | |
val = decodeURIComponent(getCookie(localStorageTabKey)); | |
if (val == undefined) | |
val = ""; | |
break; | |
} | |
return val; | |
} | |
function SetItem(itemtype, val) { | |
switch (itemtype) { | |
case ItemType.Session: | |
window.name = val; | |
break; | |
case ItemType.Local: | |
setCookie(localStorageTabKey, val); | |
break; | |
} | |
} | |
function createGUID() { | |
this.s4 = function () { | |
return Math.floor((1 + Math.random()) * 0x10000) | |
.toString(16) | |
.substring(1); | |
}; | |
return this.s4() + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + '-' + this.s4() + this.s4() + this.s4(); | |
} | |
function TestIfDuplicate() { | |
//console.log("In testTab"); | |
var sessionGuid = GetItem(ItemType.Session) || createGUID(); | |
SetItem(ItemType.Session, sessionGuid); | |
var val = GetItem(ItemType.Local); | |
var tabObj = (val == "" ? null : JSON.parse(val)) || null; | |
console.log(val); | |
console.log(sessionGuid); | |
console.log(tabObj); | |
// If no or stale tab object, our session is the winner. If the guid matches, ours is still the winner | |
if (tabObj === null || (tabObj.timestamp < (new Date().getTime() - localStorageTimeout)) || tabObj.guid === sessionGuid) { | |
function setTabObj() { | |
//console.log("In setTabObj"); | |
var newTabObj = { | |
guid: sessionGuid, | |
timestamp: new Date().getTime() | |
}; | |
SetItem(ItemType.Local, JSON.stringify(newTabObj)); | |
} | |
setTabObj(); | |
setInterval(setTabObj, localStorageResetInterval);//every x interval refresh timestamp in cookie | |
return false; | |
} else { | |
// An active tab is already open that does not match our session guid. | |
console.log("hanyajasa.com => Sepertinya Ya multitab deh!"); | |
return true; | |
} | |
} | |
window.IsDuplicate = function () { | |
var duplicate = TestIfDuplicate(); | |
console.log("hanyajasa.com => Is Duplicate: "+ duplicate); | |
if (duplicate === true) { | |
console.log("hanyajasa.com => Ya multitab!"); | |
alert("Afwan....\nTidak boleh buka banyak tab ya!"); | |
window.location.replace('https://hanyajasa.com/?multitabgithubdeteksibukabanyaktab.js'); | |
}else{ | |
console.log("hanyajasa.com => Tidak multitab.");; | |
} | |
return duplicate; | |
}; | |
$(window).on("beforeunload", function () { | |
if (TestIfDuplicate() == false) { | |
SetItem(ItemType.Local, ""); | |
} | |
}) | |
} | |
$(window).DuplicateWindow(); | |
}(jQuery)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment