避免在对Pannellum的javascript调用中使用Eval

时间:2018-12-05 09:04:02

标签: javascript eval pannellum

我有一个网站,我在其中使用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函数的哪种替代方法进行相同的调用?

2 个答案:

答案 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。我只是想提供一些背景信息。

希望有帮助。