如何用javascript和HTML解决这个对象加载问题
我正在开发一个web应用程序,目前我正在使用javascript。我试图解决的问题是,我有三个不同的对象,只有一个HTML页面。根据用户单击事件,我希望所选类别的对象加载并显示在同一页面上。例如,假设用户在主页上,如果他们从导航栏中单击category A,则首先加载页面,然后脚本将对象加载到数据结构中。最后,将它们显示到javascript生成的HTML容器中。在触发用户单击事件后,其他类别也会发生同样的情况。更确切地说,我希望能够为不同的对象重用HTML页面,而不必为每个类别创建页面 我已经为我想要加载的n个对象创建了执行所有数据加载和HTML生成的代码。当我在对象的页面上时,代码工作正常,但是如果事件是从另一个页面触发的,则似乎什么也没有发生。我猜这与页面加载时间有关 我已经发布了我正在处理的部件的完整代码如何用javascript和HTML解决这个对象加载问题,javascript,html,Javascript,Html,我正在开发一个web应用程序,目前我正在使用javascript。我试图解决的问题是,我有三个不同的对象,只有一个HTML页面。根据用户单击事件,我希望所选类别的对象加载并显示在同一页面上。例如,假设用户在主页上,如果他们从导航栏中单击category A,则首先加载页面,然后脚本将对象加载到数据结构中。最后,将它们显示到javascript生成的HTML容器中。在触发用户单击事件后,其他类别也会发生同样的情况。更确切地说,我希望能够为不同的对象重用HTML页面,而不必为每个类别创建页面 我已经
var dataController = (function() {
var JSONurls = {
bags: "../JSON/bags.json",
bc: "../JSON/briefcases.json",
belts: "../JSON/belts.json",
accs: "../JSON/accs.json",
};
ProductObj = function(name, des, colors, price, pics, type, ID) {
this.name = name;
this.description = des;
this.colors = colors;
this.price = price;
this.pics = pics;
this.type = type;
this.ID = ID;
};
var dataStruc = {
allProducts: {
bags: [],
briefcases: [],
belts: [],
accessories: [],
},
};
return {
addProd: function(obj) {
var newProd, ID;
if (dataStruc.allProducts[obj.type].length > 0) {
ID =
dataStruc.allProducts[obj.type][
dataStruc.allProducts[obj.type].length - 1
].ID + 1;
} else {
ID = 0;
}
newProd = new ProductObj(
obj.name,
obj.description,
obj.colors,
obj.price,
obj.pics,
obj.type,
obj.ID
);
dataStruc.allProducts[obj.type].push(newProd);
return newProd;
},
getDataStruct: function() {
return dataStruc;
},
getJsonUrls: function() {
return JSONurls;
},
loadJSON: function(url, cat, callback) {
var requestURL, request, JsonObj;
requestURL = url;
request = new XMLHttpRequest();
request.open("GET", requestURL);
request.responseType = "text";
request.send();
request.onload = function() {
JsonObj = JSON.parse(request.response);
dataStruc.allProducts[cat] = JsonObj[cat];
callback(cat);
};
},
};
})();
var UIcontroller = (function() {
var DomStrings = {
shopCatg: ".shop-catg",
productCont: ".product-container",
};
//public methods
return {
// function display the object based on the category based on the event target
displayObjectToPage: function(cat) {
var deafultHtml;
// 1. loop over the product category
dataController.getDataStruct().allProducts[cat].forEach(function(cur) {
deafultHtml =
'<div class="col-lg-4 col-md-6 col-sm-10">' +
'<img class="img-fluid" src="../img/' +
cur.type +
"/" +
cur.pics[0] +
'.jpg">' +
'<h6 class="text-center">' +
cur.name +
"</h6>" +
'<div class="text-center text-muted">' +
cur.price +
"</div>" +
"</div>";
document
.querySelector(DomStrings.productCont)
.insertAdjacentHTML("beforeend", deafultHtml);
});
},
getDomStrings: function() {
return DomStrings;
},
};
})();
var mainController = (function(UIctrl, dataCrtl) {
var setUpEvents = function() {
var doneLoading = false;
var DOM = UIctrl.getDomStrings();
document.querySelector(DOM.shopCatg).addEventListener("click", function() {
InitializeData(event, function(cat) {
UIcontroller.displayObjectToPage(cat);
});
});
};
InitializeData = function(event, callback) {
var category = event.target.textContent;
if (event.target.textContent === "bags") {
dataController.loadJSON(
dataController.getJsonUrls().bags,
category,
callback
);
} else if (event.target.textContent === "briefcases") {
dataController.loadJSON(dataController.getJsonUrls().bags, "briefcases");
} else if (event.target.textContent === "belts") {
dataController.loadJSON(dataController.getJsonUrls().bags, "belts");
} else {
dataController.loadJSON(dataController.getJsonUrls().bags, "accs");
}
};
displayObject = function() {};
return {
init: function() {
setUpEvents();
},
};
})(UIcontroller, dataController);
mainController.init();
var-dataController=(函数(){
var JSONurls={
bags:“../JSON/bags.JSON”,
bc:“../JSON/briefcases.JSON”,
皮带:“../JSON/belts.JSON”,
accs:“../JSON/accs.JSON”,
};
ProductObj=函数(名称、des、颜色、价格、图片、类型、ID){
this.name=名称;
this.description=des;
这个。颜色=颜色;
这个价格=价格;
this.pics=pics;
this.type=type;
this.ID=ID;
};
变量数据结构={
所有产品:{
行李:[],
公文包:[],
皮带:[],
附件:[],
},
};
返回{
addProd:功能(obj){
var newProd,ID;
if(dataStruc.allProducts[obj.type].length>0){
身份证=
dataStruc.allProducts[对象类型][
dataStruc.allProducts[obj.type].长度-1
].ID+1;
}否则{
ID=0;
}
newProd=newproductobj(
对象名称,
对象描述,
对象颜色,
对象价格,
obj.pics,
对象类型,
对象ID
);
dataStruc.allProducts[obj.type].push(newProd);
返回newProd;
},
getDataStruct:function(){
返回数据结构;
},
getJsonUrls:function(){
返回JSONurls;
},
loadJSON:函数(url、cat、回调){
var requestURL,request,JsonObj;
requestURL=url;
请求=新的XMLHttpRequest();
打开(“GET”,requestURL);
request.responseType=“text”;
request.send();
request.onload=函数(){
JsonObj=JSON.parse(request.response);
dataStruc.allProducts[cat]=JsonObj[cat];
回调(cat);
};
},
};
})();
var UIcontroller=(函数(){
var DomStrings={
shopCatg:“.shopCatg”,
productCont:“.产品容器”,
};
//公共方法
返回{
//函数根据事件目标的类别显示对象
DisplayObjectTopPage:功能(cat){
var死亡TML;
//1.在产品类别上循环
dataController.getDataStruct().allProducts[cat].forEach(函数(cur){
致命的=
'' +
'' +
'' +
当前名称+
"" +
'' +
当前价格+
"" +
"";
文件
.querySelector(DomStrings.productCont)
.insertAdjacentHTML(“结束前”,死亡TML);
});
},
getDomStrings:function(){
返回字符串;
},
};
})();
var mainController=(函数(UIctrl、dataCrtl){
var setUpEvents=函数(){
var doneLoading=false;
var DOM=UIctrl.getDomStrings();
document.querySelector(DOM.shopCatg).addEventListener(“单击”,函数(){
初始化数据(事件、函数(cat){
UIcontroller.DisplayObjectTopPage(cat);
});
});
};
InitializeData=函数(事件、回调){
var category=event.target.textContent;
如果(event.target.textContent==“行李”){
dataController.loadJSON(
dataController.getJsonUrls().bags,
类别
回拨
);
}else if(event.target.textContent==“公文包”){
loadJSON(dataController.getJsonUrls().bags,“公文包”);
}else if(event.target.textContent==“皮带”){
loadJSON(dataController.getJsonUrls().bags,“belt”);
}否则{
dataController.loadJSON(dataController.getJsonUrls().bags,“accs”);
}
};
displayObject=function(){};
返回{
init:function(){
setUpEvents();
},
};
})(UIcontroller,数据控制器);
mainController.init();
我不确定,但我注意到了这个潜在问题:
request.send();
request.onload = function() {
// ...
}
我相信当您调用send
时,请求应该异步启动。如果请求在分配onload
之前返回,您可能会看到它被跳过。不过,我已经好几年没有直接使用XHR了
通常,在调用send()
之前,您希望添加onload
回调以避免此问题
我还注意到回调函数的参数中缺少
事件
:
▽
document.querySelector(DOM.shopCatg).addEventListener("click", function() {
▽ event is undefined
InitializeData(event, function(cat) {
UIcontroller.displayObjectToPage(cat);
});
});
我不确定,但我注意到了这个潜在的问题:
request.send();
request.onload = function() {
// ...
}
我相信当您调用send
时,请求应该异步启动。如果请求在分配onload
之前返回,您可能会看到它被跳过。不过,我已经好几年没有直接使用XHR了
通常,在调用send()
之前,您希望添加onload
回调以避免此问题
我还注意到回调函数的参数中缺少
事件
:
▽
document.querySelector(DOM.shopCatg).addEventListener("click", function() {
▽ event is undefined
InitializeData(event, function(cat) {
UIcontroller.displayObjectToPage(cat);
});
});
对于React/Vue/Svelte这样的工具来说,这种类型的东西是一个完美的用例