diff options
| author | Misko Hevery | 2012-03-12 16:49:28 -0700 |
|---|---|---|
| committer | Misko Hevery | 2012-03-12 21:59:50 -0700 |
| commit | 48096048cf92bcada9b8c4f54d7002fbcf239416 (patch) | |
| tree | b41a4354fbdb9583686521e5c4ffe0a6eaed48c2 /src/service/compiler.js | |
| parent | 317adb36a480c60f41b6f69bc67d66fe1b08bdae (diff) | |
| download | angular.js-48096048cf92bcada9b8c4f54d7002fbcf239416.tar.bz2 | |
fix(svg): normalize class access for SVG
Diffstat (limited to 'src/service/compiler.js')
| -rw-r--r-- | src/service/compiler.js | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/service/compiler.js b/src/service/compiler.js index 5fb9035d..d23fd6e5 100644 --- a/src/service/compiler.js +++ b/src/service/compiler.js @@ -247,7 +247,7 @@ function $CompileProvider($provide) { var element = cloneConnectFn ? JQLitePrototype.clone.call(templateElement) // IMPORTANT!!! : templateElement; - element.data('$scope', scope).addClass('ng-scope'); + safeAddClass(element.data('$scope', scope), 'ng-scope'); if (cloneConnectFn) cloneConnectFn(element, scope); if (linkingFn) linkingFn(scope, element, element); return element; @@ -258,6 +258,15 @@ function $CompileProvider($provide) { throw Error("Unsupported '" + mode + "' for '" + localName + "'."); } + function safeAddClass(element, className) { + try { + element.addClass(className); + } catch(e) { + // ignore, since it means that we are trying to set class on + // SVG element, where class name is read-only. + } + } + /** * Compile function matches each node in nodeList against the directives. Once all directives * for a particular node are collected their compile functions are executed. The compile @@ -387,12 +396,14 @@ function $CompileProvider($provide) { // use class as directive className = node.className; - while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { - nName = directiveNormalize(match[2]); - if (addDirective(directives, nName, 'C', maxPriority)) { - attrs[nName] = trim(match[3]); + if (isString(className)) { + while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) { + nName = directiveNormalize(match[2]); + if (addDirective(directives, nName, 'C', maxPriority)) { + attrs[nName] = trim(match[3]); + } + className = className.substr(match.index + match[0].length); } - className = className.substr(match.index + match[0].length); } break; case 3: /* Text Node */ @@ -459,10 +470,10 @@ function $CompileProvider($provide) { if (directiveValue = directive.scope) { assertNoDuplicate('isolated scope', newIsolatedScopeDirective, directive, element); if (isObject(directiveValue)) { - element.addClass('ng-isolate-scope'); + safeAddClass(element, 'ng-isolate-scope'); newIsolatedScopeDirective = directive; } - element.addClass('ng-scope'); + safeAddClass(element, 'ng-scope'); newScopeDirective = newScopeDirective || directive; } @@ -725,7 +736,7 @@ function $CompileProvider($provide) { // copy the new attributes on the old attrs object forEach(src, function(value, key) { if (key == 'class') { - element.addClass(value); + safeAddClass(element, value); } else if (key == 'style') { element.attr('style', element.attr('style') + ';' + value); } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) { @@ -837,7 +848,7 @@ function $CompileProvider($provide) { var parent = node.parent(), bindings = parent.data('$binding') || []; bindings.push(interpolateFn); - parent.data('$binding', bindings).addClass('ng-binding'); + safeAddClass(parent.data('$binding', bindings), 'ng-binding'); scope.$watch(interpolateFn, function(value) { node[0].nodeValue = value; }); |
