Hello all,
I found no solution yet to the CSS insertion.
Has anybody faced the same problem?
Is there a better/simpler approach?
Thanks in advance

On 24 mar, 16:16, xPheRe <xpher...@gmail.com> wrote:
> Hello all jQuery people.
> This is my first post in this list but I hope I can make sense with my
> question.
>
> Currently I'm developing some web applications for internal use,
> porting some old ones.
> I'd love the jQuery-way to do asynchronous requests, so I developed a
> plugin similar to Pimentech jFrame. Basicly, it "automagically"
> catches all clicks on links, sends an AJAH request and loads the
> response  inside a container.
>
> The problem came when the response contains STYLE or LINK tags. Using
> Firefox and Opera all was perfect, but no style was applied with IE6,
> IE7, Chrome or Safari. I was thinking that was my plugin's fault, but
> when I test the use case without it, the problem remains. No style
> applied.
>
> Check this simplified case without even jQuery:
>
> <body>
>         <p id="test">This is a test and should have a border around and 1ex
> padding!</p>
>         <script type="text/javascript">
>                 var div = document.createElement('div');
>                 // <br/> added to avoid a bug in IE
>                 div.innerHTML = '<br /><style>#test { border:2px solid #000; 
> padding:
> 1ex; }</style>';
>                 var span = div.getElementsByTagName('span')[0];
>                 document.body.appendChild(div);
>         </script>
> </body>
>
> I thought that jQuery have workarounds to this, but I found none, so I
> created a plugin to do the work.
> In case I missed some jQuery functionality, please tell me. I prefer
> the jQuery way.
>
> This plugin relies on detecting whether inlined styles are processed
> or not. If not, modify $.fn.html to move all style's and link's to
> document.head, mark them with a 'data-style-loader' attribute and
> adding a dummy link to the target. When te dummy link is removed (with
> the same $.fn.html function), it removes all related style's and
> link's from head.
>
> Well, that's the code:
>
> $(function($) {
>
>         // Checks for some supported features
>         (function() {
>                 var div = document.createElement('div');
>                 div.id = 'jquery-support-styled';
>                 document.body.appendChild(div);
>
>                 // Checks whether inlined styles applies automaticly (Firefox 
> and
> Opera returns true)
>                 div.innerHTML = '<style>#'+div.id+' span { display:block; 
> width:
> 3px; }</style><span />';
>                 var span = div.getElementsByTagName('span')[0];
>                 $.support.inlineStyleApplies = $(span).width() == 3;
>
>                 // Checks whether inlined styles applies if they are inside 
> 'br'
> context (for IE)
>                 $.support.mustPrependBrToInlineStyles = !
> $.support.inlineStyleApplies && (function(){
>                         div.innerHTML = '<br /><style>#'+div.id+' span { 
> display:block;
> width:5px; }</style><span />';
>                         var span = div.getElementsByTagName('span')[0];
>                         return ($.support.inlineStyleApplies = 
> $(span).width() == 5);
>                 })();
>                 document.body.removeChild(div);
>         })();
>
>         // Saves old $().html function
>         var old_html = $.fn.html;
>
>         if($.support.mustPrependBrToInlineStyles) {
>                 // Modify old $().html to add br before styles and links
>                 $.fn.html = function(_value) {
>                         if(typeof _value !== 'string') {
>                                 _value = _value.replace(/<style|<link/gi, 
> function(_text) {
>                                         return '<br 
> style="display:none"/>'+_text
>                                 })
>                         }
>                         return old_html.call(this, _value);
>                 }
>
>         } else if(!$.support.inlineStyleApplies) {
>                 // Change old $().html to move link´s and style´s to the head
>                 $.fn.html = function(_text) {
>                         // Remove css-pointers and their pointees
>                         var $styles = this.find('link[data-style-loader]');
>                         if($styles.length) { clean_css($styles); }
>                         // Calls old $().html
>                         old_html.call(this, _text);
>                         // Promote new links and styles to document.head
>                         $styles = this.find('style,link[rel*=stylesheet]');
>                         if($styles.length) { add_styles.call(this, $styles) }
>                         return this;
>                 }
>
>                 // Remove css-pointers and their pointees
>                 function        clean_css(_$styles) {
>                         // Get pointees id
>                         var st = [];
>                         for(var i = 0; i < _$styles.length; ++i) {
>                                 st[st.length] = 
> '[data-style-loader='+$(_$styles[i]).attr('data-
> style-loader')+']'
>                         }
>                         // Remove all links pointed
>                         $('head').find(st.join(', ')).remove();
>                 }
>
>                 // Promote new links and styles to document.head
>                 function        add_styles(_$styles) {
>                         // Selects a pointer id
>                         var tm = (new Date).getTime();
>                         // Move to head and add attribute with pointer id
>                         _$styles.attr('data-style-loader', 
> tm).appendTo('head')
>                         // Create a pointer (link inside target) that points 
> to the new
> links and styles
>                         this.append('<link data-style-loader='+tm+' />')
>                 }
>         }
>
> })
>
> I have tested the plugin with these cases:
> 1) <p>Default, no style</p>
> 2) <style type="text/css">#test { color:red; }</style>
> 3) <link rel="stylesheet" href="remote.css" /> and remote.css #test
> { color:red; }
> 4) <style type="text/css">@import url("remote.css")</style>
> 5) <link rel="stylesheet" href="import.css" /> and import.css @import
> url("remote.css")
>
> The plugin works ok with some exceptions.
> In IE6 and IE7, case 4 fails silently. Surprisingly, 5 is no problem.
> In Safari and Chrome, the style isn't removed when loading 1) after 3)
> or 5). After 2) or 4) it works ok.
>
> So, any suggestions? I hope that jQuery has something on those lines.
>
> Thanks all for reading, and sorry for the long post.
> And thanks to the jQuery Team for such a marvelous tool!
> Best regards!

Reply via email to