Side navigation
#979 closed bug (fixed)
Opened February 19, 2007 07:33PM UTC
Closed February 25, 2007 01:29PM UTC
Last modified June 21, 2007 04:26AM UTC
Metadata: class metadata breaks removeClass in Opera
Reported by: | joern | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 1.1.2 |
Component: | plugin | Version: | 1.1.1 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
Opera throws this exception:
JavaScript - http://localhost/plugins/validate/demo-test/validate-demo.html Event thread: submit Error: name: SyntaxError message: Statement on line 1312: RegExp.prototype.compile: syntax error in pattern or string Backtrace: Line 1312 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test(t); Line 1305 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js return ! jQuery.className.has(c, cur); Line 1634 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js if (! inv && fn(elems[i], i) || inv && ! fn(elems[i], i)) Line 1306 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js elem.className = c ? jQuery.grep(elem.className.split(/s+/), (function (cur) { return ! jQuery.className.has(c, cur); } )).join(" ") : ""; Line 2103 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js jQuery.className.remove(this, c); Line 1273 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js if (fn.apply(obj[i], args || [i, obj[i]]) === false) Line 310 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js return jQuery.each(this, fn, args); Line 2118 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js return this.each(n, arguments); Line 328 of linked script http://localhost/plugins/validate/jquery.validate.js $(element).removeClass(this.settings.errorClass); Line 315 of linked script http://localhost/plugins/validate/jquery.validate.js instance.validateElement(this); Line 1273 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js if (fn.apply(obj[i], args || [i, obj[i]]) === false) Line 310 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js return jQuery.each(this, fn, args); Line 316 of linked script http://localhost/plugins/validate/jquery.validate.js this.elements.each((function () { instance.validateElement(this); } )); Line 232 of linked script http://localhost/plugins/validate/jquery.validate.js return validator.validateForm(); Line 2819 of linked script http://localhost/plugins/validate/demo-test/js/jquery.js if (c[j].apply(this, args) === false) At unknown location [statement source code not available]
A test was added to the metadata testsuite:
test("try to add and remove classes on metadata elements", function() { $("#two li").addClass("foobar").addClass("foo bar").removeClass("foobar"); ok( $("#two li").is(".foo") ); ok( $("#two li").is(".bar") ); });
Attachments (0)
Change History (4)
Changed February 21, 2007 04:05AM UTC by comment:1
Changed February 25, 2007 01:12PM UTC by comment:2
component: | ajax → plugin |
---|
Both solutions seem valid. I wonder what would perform better, or if this has any performance impact at all.
Changed February 25, 2007 01:15PM UTC by comment:3
This works in Opera:
has: function( t, c ) { t = t.className || t; c = c.replace(/([.\\+*?[^]$(){}=!<>|:])/g, "\\$1"); return t && new RegExp("(^|\\s)" + c + "(\\s|$)").test( t ); }
Changed February 25, 2007 01:29PM UTC by comment:4
resolution: | → fixed |
---|---|
status: | new → closed |
Fixed in revision [1415].
Perhaps this is because metadata uses JSON syntax and parts of it (namely { : }) are also part of regular expression syntax.
You might want to try something like this:
the second line was inspired by PHP's preg_quote
Another option is to simply dump regular expressions entirely within
jQuery.class.has()
.