如何查看iframe的410状态?

时间:2017-11-17 11:07:00

标签: javascript jquery ajax iframe http-status-code-410

我正在构建一个页面,该页面使用Slideshare API从特定的Slideshare用户中提取一组有限的演示文稿,并输出一系列嵌入了这些演示文稿的iframe。

在大多数情况下,页面按预期工作,但最近删除了API调用的一个演示文稿,因此当页面加载iframe时,浏览器返回410.遗憾的是,XML中没有对象由Slideshare返回,可用于确定该特定演示文稿是否已被删除。

因此,我想在将特定iframe添加到页面之前检查410错误。让我感到困难的是,在进行API调用时不会出现错误,而是在嵌入的iframe加载时出现,因此我不知道在何处或如何进行相应的检查。

以下是相关代码:

$.ajax({
url: slideShareURL,
dataType: 'XML',
success: function(data) {
    var allSlides = x2js.xml2json(data);
    allSlides = allSlides.User.Slideshow;
    for (i = 0; i < allSlides.length; i++) {
        document.getElementById('slides').innerHTML += allSlides[i].Embed;
    }
}
});

注意:

  • slideShareURL是使用API​​
  • 在代码中定义的
  • 我正在使用xml2json.js将从API接收的XML转换为json对象
  • allSlides是一个演示文稿数组,每个演示文稿都包含一组对象,如幻灯片标题,ID,下载URL等。
  • Embed是包含完整iframe嵌入代码的对象

编辑:Christophe在下面提供的答案几乎是完美的,但我必须添加一个闭包,以使第二个ajax调用在for循环中工作。

2 个答案:

答案 0 :(得分:1)

嗯,这个解决方案怎么样:

public function loginAction(Request $request)
{
    $frame = $this->createFrame();
    try {
        try {
            $user = $this->get('secure.user_provider')->loadUserByUsername($request->get('_username'));
        } catch (UsernameNotFoundException $exception) {
            $frame->setError($exception);

            return $frame;
        }
        $token = new UsernamePasswordToken($user, null, 'webapi', $user->getRoles());
        $this->get('security.token_storage')->setToken($token);
        $event = new InteractiveLoginEvent($request, $token);
        $this->get('event_dispatcher')->dispatch('security.interactive_login', $event);


        $authenticationUtils = $this->get('security.authentication_utils');
        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();

        if ($error) {
            $frame->setError(true, Errno::GENERAL_BAD_CREDENTIALS, [$error->getMessage()]);
        }
    } catch (\Exception $e) {
        $frame->setException($e);
    }

    return $frame;
}

答案 1 :(得分:0)

Christophe提供的答案让我走上正轨,但是在for循环中正确运行第二个ajax调用是不可能的。经过一些研究后,我了解了闭包,并提出了以下建议:

$.ajax({
    url: slideShareURL,
    dataType: 'XML',
    success: function(data) {
        var allSlides = x2js.xml2json(data);
        allSlides = allSlides.User.Slideshow;

        for (i = 0; i < allSlides.length; i++) {

        (function(i) {
                var slideURL = allSlides[i].SlideshowEmbedUrl;
                $.ajax({
                    url: slideURL,
                    success: function () {
                        document.getElementById('slides').innerHTML += allSlides[i].Embed;
                    },
                    error: function () {
                        console.log('Failed to load');
                    }
                })
            })(i);
        }
    }
});