我有一个网站,我在其中使用javascript和pannellum API加载多个360度全景视图。
有时浏览器崩溃,尤其是在我的iPhone 6上以VR模式运行时,不同DIV中总共需要六个Pannellum实例。
据我所知,由于我传递给pannellum的数据包含在一个变量中,因此我在eval函数内部对pannellum的调用导致浏览器崩溃。
这里是电话,加上下一行让我们知道全景图已加载。
eval("RightPanoInt=pannellum.viewer('RightPanoIntermediary', " + PanoDataIntermediary +");");
RightPanoInt.on("load", function() { LoadedRightPanoIntermediary(); });
哪里
RightPanoInt是我可以用来检查全景图是否已加载的变量
RightPanoIntermediary是要加载全景图的DIV的ID。
和
PanoDataIntermediary是一个变量,其中包含Pannellum API需要的数据/参数。
例如
{“ autoLoad”:true,“ pitch”:0,“ yaw”:73,“ vaov”:180,“ haov”:360,“ vOffset”:0,“ maxPitch”:90,“ minPitch”: -90,“ maxYaw”:180,“ minYaw”:-180,“ maxHfov”:100,“ hfov”:100,“ minHfov”:10,“ showFullscreenCtrl”:false,“ orientationOnByDefault”:false,“ showControls”: false,“ panorama”:“ 002.jpg”,“ preview”:“ BackgroundPaleGreen.jpg”}
下次调用时数据将不同,因此参数必须在PanoDataIntermediary变量中。
我可以使用eval函数的哪种替代方法进行相同的调用?
答案 0 :(得分:1)
好的,上面的回答使我意识到,我实际上应该使用对象而不是使用变量。例如...
var PanoDataIntermediary={"type":"equirectangular"}; // to initiate
PanoDataIntermediary.panorama="Church_HDR_x4_000.jpg"; // to add more parameters
PanoDataIntermediary.autoLoad = true;
PanoDataIntermediary.pitch=0;
PanoDataIntermediary.yaw=73;
PanoDataIntermediary.hoav=360; // etc
RightPanoInt=pannellum.viewer('panorama', PanoDataIntermediary);
这无需使用eval就可以工作。我需要花一些时间来重新整理我现有的代码,以查看它是否可以解决浏览器崩溃的问题。
再次感谢。
答案 1 :(得分:0)
您是否尝试过此操作(没有eval
)?
var RightPanoInt = pannellum.viewer('RightPanoIntermediary', PanoDataIntermediary);
根据您的问题,PanoDataIntermediary
是一个保存数据的变量。您需要eval
的唯一原因是,PanoDataIntermediary
仅持有保存数据的另一个变量的名称。
此外,语句eval("RightPanoInt=pannellum.viewer('RightPanoIntermediary', " + PanoDataIntermediary +");");
将PanoDataIntermediary
对象视为一个字符串,但它不是一个字符串,因此不能将其串联为一个字符串。这可能会导致您的浏览器崩溃。至少,它引发了异常。
eval的示例用法:
var myVariable = {a: 1, b:2, c:'test'};
var myVariableName = 'myVariable';
alert(eval(myVariableName).c);
注意:我在这里不提倡使用eval
。我只是想提供一些背景信息。
希望有帮助。