Событие SWFObject, не определенное в Chrome, работает в IE

Я хочу получить текущий кадр моего Flash-ролика при его загрузке. Я следовал руководству, найденному здесь http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/index.html и SWFOBJECT CurrentFrame Javascript. Я использую бета-версию SWFObject 2.3. Это прекрасно работает в Internet Explorer, но не работает в Google Chrome.

В Chrome я получаю сообщение об ошибке

Uncaught TypeError: e.ref.currentFrame is not a function

Проверка e возвращает [object Object] Проверка e.ref возвращает [object HTMLObjectElement] Проверка e.ref.totalFrames возвращает undefined

var flashvars = {};
var params = {};
var attributes = {};
function mycall(e){
    setInterval(function(){console.log("Frame: " + e.ref.currentFrame)},1000);
}
swfobject.embedSWF("notmyswf.swf", "course", "100%", "100%", "6.0.0", false, flashvars, params, attributes, mycall);

Почему это не работает в Chrome, но хорошо работает в IE? Событие e не обнаружено? Есть ли обходной путь, как заставить это работать в Chrome?

Цель этого для меня состоит в том, чтобы создать проверку, действительно ли пользователь использует курс, который он открыл, а не просто оставляет его бездействующим. Я уже добавил код, который будет проверять холостой ход, но этого недостаточно. Большинство учащихся нашли способ просто открыть курс и оставить его там, чтобы накапливать часы обучения. У некоторых даже есть программа, работающая на их компьютерах, которая просто перемещает мышь на 1 пиксель каждые несколько секунд, чтобы компьютер не простаивал. Если я могу проверить текущий кадр Flash-ролика, я могу создать функцию, которая будет вычислять текущую страницу, просматриваемую пользователем каждые 15 минут. Если он застрял на той же странице, я могу показать подсказку, которую пользователь должен щелкнуть, чтобы продолжить просмотр курса, иначе он автоматически закроется.


person Keith Leyson    schedule 28.02.2017    source источник
comment
e.ref — это ссылка на сам SWF. Он кроссбраузерный. Когда вы говорите, что проверка e.ref.totalFrames возвращает undefined, в какой момент вы проверяете? Внутри функции setInterval или непосредственно в функции mycall?   -  person pipwerks    schedule 28.02.2017
comment
Кроме того, что происходит в Firefox и Safari (если вы работаете на Mac)?   -  person pipwerks    schedule 28.02.2017
comment
Еще один вопрос. :) Это курс на основе SCORM? Произведено Captivate или Articulate?   -  person pipwerks    schedule 28.02.2017
comment
Я проверяю e.ref.totalFrames и e.ref.currentFrame() внутри setInterval, так как при запуске это значение еще недоступно, пока не загрузится Flash-ролик.   -  person Keith Leyson    schedule 28.02.2017
comment
Курс имеет внутреннюю поддержку функциональности SCORM, и он отлично работает. Однако эта функциональность, которую я добавляю, предназначена для поддержки обычного веб-сервера PHP, который мы используем. По сути, в курсе есть устаревшие функции отправки и загрузки для одновременного сохранения и извлечения данных из базы данных MySQL, код для отправки и извлечения данных из javascript (на самом деле я использовал вашу идею с вашего сайта :))   -  person Keith Leyson    schedule 28.02.2017
comment
Мы используем Flash CS6 и сделали все с нуля. Это было в 2002 году, и мы ранее перешли с Macromedia Director на Flash. Наша компания раньше не знала о Captivate или Articulate. Сейчас мы также постепенно переходим на HTML5 с помощью Adobe Edge Animate. Все еще не Captivate или Articulate.   -  person Keith Leyson    schedule 28.02.2017
comment
Предполагая, что курс сохраняет закладку каждый раз, когда страница/слайд продвигается вперед, поместите свой таймер на вызовы БД вместо проверки currentFrame. Это сохраняет чистоту JS, и если кто-то не выполнил фиксацию в течение x минут, вы можете отобразить свое предупреждение о бездействии.   -  person pipwerks    schedule 28.02.2017
comment
Я понимаю. Это хороший вариант. Однако я забыл упомянуть, что есть также таймер автоматического сохранения каждые 3 минуты. Таким образом, каждые 3 минуты сохраняется прогресс пользователя. Вот почему я искал currentFrame, чтобы сравнить его с кадром предыдущего сохранения. Если кадр предыдущего сохранения совпадает с текущим кадром через 15 минут, то пользователь не перешел с этой страницы за это время, и я могу отобразить сообщение Вы все еще просматриваете курс? сообщение.   -  person Keith Leyson    schedule 28.02.2017
comment
TypeError: e.ref.currentFrame is not a function Я получаю ту же ошибку в Firefox, что и в Chrome. IE11 отлично работает. вот несколько скриншотов ссылка ссылка   -  person Keith Leyson    schedule 28.02.2017


Ответы (2)


Я предлагаю отказаться от подхода currentFrame на основе SWF в пользу мониторинга ваших обращений к базе данных с помощью JavaScript. (Исходя из ваших комментариев, похоже, что вызовы БД отправляются JS, так что это не должно быть проблемой.)

Если закладка курса автоматически сохраняется каждые 3 минуты (как описано в ваших комментариях), вы можете кэшировать значение в JS своей страницы и выполнять сравнение каждый раз, когда выполняется сохранение. Если значение не изменилось в течение x минут, вы можете отобразить предупреждение о тайм-ауте.

Если вы используете оболочку SCORM (или аналогичную), это очень просто: просто измените оболочку, включив в нее свой код таймера. Что-то вроде:

//Old code (pseudocode, not tested)
function setBoomark (val){
    API.SetValue("cmi.core.lesson_location", val);
}

//New code (pseudocode, not tested)
var current_location = "";

var activityTimer;

function disableCourse(){
    //do stuff to disable course because it timed out
}

function setBoomark (val){
    API.SetValue("cmi.core.lesson_location", val);
    if(val === current_location){
        //do nothing, timer keeps ticking
    } else {
        //reset timer using new bookmark value
        if(activityTimer){ clearTimeout(activityTimer); }
        activityTimer = setTimeout(disableCourse, 15000);
        //Update current_location value
        current_location = val;
    }
}

Это грубый набросок, но, надеюсь, вы уловили идею.

person pipwerks    schedule 28.02.2017
comment
Я тоже попробую. В настоящее время я использую урок_локации для текущей страницы, на которой находится пользователь. Я проверю это. Благодарю вас! - person Keith Leyson; 28.02.2017

Я чувствую себя глупо!

Это не работало в Chrome и Firefox, потому что я использовал неправильный регистр для функций, но в IE11 это работает в любом случае.

Итак, правильные функции:

e.ref.CurrentFrame() //I used currentFrame() which still works in IE11
e.ref.TotalFrames() //I used totalFrames() which still works in IE11
e.ref.PercentLoaded() //I used this correctly and was able to get the value
person Keith Leyson    schedule 28.02.2017