在页面上识别唯一的JS对象

时间:2016-11-08 15:35:22

标签: javascript jquery

这有点难以描述但是这里有。我正在构建一个类似于Azure后端的页面,用户从左侧的菜单中选择加载项目的页面,在其右侧称为AllUsers。从AllUsers中有该项目的选项,其中一些可能会在其左侧加载另一个项目,我们将调用该用户。从用户可以打开更多项目。

我使用类似

的JS对象很好地设置了它
var AdminPage=function(){
    this.con="../controllers/admin/admin_con.php";
    this.pageName=null;
    this.childPage=null;
    this.page=null;

    this.deleteItem=function(){
        //Recursively deletes pages to the right
        if(this.childPage){
            this.childPage.delete();
            this.childPage=null;
        }
        if(this.page){
            this.page.remove();
        }
        return this;
    }

    this.add=function(pageData){
        if(this.childPage){
            this.deleteItem();
        }

        this.childPage=new AdminPage();
        this.childPage.getPage(pageData);

        return this;
    };

    this.getPage=function(pageData){
        var that=this;

        this.pageName=pageData.page;

        $.post(this.con, pageData,
            function(data,status){
                if(status==='success'){
                    $("#rightCol").append(data);
                    var num=$("#rightCol").children().length;
                    that.page=$("#rightCol").children()[num-1];
                    eval(pageData.page+"=that");
                }
            }
        );

        return this;
    };

}

因此,每次添加页面时,它都会为该项目创建一个新的对象实例。如果该项目被删除,它也会递归删除它右侧的所有项目。

“eval(pageData.page +”= that“);”是的,我现在认为eval是邪恶的,已经阅读了所有相关内容,从已添加的项目名称创建一个新的变量名称。该项目表示User项目甚至在需要调用其脚本实例时使用该变量。这一切都非常完美。

如果失败的是User项打开另一个,请将其称为Connections,显示该用户的所有连接。然后,我希望能够单击一个连接并让它打开另一个用户项,这样就可以解决第二个用户项打开时的问题,并创建一个新的AdminPage实例,因为同一个脚本只是加载并具有与前一个JS变量相同的名称。然后影响几件事。如果你关闭其中一个,它会关闭两个例如,如果你关闭第一个加载它应该关闭它右边的内容但是childPage属性现在是空的,所以这不起作用。

所以现在问题..

是否有更好的方法来处理创建变量,或者是否有更好的方法可以完全解决这个问题?

我可以使用Evil eval,让世界上的一切正确吗?

感谢你提出的任何建议。

1 个答案:

答案 0 :(得分:0)

所以我找到了问题的答案,但我仍然不喜欢它。

我已经生成了一个唯一的id,并将其附加到我用作变量的脚本名称的末尾。

这个方法的问题是它仍然使用eval,现在我必须在获取新项目时传递变量往返,以便我可以使用php将变量名称注入页面。

不完美,必须有更好的方法。

这是更新的添加功能

this.add=function(pageData){
    if(this.childPage){
        this.deleteChildren();
    }

    this.childPage=new AdminPage();

    this.childPage.id=pageData.page+"_"+(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000);
    eval(this.childPage.id+"=this.childPage");

    this.childPage.getPage(pageData);

    return this;
};