arnaucube
arnaucube/class2contextPublic Self-hosted repository
class2context/class2context.js
class2context.jsRaw
  1/* class2context.js
  2creator: Arnau
  3July 2016
  4version: v0.1
  5
  6
  7usage:
  8class2context(
  9  'className',
 10  "title",
 11  [["option1", "functionoption1()"], ["option 2","functionoption2()"]]
 12);
 13*/
 14
 15/* testing this, not necessary
 16$( document ).ready(function() {
 17    $(document).on('contextmenu', function (e) {
 18        //e.preventDefault();
 19        ContextMenus();
 20    });
 21});*/
 22
 23
 24/* MUTATION OBSERVER
 25--detect changes in dom, and re-asign context menus*/
 26// select the target node //MUTATION DOM
 27var target = document.body;
 28var mutNum=0;
 29var observer = new MutationObserver(function(mutations) {
 30	console.log("class2context.js: mutation of dom, num." + mutNum);
 31	mutNum++;
 32    ContextMenus();
 33});
 34// configuration of the observer:
 35var config = { attributes: true, childList: true, characterData: true };
 36// pass in the target node, as well as the observer options
 37observer.observe(target, config);
 38/* </MUTATION OBSERVER */
 39
 40
 41//creates the div where the context menus will place
 42document.body.innerHTML+="<div id='contextMenus'></div>";
 43//
 44
 45function class2context(classgiv, title, options){
 46    classgiv=JSON.parse(JSON.stringify(classgiv));
 47    if(document.getElementById("context"+classgiv))
 48    {
 49        //toastr.success("alreadyExist");
 50    }else{
 51        var aux="";
 52        aux+="<div id='context"+classgiv+"' class='contextMenu'>";
 53        aux+="  <ul class='c2c-dropdown c2c-border' style='display:block;position:static;margin-bottom:5px;'>";
 54        aux+="<div class='contextTitle'>" + title + "</div>";
 55        for(var i=0; i<options.length; i++)
 56        {
 57            //aux+="    <a onmousedown='"+options[i][1]+";' href='javascript:void(0);'>"+options[i][0]+"</a>";
 58            aux+="    <a onmousedown='"+options[i][1]+"; ContextMenus();' href='javascript:void(0);'>"+options[i][0]+"</a>";
 59
 60        }
 61        aux+="  </ul>";
 62        aux+="</div>";
 63        document.getElementById('contextMenus').innerHTML+=aux; //adds the div context menu into the context menus div place
 64    }
 65
 66    for(var i=0; i<document.getElementsByClassName(classgiv).length; i++)
 67    {
 68        classgiv=JSON.parse(JSON.stringify(classgiv));
 69        //toastr.info(document.getElementsByClassName(classgiv)[i].oncontextmenu);
 70        document.getElementsByClassName(classgiv)[i].addEventListener("contextmenu", function(e){
 71            // Avoid the real one
 72            e.preventDefault();
 73            e.stopPropagation();
 74            setTimeout(function(){
 75                //classaux=this.className.split(" ")[0];
 76                document.getElementById('context'+classgiv).style.display='block';
 77                document.getElementById('context'+classgiv).style.left=e.pageX + "px";
 78                document.getElementById('context'+classgiv).style.top=e.pageY + "px";
 79            }, 150);
 80        });
 81
 82        /*document.getElementsByClassName(classgiv)[i].oncontextmenu+= function(e){
 83            // Avoid the real one
 84            e.preventDefault();
 85            setTimeout(function(){
 86                //classaux=this.className.split(" ")[0];
 87                document.getElementById('context'+classgiv).style.display='block';
 88                document.getElementById('context'+classgiv).style.left=e.pageX + "px";
 89                document.getElementById('context'+classgiv).style.top=e.pageY + "px";
 90            }, 150);
 91        };*/
 92    }
 93
 94    document.body.addEventListener("mousedown", function(e){
 95        // Avoid the real one
 96        //e.preventDefault();
 97        if(document.getElementById('context'+classgiv))
 98        {
 99            setTimeout(function(){
100                document.getElementById('context'+classgiv).style.display='none';
101            }, 70);
102            //ContextMenus();
103
104        }
105        return false;
106    }, false);
107
108}