Added support for events, made window.location Async (and based upon XHR), added trigger for window.onload.

This commit is contained in:
John Resig 2007-07-09 16:14:19 +00:00
parent d776dc9d5c
commit 0bb035a1ab
2 changed files with 115 additions and 30 deletions

View file

@ -20,18 +20,29 @@ var window = this;
var curLocation = (new java.io.File("./")).toURL();
window.__defineSetter__("location", function(url){
curLocation = new java.net.URL( curLocation, url );
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onreadystatechange = function(){
curLocation = new java.net.URL( curLocation, url );
window.document = xhr.responseXML;
window.document = new DOMDocument(
new Packages.org.xml.sax.InputSource(
new java.io.InputStreamReader(
new java.io.FileInputStream( url ))));
var event = document.createEvent();
event.initEvent("load");
window.dispatchEvent( event );
};
xhr.send();
});
window.__defineGetter__("location", function(url){
return {
get protocol(){
return curLocation.getProtocol() + ":";
},
get href(){
return curLocation.toString();
},
toString: function(){
return this.href;
}
};
});
@ -74,8 +85,50 @@ var window = this;
// Window Events
window.addEventListener = function(){};
window.removeEventListener = function(){};
var events = [{}];
window.addEventListener = function(type, fn){
if ( !this.uuid || this == window ) {
this.uuid = events.length;
events[this.uuid] = {};
}
if ( !events[this.uuid][type] )
events[this.uuid][type] = [];
if ( events[this.uuid][type].indexOf( fn ) < 0 )
events[this.uuid][type].push( fn );
};
window.removeEventListener = function(type, fn){
if ( !this.uuid || this == window ) {
this.uuid = events.length;
events[this.uuid] = {};
}
if ( !events[this.uuid][type] )
events[this.uuid][type] = [];
events[this.uuid][type] =
events[this.uuid][type].filter(function(f){
return f != fn;
});
};
window.dispatchEvent = function(event){
if ( event.type ) {
if ( this.uuid && events[this.uuid][event.type] ) {
var self = this;
events[this.uuid][event.type].forEach(function(fn){
fn.call( self, event );
});
}
if ( this["on" + event.type] )
this["on" + event.type].call( self, event );
}
};
// DOM Document
@ -121,8 +174,9 @@ var window = this;
get ownerDocument(){
return null;
},
addEventListener: function(){},
removeEventListener: function(){},
addEventListener: window.addEventListener,
removeEventListener: window.removeEventListener,
dispatchEvent: window.dispatchEvent,
get nodeName() {
return "#document";
},
@ -152,6 +206,15 @@ var window = this;
};
}
};
},
createEvent: function(){
return {
type: "",
initEvent: function(type){
this.type = type;
}
};
}
};
@ -411,12 +474,31 @@ var window = this;
},
getElementsByTagName: DOMDocument.prototype.getElementsByTagName,
addEventListener: function(){},
removeEventListener: function(){},
click: function(){},
submit: function(){},
focus: function(){},
blur: function(){},
addEventListener: window.addEventListener,
removeEventListener: window.removeEventListener,
dispatchEvent: window.dispatchEvent,
click: function(){
var event = document.createEvent();
event.initEvent("click");
this.dispatchEvent(event);
},
submit: function(){
var event = document.createEvent();
event.initEvent("submit");
this.dispatchEvent(event);
},
focus: function(){
var event = document.createEvent();
event.initEvent("focus");
this.dispatchEvent(event);
},
blur: function(){
var event = document.createEvent();
event.initEvent("blur");
this.dispatchEvent(event);
},
get elements(){
return this.getElementsByTagName("*");
},

View file

@ -1,18 +1,21 @@
// Init
load("build/runtest/env.js");
window.location = "test/index.html";
// Load the test runner
load("dist/jquery.js","build/runtest/testrunner.js");
window.onload = function(){
// Load the test runner
load("dist/jquery.js","build/runtest/testrunner.js");
// Load the tests
load(
"src/jquery/coreTest.js",
"src/selector/selectorTest.js",
"src/event/eventTest.js",
"src/fx/fxTest.js"
//"src/ajax/ajaxTest.js"
);
// Load the tests
load(
"src/jquery/coreTest.js",
"src/selector/selectorTest.js",
"src/event/eventTest.js",
"src/fx/fxTest.js"
//"src/ajax/ajaxTest.js"
);
// Display the results
results();
// Display the results
results();
};