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); }