fix($browser.addJs): make addJs jQuery compatible

Change addJs implementation to avoid use of jQuery because of issues
that affect angular-ie-compat.js. See inlined comment for more info.
This commit is contained in:
Igor Minar 2011-07-12 00:44:18 -07:00
parent c52e749a6e
commit 47efe44a1d
2 changed files with 41 additions and 7 deletions

View file

@ -416,16 +416,26 @@ function Browser(window, document, body, XHR, $log) {
* @methodOf angular.service.$browser
*
* @param {string} url Url to js file
* @param {string=} dom_id Optional id for the script tag
* @param {string=} domId Optional id for the script tag
*
* @description
* Adds a script tag to the head.
*/
self.addJs = function(url, dom_id) {
var script = jqLite(rawDocument.createElement('script'));
script.attr('type', 'text/javascript');
script.attr('src', url);
if (dom_id) script.attr('id', dom_id);
body.append(script);
self.addJs = function(url, domId) {
// we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
// - fetches local scripts via XHR and evals them
// - adds and immediately removes script elements from the document
//
// We need addJs to be able to add angular-ie-compat.js which is very special and must remain
// part of the DOM so that the embedded images can reference it. jQuery's append implementation
// (v1.4.2) fubars it.
var script = rawDocument.createElement('script');
script.type = 'text/javascript';
script.src = url;
if (domId) script.id = domId;
body[0].appendChild(script);
return script;
};
}

View file

@ -505,4 +505,28 @@ describe('browser', function(){
});
});
});
describe('addJs', function() {
it('should append a script tag to body', function() {
browser.addJs('http://localhost/bar.js');
expect(scripts.length).toBe(1);
expect(scripts[0].src).toBe('http://localhost/bar.js');
expect(scripts[0].id).toBe('');
});
it('should append a script with an id to body', function() {
browser.addJs('http://localhost/bar.js', 'foo-id');
expect(scripts.length).toBe(1);
expect(scripts[0].src).toBe('http://localhost/bar.js');
expect(scripts[0].id).toBe('foo-id');
});
it('should return the appended script element', function() {
var script = browser.addJs('http://localhost/bar.js');
expect(script).toBe(scripts[0]);
});
});
});