Избегание Eval в вызове javascript к Pannellum

У меня есть веб-сайт, на котором я использую JavaScript и Pannellum API для загрузки нескольких 360 панорамных видов.

Иногда происходит сбой браузера, особенно когда на моем iPhone 6 в режиме VR, когда в разных DIV требуется всего шесть экземпляров паннеллума.

Насколько я могу судить, браузер дает сбой при вызове паннеллума, который я делаю изнутри функции eval, поскольку данные, которые я передаю паннеллуму, содержатся в переменной.

Вот вызов, плюс следующая строка, которая сообщает нам, что панорама загружена.

eval("RightPanoInt=pannellum.viewer('RightPanoIntermediary', " + PanoDataIntermediary +");");
RightPanoInt.on("load", function() { LoadedRightPanoIntermediary(); });

куда

RightPanoInt - это переменная, которую я могу использовать для проверки загрузки панорамы.

RightPanoIntermediary - это идентификатор DIV, в который должна быть загружена панорама.

а также

PanoDataIntermediary - это переменная, содержащая данные / параметры, необходимые для API Pannellum.

Например

{"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,"directionOnByDefault": false,"showControls": false," Panorama": "002.jpg"," Preview":"BackgroundPaleGreen.jpg"}

Данные будут другими при следующем вызове, поэтому параметры должны быть в переменной PanoDataIntermediary.

Какой альтернативный метод функции eval я могу использовать для того же вызова?

2 ответа

Хорошо, ответы выше заставили меня понять, что вместо использования переменной, я действительно должен использовать объект. Например...

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. Мне потребуется некоторое время, чтобы перефразировать мой существующий код, чтобы увидеть, решает ли он проблему сбоев браузера.

Еще раз спасибо.

Вы пробовали это (без 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 Вот. Я просто пытаюсь предложить некоторый контекст.

Надеюсь, это поможет.

Другие вопросы по тегам