An invalid DOM is unpredictable and difficult to work around. I would think
that the hang up would probably be in jQuery.clean but I'm not positive.
Perhaps there is a better way to handle limiting the amount of information
within the clue tip. Maybe use CSS to set overflow: hidden along with a set
width/height (maybe a max width/height). Actually I think there is a
truncate plugin ... yup, there is (http://www.reindel.com/truncate/). I'm
not sure if that helps or not.

--
Brandon Aaron

On 9/22/07, Pops <[EMAIL PROTECTED]> wrote:
>
>
> Hi Brandon,
>
> Maybe you can assist here as well.
>
> What started this was finding jQuery, actually the jQuery.ClueTip.js
> plugin hanging the browser to the point of ending the task.  During
> the investigation and isolating the code to the testFilter() function,
> I found the other .not issue.
>
> Karl and I are not sure at this point, if this a jQuery .not issue or
> a bug with the plugin.
>
> The bug manifest itselft when there is a missing end tag, like </div>
> in a content.  It does not show up with the testFilter()
>
> jQuery.fn.sanitize = function(t) {
>      return $(this).find('*').andSelf()
>             .filter( function() {
>                 var $this = $(this);
>                 if ( $this.is(t) ) {
>                     // remove the element from the DOM
>                     $this.remove();
>                     // remove the element from the jQuery collection
>                     return false;
>                 }
>                 // Otherwise keep the element in the jQuery collection
>                 return true;
>             });
>    };
>
> //<!--
> function testFilter()
> {
>   var s = "";
>   s = "";
>   s += "<div style='border: 2px solid silver;'>";
>   s += "Hi there!";
>   s += "<img src='http://www.santronics.com/images/
> WINSbox-120x120.gif'/>";
>   s += "<hr style='background: green; height: 10px;'/>";
>   s += "<script>$('body').append('<button>foobar2</button>');</
> script>";
>   //s += "</div>";
>
>   s = $(s).sanitize('script, hr, img');
>   $("#wcResult").html(s);
> }
> //-->
> </script>
>
> The cluetip used something like this to sanitize the data:
>
>   $('a.basic1').cluetip({
>         ajaxProcess: function(data) {
>         data = $(data).not('style, meta, link, script, title, hr,
> img');
>         return data;
>       }
>   });
>
> If the data had a missing </div>, it would hang the browser.
>
> Commenting out the line:
>
>   data = $(data).not('style, meta, link, script, title, hr, img');
>
> avoided the problem.   This is what lead me to the other issue.
>
> Now I tried to use your logic:
>
>   $('a.basic1').cluetip({
>         ajaxProcess: function(data) {
>         data = $(data).sanitize("script, img");
>         return data;
>       }
>   });
>
> and the same thing happens - the browser hangs.
>
> Again, it only happens if there is a missing end tag, which in this
> case, can happen where there is a truncation for the preview tip
> display.
>
> I was thinking there was a problem with the .multiFilter() which is
> where I spent most of my time in resolving the 2nd filtering issue
> which sanitize() does seem to resolve now.
>
> But that hang up still happens.
>
> I am wonder if you could duplicate this and/or see where there might
> be the problem.
>
> --
> HLS
>
>
>
> On Sep 22, 8:34 pm, "Brandon Aaron" <[EMAIL PROTECTED]> wrote:
> > Oh okay... So, the code is working, it matches only the DIV and appends
> that
> > DIV. However, that DIV still contains the other elements. The .not
> method
> > doesn't actually remove elements from the DOM just from the jQuery
> > collection. I can see how this can be confusing for what you are trying
> to
> > achieve. Instead of using .not try using .filter and passing in a
> function.
> > Maybe like this:
> >
> > s = $(s)
> >         .find('*').andSelf()
> >             .filter( function() {
> >                 var $this = $(this);
> >                 if ( $this.is('script, hr, img') ) {
> >                     // remove the element from the DOM
> >                     $this.remove();
> >                     // remove the element from the jQuery collection
> >                     return false;
> >                 }
> >                 // Otherwise keep the element in the jQuery collection
> >                 return true;
> >             });
> >
> > Hope that helps! :)
> >
> > --
> > Brandon Aaron
> >
> > On 9/22/07, Pops <[EMAIL PROTECTED]> wrote:
> >
> >
> >
> > > Hi Brandon,
> >
> > > Let me try this ....
> >
> > > I'm not seeing it work.  Here is my test code. I tried all 3 methods:
> >
> > > <html>
> > > <head>
> > > <script type='text/javascript' src='/public/js/jquery-1.2.1.js'></
> > > script>
> > > <script>
> > > //<!--
> > > function testFilter()
> > > {
> > >   var s = "";
> > >   s += "<script>$('body').append('<button>foobar1</button>');</
> > > script>";
> > >   s += "<hr style='background: yellow; height: 10px;'/>";
> > >   s += "<img src='http://www.santronics.com/images/
> > > WINSbox-120x120.gif'/>";
> > >   s += "<div style='border: 2px solid silver;'>";
> > >   s += "Hi there!";
> > >   s += "<img src='http://www.santronics.com/images/
> > > WINSbox-120x120.gif'/>";
> > >   s += "<hr style='background: green; height: 10px;'/>";
> > >   s += "<script>$('body').append('<button>foobar2</button>');</
> > > script>";
> > >   s += "</div>";
> > >   s += "<img src='http://www.santronics.com/images/
> > > WINSbox-120x120.gif'/>";
> > >   s += "<hr style='background: cyan; height: 10px;'/>";
> > >   s += "<script>$('body').append('<button>foobar3</button>');</
> > > script>";
> >
> > >   //s = $(s).not('script, hr, img');
> > >   //s = $('*',s).andSelf().not('script, hr, img');
> > >   s = $('*',s).add(s).not('script, hr, img');
> > >   $("#wcResult").html(s);
> > > }
> > > //-->
> > > </script>
> >
> > > </head>
> > > <body>
> >
> > > <button onclick="testFilter();">test filter</button>
> >
> > > <div id="wcResult" style="padding: 10px; border: 1px solid black;">
> > > </div>
> > > </body>
> > > </html>
> >
> > > With all methods,  the top and bottom elements are filtered, but the
> > > elements within the <div> remain.
> >
> > > What am I missing?
> >
> > > BTW, for this real case scenario, my workaround is to use .text(), but
> > > I will need to give people the option to some minimum secured html.
> >
> > > --
> > > HLS
> >
> > > On Sep 22, 1:39 pm, "Brandon Aaron" <[EMAIL PROTECTED]> wrote:
> > > > The .not and .filter methods only run against the matched elements
> > > within
> > > > the jQuery collection. In order to filter all elements you will need
> to
> > > add
> > > > all elements to the collection. I think something like this should
> work
> > > > (untested).
> >
> > > > $('*', data).andSelf().not('style, meta, link, script, title, img');
> >
> > > > andSelf is a jQuery 1.2 method. If you are using an earlier version
> you
> > > > could use $('*', data).add(data)
> >
> > > > --
> > > > Brandon Aaron
> >
> > > > On 9/22/07, Pops <[EMAIL PROTECTED]> wrote:
> >
> > > > > I noticed some example using something like so:
> >
> > > > >   data = $(data).not("style, meta, link, script, title");
> >
> > > > > to filter out thes tags.
> >
> > > > > I tried using this to filter img as well:
> >
> > > > >   data = $(data).not("style, meta, link, script, title, img");
> >
> > > > > and what  I noticed is that this doesn't work if the elements are
> > > > > within other elements.
> >
> > > > > For example, I have this simple example:
> >
> > > > >   <img src="1">
> > > > >   <div>
> > > > >      <img src="2">
> > > > >   </div>
> > > > >   <img src="3">
> >
> > > > > In this case, only img 1 and 3 will be filtered out. img 2 will
> > > > > remain.
> >
> > > > > I am wondering if that is proper behavior for .not(elements)?
> >
> > > > > My goal is to filter all elements regardless of node or branch
> > > > > depth.
> >
> > > > > Thanks
> >
> > > > > --
> > > > > HLS
>
>

Reply via email to