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