在模态中有一个用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 = '<div id="quickview-header" style="width: 100%; text-align: right;"><a href="javascript:void(0)" id="quickview-close"><i class="glyphicon glyphicon-remove"></i></a></div><div class="quick-view-content"></div>'; 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','position': 'absolute','width': windowWidth + 'px','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('<div class="quick-view-content"></div>'); },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,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,但问题仍然存在.
解决方法
Cache-Control: no-cache,no-store,must-revalidate Pragma: no-cache Expires: 0
您还可以使用以下命令强制执行iframe刷新:
iframe.contentWindow.location.reload(true);
更新
var nameOrIndex = 'nameOrIndex'; // i.e. 'my_iframe' or '0' var iFrame = window.frames[nameOrIndex]; if (iFrame) { var document = iFrame.contentDocument ? iFrame.contentDocument : iFrame.contentWindow ? iFrame.contentWindow.document : iFrame.document; if (document && document.location) { document.location.reload(true); // 1 (sandBoxing,same domain origin policy) document.location.href = document.location.href; // 2 (cross domain,might detect size changes) } if (iFrame.src) { window.frames[nameOrIndex].src = iFrame.src; // 3 (cross domain,might detect size changes) } $(iFrame).replaceWith($(iFrame).clone()); // 4 (cross domain,might detect size changes) }
但是,关于你的尺寸问题请看这个SO question