热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在页面上多次使用iframe时出现问题

如何解决《在页面上多次使用iframe时出现问题》经验,如何解决这个问题?

我正在创建一个quickview功能,您可以在其中直接在将打开的模式中查看产品列表中每个项目的内容.

在模态中有一个用Javascript动态生成的框架,我放置了我的控制器的url来呈现模态内容(这样的url http://localhost/quickview/product/view/id/18564/).

当模态关闭时,我删除模态内容,当用户想要在同一页面上看到另一个产品的内容时,我使用Javascript重新生成iframe元素并显示.

问题是,在第一个模态视图之后,iframe会再次加载并显示内容,但是在iframe中运行的Javascript(我们在产品内容中有一个图库)不起作用.在画廊前面的第二次尝试之后不久,使用Javascript的所有其他行为都不起作用,尽管来自控制器的模态,iframe和内容都是正确的.

我已经尝试重新加载相同的iframe(不破坏它)并再次显示它,我试图创建id与每个模态视图不同的iframe,但我无法解决它一次.我在Javascript下面用来生成模态和iframe.我不相信的控制器是相关的(每当我打开新标签中的内容的网址时,一切都完美无缺,并且每次我打开模态时都独立于产品,一切都在模态中正确加载).

var ProductInfo = Class.create();
ProductInfo.prototype = {
    settings: {
        'loadingMessage': 'aguarde ...',
        'viewport': document.viewport.getDimensions()
    },

    idframe: 'quick-frame',

    initialize: function(selector, x_image, settings) {
        Object.extend(this.settings, settings);
        this.createWindow();

        var that = this;
        $$(selector).each(function(el, index){
            el.observe('click', that.loadInfo.bind(that));
        })

    },

    createLoader: function() {
        var loader = new Element('div', {id: 'pleaseWaitDialog'});
        var imgLoader = new Element('img', {src: '/js/inovarti/ajax-loader.gif', alt: this.settings.loadingMessage, id: 'loading-quickview-img'});
        var cOntentLoader= new Element('p', {class: 'loader'});

        contentLoader.setStyle({
            'display': 'block',
            'margin-top': (this.settings.viewport.height/2 - contentLoader.getHeight()/2)+'px',
            'text-align': 'center'
        });

        contentLoader.appendChild(imgLoader);
        loader.appendChild(contentLoader);
        document.body.appendChild(loader);

        $('pleaseWaitDialog').setStyle({
            'position': 'fixed',
            'top':  0,
            'left':  0,
            'width': '100%',
            'height': '100%',
            'display': 'block',
            'opacity': '.8',
            'background': '#FFFFFF',
            'z-index': '99999'
        });
    },

    destroyLoader: function(full) {
        if(full) {
            $('pleaseWaitDialog').remove();
        }
        else {
            if($('loading-quickview-img') != null) {
                $('loading-quickview-img').remove();
            }
            $('pleaseWaitDialog').setStyle({'background-color': '#000000'});
        }
    },

    showButton: function(e) {
        el = this;
        while (el.tagName != 'P') {
            el = el.up();
        }
        $(el).getElementsBySelector('.quickview-ajax')[0].setStyle({
            display: 'block'
        })
    },

    hideButton: function(e) {
        el = this;
        while (el.tagName != 'P') {
            el = el.up();
        }
        $(el).getElementsBySelector('.quickview-ajax')[0].setStyle({
            display: 'none'
        })
    },

    createWindow: function() {
        var qWindow = new Element('div', {id: 'quick-window'});
        qWindow.innerHTML = '
'; document.body.appendChild(qWindow); $('quickview-close').setStyle({ 'padding-right': "20px", 'padding-left': "20px" }); $('quickview-close').observe('click', this.hideWindow.bind(this)); }, showWindow: function() { var screenWidth, offsetTopModal; if(document.body.clientWidth > 1400) { screenWidth = 1400; offsetTopModal = 100; } else { if(document.body.clientWidth <768) { screenWidth = document.body.clientWidth; offsetTopModal = 0; } else { screenWidth = document.body.clientWidth * 0.8; offsetTopModal = 100; } } var windowWidth = screenWidth; $('quick-window').setStyle({ 'top': document.viewport.getScrollOffsets().top + offsetTopModal + 'px', 'left': document.body.clientWidth/2 - windowWidth/2 + 'px', 'display': 'block', 'position': 'absolute', 'width': windowWidth + 'px', 'background': '#FFFFFF', 'padding': '20px 0px', 'margin-bottom': '20px', 'border': '1px solid #F0F0F0', 'z-index': '999999', 'border-radius': '4px' }); $('pleaseWaitDialog').observe('click', this.hideWindow.bind(this)); this.resizeIframe($(this.idframe)); }, setContent: function(srcUrl) { var optiOns= { id: this.idframe, frameborder: "0", scrolling: "no", src: srcUrl, hspace: "0", name: this.idframe+(new Date().getTime()), width: "100%" }; var frame = new Element('iframe', options); $$('.quick-view-content')[0].insert(frame); }, clearContent: function() { $$('.quick-view-content')[0].replace('
'); }, hideWindow: function() { this.clearContent(); this.destroyLoader(true); $('quick-window').hide(); }, loadInfo: function(e) { e.stop(); var that = this; this.createLoader(); this.clearContent(); this.setContent(e.element().href); Event.observe($(this.idframe), 'load', function() { window.quickview.completeInfo(); setTimeout(function () { window.quickview.resizeIframe($(this.idframe)); },500); }); }, completeInfo: function () { this.destroyLoader(false); this.showWindow(); }, resizeIframe: function(obj) { if(obj) { obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px'; obj.style.width = "100%"; } } } Event.observe(window, 'load', function() { window.quickview = new ProductInfo('.quickview-ajax', '.product-image', { }); });

我认为它不相关,但应用程序是Magento 1.9.3.9,所以我使用原型作为js框架(来自Magento).

一个奇怪的事实,如果我使用右键通过浏览器更新框架并使用鼠标请求"刷新框架",iframe会正确更新并且内容Javascript正确加载.

更新:

通过执行一些测试,我注意到第一次加载iframe时,iframe中的js中检测到iframe的宽度.但在创建和插入的其他时间,宽度被检测为零.测试下面:

//First open
console.log(document.documentElement.clientWidth);
//output: 1356

//Second open
console.log(document.documentElement.clientWidth);
//output: 0

OwlCarousel2做了一个抛出(更多细节见https://github.com/OwlCarousel2/OwlCarousel2/issues/1704),我认为de JS停止了例外.

Owl.prototype.viewport = function() {
    var width;
    if (this.options.responsiveBaseElement !== window) {
        width = $(this.options.responsiveBaseElement).width();
    } else if (window.innerWidth) {
        width = window.innerWidth;
    } else if (document.documentElement && document.documentElement.clientWidth) {
        width = document.documentElement.clientWidth;
    } else {
        throw 'Can not detect viewport width.';
    }
    return width;
};

即使我更改了OwlCarousel2(最新版本没有抛出),我相信宽度被错误检测的事实会产生其他几个问题.我还通过始终创建100%宽的iframe来更新iframe,但问题仍然存在.


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
author-avatar
手机用户2602914293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有