diff --git a/specs/html/spec.js b/specs/html/spec.js
index ff6a19f0..23fe315a 100644
--- a/specs/html/spec.js
+++ b/specs/html/spec.js
@@ -859,3 +859,28 @@ test("Option", function() {
x = new Option('text1', 'value1');
x = new Option('text2', 'value2', true, true);
});
+
+test("Event Handlers Defined", function() {
+ var a=document.createElement("a");
+ ok(a["onfocus"], "html events defined");
+ ok(a["onclick"], "mouse events defined");
+ ok(a["onkeydown"], "keyboard events defined");
+});
+
+test("Event Handlers Invoked on Inline Attributes", function() {
+ try {
+ // enable eval of inline scripts for the duration of this test
+ Envjs.scriptTypes[""]=true;
+
+ var a=document.createElement("a");
+ ok(a, "created anchor tag");
+ a.setAttribute("onclick", "ok(true,'event invoked on an inline handler');");
+
+ var event = document.createEvent('MouseEvents');
+ ok(event, "created event");
+ event.initEvent('click', true, true);
+ a.dispatchEvent(event);
+ } finally {
+ Envjs.scriptTypes[""]=false;
+ }
+});
diff --git a/src/event/eventtarget.js b/src/event/eventtarget.js
index 2afc0369..e31d5162 100644
--- a/src/event/eventtarget.js
+++ b/src/event/eventtarget.js
@@ -120,7 +120,10 @@ function __dispatchEvent__(target, event, bubbles){
});
}
if (target["on" + event.type]) {
- target["on" + event.type](event);
+ var returnValue=target["on" + event.type](event);
+ if (returnValue === false) {
+ event.preventDefault();
+ }
}
if (bubbles && !event.cancelled){
__bubbleEvent__(target, event);
diff --git a/src/html/element.js b/src/html/element.js
index 8f992c92..d17e76d7 100644
--- a/src/html/element.js
+++ b/src/html/element.js
@@ -41,6 +41,8 @@ HTMLElement = function(ownerDocument) {
HTMLElement.prototype = new Element();
__extend__(HTMLElement.prototype, HTMLEvents.prototype);
+__extend__(HTMLElement.prototype, MouseEvents.prototype);
+__extend__(HTMLElement.prototype, KeyboardEvents.prototype);
__extend__(HTMLElement.prototype, {
get className() {
return this.getAttribute("class")||'';
diff --git a/src/html/htmlevents.js b/src/html/htmlevents.js
index 57f73803..c690638d 100644
--- a/src/html/htmlevents.js
+++ b/src/html/htmlevents.js
@@ -9,7 +9,10 @@ var __eval__ = function(script, node){
if (!script == "" && Envjs.scriptTypes['']){
// don't assemble environment if no script...
try{
- Envjs.eval(node.ownerDocument.ownerWindow, script, script+" ("+node+")");
+ // wrap the inline handler in a double enclosure so we can correctly handle the return value
+ // otherwise we get "error evaluating InternalError: invalid return"
+ var exec="(function(){var result=(function(){"+script+"})(); return result;})()";
+ Envjs.eval(node.ownerDocument.ownerWindow, exec, script+" ("+node+")");
}catch(e){
console.log('error evaluating %s', e);
}