繁体   English   中英

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

[英]Identify Unique JS Object on page

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

我用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(连接),该连接显示该用户的所有连接。 然后,我希望能够单击一个连接并打开另一个User项目,这可以正常工作,因为当打开第二个User项目并创建AdminPage的新实例时问题就出在哪里了,因为相同的脚本只是加载并具有相同的名称,它将覆盖前一个变量的JS变量。 然后影响几件事。 如果您关闭其中一个,则例如,如果您关闭了第一个已加载的,它也将关闭它右边的内容,但是childPage属性现在为空,因此不起作用。

所以现在开始提问。

有没有更好的方法来创建变量,或者有没有更好的方法根本不会导致这个问题?

我可以绕过Eval评估并让世界一切正常吗?

感谢您的任何建议。

因此,我找到了解决该问题的方法,但我还是不太喜欢。

我已经生成了一个唯一的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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM