jquery - usando Simplemodal, muestra cargar spinner mientras el contenido dentro de iframe carga
loading (3)
Estoy usando una versión ligeramente extendida de spin.js para hermosos spinners y overlays modales spinner. Se puede usar en cualquier elemento simplemente:
$(''#ELEMENT_ID'').spin()
o para hilanderos modales:
$(''#ELEMENT_ID'').spin("modal")
Llame de nuevo a girar para apagar y extraer la ruleta de nuevo. Así es como esto luce:
Este es el spin.min.js que incluye una extensión jQuery y algunos opts predeterminados para spinners modales:
//fgnass.github.com/spin.js#v1.2.6
!function(e,t,n){function o(e,n){var r=t.createElement(e||"div"),i;for(i in n)r[i]=n[i];return r}function u(e){for(var t=1,n=arguments.length;t<n;t++)e.appendChild(arguments[t]);return e}function f(e,t,n,r){var o=["opacity",t,~~(e*100),n,r].join("-"),u=.01+n/r*100,f=Math.max(1-(1-e)/t*(100-u),e),l=s.substring(0,s.indexOf("Animation")).toLowerCase(),c=l&&"-"+l+"-"||"";return i[o]||(a.insertRule("@"+c+"keyframes "+o+"{"+"0%{opacity:"+f+"}"+u+"%{opacity:"+e+"}"+(u+.01)+"%{opacity:1}"+(u+t)%100+"%{opacity:"+e+"}"+"100%{opacity:"+f+"}"+"}",a.cssRules.length),i[o]=1),o}function l(e,t){var i=e.style,s,o;if(i[t]!==n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(o=0;o<r.length;o++){s=r[o]+t;if(i[s]!==n)return s}}function c(e,t){for(var n in t)e.style[l(e,n)||n]=t[n];return e}function h(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)e[i]===n&&(e[i]=r[i])}return e}function p(e){var t={x:e.offsetLeft,y:e.offsetTop};while(e=e.offsetParent)t.x+=e.offsetLeft,t.y+=e.offsetTop;return t}var r=["webkit","Moz","ms","O"],i={},s,a=function(){var e=o("style",{type:"text/css"});return u(t.getElementsByTagName("head")[0],e),e.sheet||e.styleSheet}(),d={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto"},v=function m(e){if(!this.spin)return new m(e);this.opts=h(e||{},m.defaults,d)};v.defaults={},h(v.prototype,{spin:function(e){this.stop();var t=this,n=t.opts,r=t.el=c(o(0,{className:n.className}),{position:"relative",width:0,zIndex:n.zIndex}),i=n.radius+n.length+n.width,u,a;e&&(e.insertBefore(r,e.firstChild||null),a=p(e),u=p(r),c(r,{left:(n.left=="auto"?a.x-u.x+(e.offsetWidth>>1):parseInt(n.left,10)+i)+"px",top:(n.top=="auto"?a.y-u.y+(e.offsetHeight>>1):parseInt(n.top,10)+i)+"px"})),r.setAttribute("aria-role","progressbar"),t.lines(r,t.opts);if(!s){var f=0,l=n.fps,h=l/n.speed,d=(1-n.opacity)/(h*n.trail/100),v=h/n.lines;(function m(){f++;for(var e=n.lines;e;e--){var i=Math.max(1-(f+e*v)%h*d,n.opacity);t.opacity(r,n.lines-e,i,n)}t.timeout=t.el&&setTimeout(m,~~(1e3/l))})()}return t},stop:function(){var e=this.el;return e&&(clearTimeout(this.timeout),e.parentNode&&e.parentNode.removeChild(e),this.el=n),this},lines:function(e,t){function i(e,r){return c(o(),{position:"absolute",width:t.length+t.width+"px",height:t.width+"px",background:e,boxShadow:r,transformOrigin:"left",transform:"rotate("+~~(360/t.lines*n+t.rotate)+"deg) translate("+t.radius+"px"+",0)",borderRadius:(t.corners*t.width>>1)+"px"})}var n=0,r;for(;n<t.lines;n++)r=c(o(),{position:"absolute",top:1+~(t.width/2)+"px",transform:t.hwaccel?"translate3d(0,0,0)":"",opacity:t.opacity,animation:s&&f(t.opacity,t.trail,n,t.lines)+" "+1/t.speed+"s linear infinite"}),t.shadow&&u(r,c(i("#000","0 0 4px #000"),{top:"2px"})),u(e,u(r,i(t.color,"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(e,t,n){t<e.childNodes.length&&(e.childNodes[t].style.opacity=n)}}),function(){function e(e,t){return o("<"+e+'' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">'',t)}var t=c(o("group"),{behavior:"url(#default#VML)"});!l(t,"transform")&&t.adj?(a.addRule(".spin-vml","behavior:url(#default#VML)"),v.prototype.lines=function(t,n){function s(){return c(e("group",{coordsize:i+" "+i,coordorigin:-r+" "+ -r}),{width:i,height:i})}function l(t,i,o){u(a,u(c(s(),{rotation:360/n.lines*t+"deg",left:~~i}),u(c(e("roundrect",{arcsize:n.corners}),{width:r,height:n.width,left:n.radius,top:-n.width>>1,filter:o}),e("fill",{color:n.color,opacity:n.opacity}),e("stroke",{opacity:0}))))}var r=n.length+n.width,i=2*r,o=-(n.width+n.length)*2+"px",a=c(s(),{position:"absolute",top:o,left:o}),f;if(n.shadow)for(f=1;f<=n.lines;f++)l(f,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(f=1;f<=n.lines;f++)l(f);return u(t,a)},v.prototype.opacity=function(e,t,n,r){var i=e.firstChild;r=r.shadow&&r.lines||0,i&&t+r<i.childNodes.length&&(i=i.childNodes[t+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}):s=l(t,"animation")}(),typeof define=="function"&&define.amd?define(function(){return v}):e.Spinner=v}(window,document);
var default_opts = {
lines: 9,
length: 2,
width: 3,
radius: 8,
corners: 1,
rotate: 0,
color: ''#555'',
speed: 1,
trail: 47,
shadow: false,
hwaccel: false,
className: ''spinner'',
zIndex: 2e9,
top: ''auto'',
left: ''auto''
};
var modal_opts = {
lines: 11, // The number of lines to draw
length: 23, // The length of each line
width: 8, // The line thickness
radius: 40, // The radius of the inner circle
corners: 1, // Corner roundness (0..1)
rotate: 9, // The rotation offset
color: ''#FFF'', // #rgb or #rrggbb
speed: 1, // Rounds per second
trail: 50, // Afterglow percentage
shadow: true, // Whether to render a shadow
hwaccel: false, // Whether to use hardware acceleration
className: ''spinner'', // The CSS class to assign to the spinner
zIndex: 2e9, // The z-index (defaults to 2000000000)
top: ''auto'', // Top position relative to parent in px
left: ''auto'' // Left position relative to parent in px
};
//jQuery extension
$.fn.spin = function(opts) {
if (opts == null) opts = default_opts;
if (opts == "modal") opts = modal_opts;
this.each(function() {
var $this = $(this),
data = $this.data();
if (data.spinner) {
data.spinner.stop();
delete data.spinner;
if (opts == modal_opts) $("#spin_modal_overlay").remove();
return this;
}
var spinElem = this;
if (opts == modal_opts){
$(''body'').append(''<div id="spin_modal_overlay" style="background-color: rgba(0, 0, 0, 0.6); width:100%; height:100%; position:fixed; top:0px; left:0px; z-index:''+(opts.zIndex-1)+''"/>'');
spinElem = $("#spin_modal_overlay")[0];
}
data.spinner = new Spinner($.extend({color: $this.css(''color'')}, opts)).spin(spinElem);
});
return this;
};
¡Buenos días!
Estoy usando el gran plugin de SimpleModal para jQuery de Eric Martin. Actualmente, estoy cargando un modal usando un iframe para cargar mis páginas solicitadas que funciona como se esperaba. Lo que me gustaría implementar es un icono de carga ... que se muestra mientras se carga el contenido.
Estoy cargando mi modal de la siguiente manera:
jQuery(function ($) {
// Load dialog on click
$(''.basic'').click(function (e) {
var src = "http://localhost" + $(this).attr("href");
$.modal(''<iframe id="details" class="so" src="'' + src + ''" height="500" width="500" style="border:0">'', {
closeHTML: "<a title=''Close'' class=''modalCloseImg simplemodal-close''></a>",
containerId: "simplemodal-container",
overlayId: "simplemodal-overlay",
overlayClose: true
});
return false;
});
});
Tengo una imagen de fondo configurada para mi contenedor modal, que se muestra de inmediato. Definitivamente preferiría mostrar un spinner de carga aquí también.
La respuesta simple para esto es usar una carga () y luego colocar el código para el modal en la devolución de llamada de la carga. Aquí hay un ejemplo, pseudo-código -
$(''.basic'').click(function (e) {
e.preventDefault() // use instead of return false
var src = "http://localhost" + $(this).attr("href");
$(''iframe details'').load(''loading.html'', function() {
$.modal(''<iframe id="det....
De esta forma, el iFrame carga la página que contiene la imagen inmediatamente y luego la modal.
Pude resolver esto insertando un div de carga dentro de la fuente simplemodal y luego llamando a show / hide según mi código.